> On Tue, Oct 4, 2022 at 7:41 AM Uladzislau Rezki <urezki@xxxxxxxxx> wrote: > > > > > trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Check")); > > > rcu_nocb_lock_irqsave(rdp, flags); > > > lockdep_assert_held(&rdp->nocb_lock); > > > bypass_ncbs = rcu_cblist_n_cbs(&rdp->nocb_bypass); > > > - if (bypass_ncbs && > > > + lazy_ncbs = READ_ONCE(rdp->lazy_len); > > > + > > > + if (bypass_ncbs && (lazy_ncbs == bypass_ncbs) && > > > + (time_after(j, READ_ONCE(rdp->nocb_bypass_first) + jiffies_till_flush) || > > > + bypass_ncbs > 2 * qhimark)) { > > Do you know why we want double "qhimark" threshold? It is not only this > > place, there are several. I am asking because it is not expected by the > > user. > > I am following the qhimark conventions in existing code. However > qhimark does not mean that your callbacks cannot exceed these many or > something, it is not a hard limit on queued callbacks. > > qhimark (And Paul can correct me) was introduced to reduce the number > of callbacks after which RCU will not limit execution of callbacks to > a batch of them. That has nothing to do with limiting the maximum > number of callbacks, per-se. However, its usage certainly seems to > have grown since that introduction. > > Maybe you are confusing it with blimit: > "blimit" controls how many/long callbacks are executed by the rcu_do_batch(). Whereas the "qhimark" controls when the bypass list is flushed to a regular one to initiate gp and start executing. -- Uladzislau Rezki