On Mon, Aug 19, 2024 at 12:16:42AM -0400, Kent Overstreet wrote:
> On Sun, Aug 18, 2024 at 08:52:59PM GMT, Paul E. McKenney wrote:
> > On Sun, Aug 18, 2024 at 09:19:16PM -0400, Kent Overstreet wrote:
> > > On Sun, Aug 18, 2024 at 10:01:42AM GMT, Paul E. McKenney wrote:
> > > > But you only need one callback per live outstanding "cookie" returned
> > > > from get_state_synchronize_rcu*() or start_poll_synchronize_rcu().
> > > > Or am I missing something here?
> > > 
> > > Maybe I am?
> > > 
> > > I've been assuming that if rcu callbacks are getting punted off to a
> > > kthread that we can't rely on them being completed in any particular
> > > timeframe - i.e. the number of grace periods with outstanding callbacks
> > > would be unbounded.
> > 
> > Exactly, and that is why there is a check for expired cookies during the
> > addition of a new data element that needs to wait for a grace period.
> > The only purpose of that call_rcu() callback is to act as a fallback in
> > case there is a long period of time with no newly arriving data elements
> > that need to wait for a grace period.
> > 
> > > You're saying that NUM_ACTIVE_RCU_POLL_FULL_OLDSTATE _does_ include
> > > grace periods with outstanding callbacks? Just want to be clear on that.
> > 
> > No, it does not, but given the algorithm outlined in my previous
> > email, it doesn't need to.  The point of the callbacks is *not* to
> > unconditionally drive things forward, but instead to provide a fallback
> > to do the necessary processing in the case nothing new arrives for an
> > extended period of time.
> 
> You can't use a fixed number of callback heads if there's going to be an
> unbounded number of callback heads outstanding.

The number of rcu_head structures is your choice, based on your choice
of data structure.  You can for example link together data elements that
have the same value of get_state_synchronize_rcu() cookie, and use a
single rcu_head structure for that group.  You could then do whatever
you want for the linking.

But even if you do choose to have a large number of rcu_head structures,
perhaps one per data element, there is no law saying that each and every
one of them needs to be passed to call_rcu().  For example, kfree_rcu()
requires an rcu_head structure in the objects passed to it, but in the
common (non-OOM) case, those structures go unused in favor of pages
of pointers.

So what were you really trying to get across to me here?

                                                        Thanx, Paul

Reply via email to