On Fri, Mar 19, 2021 at 10:51:16AM -0700, Paul E. McKenney wrote: > On Fri, Mar 19, 2021 at 02:58:54PM +0100, Frederic Weisbecker wrote: > > It's all a matter of personal taste but if I may suggest some namespace > > modifications: > > > > get_state_synchronize_rcu() -> synchronize_rcu_poll_start_raw() > > start_poll_synchronize_rcu() -> synchronize_rcu_poll_start() > > poll_state_synchronize_rcu() -> synchronize_rcu_poll() > > cond_synchronize_rcu() -> synchronize_rcu_cond() > > > > But it's up to you really. > > I am concerned about starting anything "synchronize_rcu" if that > thing doesn't unconditionally wait for a grace period. "What do > you mean that there was no grace period? Don't you see that call to > synchronize_rcu_poll_start_raw()???" I see, that could indeed be confusing. > > This objection doesn't apply to cond_synchronize_rcu(), but it is > already in use, so any name change should be worked with the users. > All two of them. ;-) Probably not worth it. We have cond_resched() as a schedule() counterpart for a reference after all. > > > /** > > > + * start_poll_state_synchronize_rcu - Snapshot and start RCU grace period > > > + * > > > + * Returns a cookie that is used by a later call to cond_synchronize_rcu() > > > > It may be worth noting that calling start_poll_synchronize_rcu() and then > > pass the cookie to cond_synchronize_rcu() soon after may end up waiting for > > one more grace period. > > You mean this sequence of events? > > 1. cookie = start_poll_synchronize_rcu() > > 2. The grace period corresponding to cookie is almost over... > > 3. cond_synchronize_rcu() checks the cookie and sees that the > grace period has not yet expired. > > 4. The grace period corresponding to cookie completes. > > 5. Someone else starts a grace period. > > 6. cond_synchronize_rcu() invokes synchronize_rcu(), which waits > for the just-started grace period plus another grace period. > Thus, there has been no fewer than three full grace periods > between the call to start_poll_synchronize_rcu() and the > return from cond_synchronize_rcu(). > > Yes, this can happen! And it can be worse, for example, it is quite > possible that cond_synchronize_rcu() would be preempted for multiple > grace periods at step 5, in which case it would still wait for almost > two additional grace periods. > > Or are you thinking of something else? I didn't even think that far. My scenario was: 1. cookie = start_poll_synchronize_rcu() 2. cond_synchronize_rcu() checks the cookie and sees that the grace period has not yet expired. So it calls synchronize_rcu() which queues a callback. 3. The grace period for the cookie eventually completes. 4. The callback queued in 2. gets assigned a new grace period number. That new grace period starts. 5. The new grace period completes and synchronize_rcu() returns. But I think this is due to some deep misunderstanding from my end. > > > + * If a full RCU grace period has elapsed since the earlier call from > > > + * which oldstate was obtained, return @true, otherwise return @false. > > > + * Otherwise, invoke synchronize_rcu() to wait for a full grace period. > > > > Rephrase suggestion for the last sentence: > > > > "In case of failure, it's up to the caller to try polling again later or > > invoke synchronize_rcu() to wait for a new full grace period to complete." > > How about like this? > > /** > * poll_state_synchronize_rcu - Conditionally wait for an RCU grace period > * > * @oldstate: return from call to get_state_synchronize_rcu() or start_poll_synchronize_rcu() > * > * If a full RCU grace period has elapsed since the earlier call from > * which oldstate was obtained, return @true, otherwise return @false. > * If @false is returned, it is the caller's responsibilty to invoke this > * function later on until it does return @true. Alternatively, the caller > * can explicitly wait for a grace period, for example, by passing @oldstate > * to cond_synchronize_rcu() or by directly invoking synchronize_rcu(). Yes very nice! Thanks!