Mathieu,
Thanks so much for your wealth if information and timely responses, they are 
greatly appreciated. Final question: is there any harm in explicitly calling 
rcu_thread_online/rcu_thread_offline from within my call_rcu callback function? 
From what you described it sounds like it would be redundant, but presumably 
would be harmless. Correct? Thanks again.
Jeff

Sent from my iPhone

> On Apr 15, 2021, at 9:04 AM, Mathieu Desnoyers 
> <mathieu.desnoy...@efficios.com> wrote:
> 
> ----- On Apr 15, 2021, at 8:41 AM, lbj lbj...@yahoo.com wrote:
> 
>> Hi Mathieu,
>> When I say “reclamation thread” I do mean the thread launched by call_rcu 
>> that
>> is typically responsible for memory deallocations. Is is possible/recommended
>> to register for rcu and then take an rcu-reader lock in such a thread? That 
>> is
>> my main question.
>> 
>> As for reader locks being no-ops in QSBR, I read that but dont quite 
>> understand
>> it. Something must be preventing memory reclamation of rcu protected elements
>> when I take that lock.
> 
> Note that a RCU read-side "lock" is really just a marker about the 
> beginning/end
> of a transaction which delays grace periods. We use the name "lock" to match
> the kernel RCU APIs, but it should not be considered as doing any kind of 
> mutual
> exclusion.
> 
>> 
>> My specific situation is: I have a QSBR rcu protected “policy” object (just a
>> regular old C++ object that periodically gets refreshed and must be 
>> atomically
>> updated because worker cores are reading it while spinning, and they cant 
>> slow
>> down). When a new policy is received we invoke call_rcu on the old policy.
>> call_rcu will eventually launch a thread in which the old policy’s resources
>> are reclaimed. In this thread I would like to iterate through another, 
>> separate
>> structure, which is also QSBR rcu protected (a urcu hashtable). To do so
>> safely, presumably I must use an rcu readlock. I just want to make sure such 
>> a
>> scenario is reasonable and at very least not contra-indicated. Thanks!
> 
> If you look at urcu-call-rcu-impl.h, you will notice that call_rcu_thread()
> indeed registers itself as a reader thread.
> 
> So the call-rcu callbacks can indeed take a RCU read-side lock, but for QSBR
> the story does not end there, because due to the nature of QSBR, the read-side
> lock is indeed a no-op, and it relies instead on all registered QSBR reader
> threads to periodically invoke urcu_qsbr_quiescent_state() to report that they
> are in a quiescent state, or invoke urcu_qsbr_thread_offline() if they expect 
> to be
> in a quiescent state for a long period of time (e.g. blocking), followed by
> urcu_qsbr_thread_online().
> 
> And indeed, the call_rcu_thread puts itself in "offline" mode while awaiting 
> for
> grace periods (this is implicitly done within the qsbr synchronize_rcu() 
> implementation)
> and when sleeping.
> 
> So yes, you should be able to have a RCU read-side from within a call-rcu 
> worker
> thread, and it's OK to assume you can do a RCU traversal with the QSBR urcu 
> flavor
> from a call-rcu worker thread as well.
> 
> Thanks,
> 
> Mathieu
> 
>> 
>> Jeff
>> 
>> 
>> 
>> Sent from my iPhone
>> 
>>> On Apr 15, 2021, at 8:20 AM, Mathieu Desnoyers 
>>> <mathieu.desnoy...@efficios.com>
>>> wrote:
>>> 
>>> ----- On Apr 13, 2021, at 11:19 PM, lttng-dev lttng-dev@lists.lttng.org 
>>> wrote:
>>> 
>>>> Hello all,
>>>> 
>>>> I have two different entities that are both protected by QSBR rcu: a 
>>>> policy and
>>>> a hashtable. In the reclamation thread for the policy I would like to take 
>>>> a
>>>> read lock so that I can safely iterate through the hashtable. I dont see
>>>> anything wrong with this, but I just wanted to make sure it was ok since 
>>>> taking
>>>> an rcu read lock in an rcu reclamation thread seems like it may be a bit
>>>> suspect. Thanks for any insights, let me know if clarification is needed!
>>> 
>>> When you say "the reclamation thread for the policy", do you refer to a 
>>> call-rcu
>>> worker thread ?
>>> 
>>> Also, you are aware that RCU read-side lock/unlock are effectively no-ops 
>>> for
>>> QSBR rcu, right ?
>>> 
>>> Thanks,
>>> 
>>> Mathieu
>>> 
>>> --
>>> Mathieu Desnoyers
>>> EfficiOS Inc.
>>> http://www.efficios.com
> 
> -- 
> Mathieu Desnoyers
> EfficiOS Inc.
> http://www.efficios.com

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

Reply via email to