[lttng-dev] [PATCH lttng-ust] Implement LTTNG_UST_BLOCKING_RETRY_TIMEOUT
Jonathan Rajotte Julien
Jonathan.rajotte-julien at efficios.com
Fri Nov 4 14:30:11 UTC 2016
On 2016-11-04 10:25 AM, Philippe Proulx wrote:
> On Fri, Nov 4, 2016 at 10:23 AM, Jonathan Rajotte Julien
> <Jonathan.rajotte-julien at efficios.com> wrote:
>>
>> On 2016-11-04 10:22 AM, Philippe Proulx wrote:
>>> On Fri, Nov 4, 2016 at 10:13 AM, Jonathan Rajotte Julien
>>> <Jonathan.rajotte-julien at efficios.com> wrote:
>>>> Nitpicking:
>>>>
>>>> Should this be RETRY_DELAY_MS since other name scheme use the *_MS suffix
>>>> ?
>>>>
>>>> e.g:
>>>> LTTNG_UST_RING_BUFFER_RETRY_DELAY_MS
>>>> CONFIG_LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS
>>>> timeout_left_ms
>>> Counterexample: LTTNG_UST_REGISTER_TIMEOUT.
>>>
>>> Phil
>>
>> Well we have a problem.
> Why? AFAIK the LTTng env. variables have no _MS suffix.
Was simply kidding regarding inconsistency. Which is not the end of the
world.
Note that this is a #define ... not an env. variable and the define just
before has the _MS suffix ...
Thanks
>
> See <http://lttng.org/man/8/lttng-sessiond/v2.8/#doc-_environment_variables>
> and <http://lttng.org/man/8/lttng-relayd/v2.8/#doc-_environment_variables>.
>
> Phil
>
>> Jonathan
>>
>>>>> /*
>>>>> * Non-static to ensure the compiler does not optimize away the xor.
>>>>> @@ -149,6 +150,14 @@ static struct timer_signal_data timer_signal = {
>>>>> .lock = PTHREAD_MUTEX_INITIALIZER,
>>>>> };
>>>>> +int lttng_ust_blocking_retry_timeout =
>>>>> + CONFIG_LTTNG_UST_DEFAULT_BLOCKING_RETRY_TIMEOUT_MS;
>>>>> +
>>>>> +void lttng_ust_ringbuffer_set_retry_timeout(int timeout)
>>>>> +{
>>>>> + lttng_ust_blocking_retry_timeout = timeout;
>>>>> +}
>>>>> +
>>>>> /**
>>>>> * lib_ring_buffer_reset - Reset ring buffer to initial values.
>>>>> * @buf: Ring buffer.
>>>>> @@ -1985,6 +1994,23 @@ void lib_ring_buffer_switch_slow(struct
>>>>> lttng_ust_lib_ring_buffer *buf, enum swi
>>>>> lib_ring_buffer_switch_old_end(buf, chan, &offsets, tsc,
>>>>> handle);
>>>>> }
>>>>> +static
>>>>> +bool handle_blocking_retry(int *timeout_left_ms)
>>>>> +{
>>>>> + int timeout = *timeout_left_ms, delay;
>>>>> +
>>>>> + if (caa_likely(!timeout))
>>>>> + return false; /* Do not retry, discard event. */
>>>>> + if (timeout < 0) /* Wait forever. */
>>>>> + delay = RETRY_DELAY;
>>>>> + else
>>>>> + delay = min_t(int, timeout, RETRY_DELAY);
>>>>> + (void) poll(NULL, 0, delay);
>>>>> + if (timeout > 0)
>>>>> + *timeout_left_ms -= delay;
>>>>> + return true; /* Retry. */
>>>>> +}
>>>>> +
>>>>> /*
>>>>> * Returns :
>>>>> * 0 if ok
>>>>> @@ -2001,6 +2027,7 @@ int lib_ring_buffer_try_reserve_slow(struct
>>>>> lttng_ust_lib_ring_buffer *buf,
>>>>> const struct lttng_ust_lib_ring_buffer_config *config =
>>>>> &chan->backend.config;
>>>>> struct lttng_ust_shm_handle *handle = ctx->handle;
>>>>> unsigned long reserve_commit_diff, offset_cmp;
>>>>> + int timeout_left_ms = lttng_ust_blocking_retry_timeout;
>>>>> retry:
>>>>> offsets->begin = offset_cmp = v_read(config, &buf->offset);
>>>>> @@ -2083,6 +2110,9 @@ retry:
>>>>> >= chan->backend.buf_size)) {
>>>>> unsigned long nr_lost;
>>>>> + if
>>>>> (handle_blocking_retry(&timeout_left_ms))
>>>>> + goto retry;
>>>>> +
>>>>> /*
>>>>> * We do not overwrite non consumed
>>>>> buffers
>>>>> * and we are full : record is lost.
>>>>
>>>> --
>>>> Jonathan R. Julien
>>>> Efficios
>>>>
>>>>
>>>> _______________________________________________
>>>> lttng-dev mailing list
>>>> lttng-dev at lists.lttng.org
>>>> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
>>
>> --
>> Jonathan R. Julien
>> Efficios
>>
--
Jonathan R. Julien
Efficios
More information about the lttng-dev
mailing list