[lttng-dev] URCU_CALL_RCU_RT and its implications

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Dec 8 21:46:30 UTC 2016


----- On Dec 8, 2016, at 2:53 PM, lttng-dev <lttng-dev at lists.lttng.org> wrote: 

> All,

> In the documentation for the create_call_rcu_data() call, we have the following
> description of the URCU_CALL_RCU_RT flag:

>> struct call_rcu_data *create_call_rcu_data(unsigned long flags, int
>> cpu_affinity) : Returns a handle that can be passed to the other functions in
>> this list. The flags argument can be zero, or can be URCU_CALL_RCU_RT if the
>> application threads associated with the new callback-invocation thread are to
>> get real-time response from call_rcu() by avoiding the need to call into the
>> kernel to wake up the callback-invocation thread.

> So setting "flags" to 0 will simply use the futex mechanism for wakeups. What
> exactly happens when set to the RT option? Is there something else that needs
> to be configured from the OS side to make the aforementioned option work
> correctly?

No, it's just that the call rcu worker thread will rely on periodic polling 
of the call rcu work queue. 

> I'm asking because we're seeing intermittent issues whereby on application
> startup, the reclamation thread (call_rcu) does exactly one cleanup, but then
> never does it again. We have the URCU_CALL_RCU_RT flag set. Originally, we
> thought it was because the updater was not appropriately registered as a
> reader. But after ensuring that is the case, it still happens in 10% of
> startups.

Which URCU flavor are you using ? You may have a thread stuck as 
being a RCU reader forever, which would cause this kind of issue. 

For instance, unbalanced rcu read-side lock/unlock, or blocking on 
poll() or other while holding a rcu read-side lock, or blocking on 
pthread_join() while holding rcu read-side lock... 

And if you use the QSBR flavor, remember that registered threads 
are by default in read-side. So you need to mark them as explicitly 
"offline" whenever you do any blocking op (e.g. poll(), blocking read(), 
pthread_join....). 

> Lastly, we wonder why it would even work correctly *at all* when we failed to
> register the updater as a reader thread.

I don't understand the context of this question. Can you provide more info ? 

Thanks, 

Mathieu 

> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers 
EfficiOS Inc. 
http://www.efficios.com 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.lttng.org/pipermail/lttng-dev/attachments/20161208/514861c8/attachment.html>


More information about the lttng-dev mailing list