Message ID | f71214e6221c5c50b32a62a33697473c756e604e.1710346410.git.yan@cloudflare.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Report RCU QS for busy network kthreads | expand |
On Wed, 13 Mar 2024 09:25:49 -0700 Yan Zhai wrote: > +/** > + * rcu_softirq_qs_periodic - Periodically report consolidated quiescent states > +#define rcu_softirq_qs_periodic(old_ts) \ scripts/kernel-doc says: include/linux/rcupdate.h:271: warning: Function parameter or struct member 'old_ts' not described in 'rcu_softirq_qs_periodic'
On Thu, Mar 14, 2024 at 4:55 PM Jakub Kicinski <kuba@kernel.org> wrote: > > On Wed, 13 Mar 2024 09:25:49 -0700 Yan Zhai wrote: > > +/** > > + * rcu_softirq_qs_periodic - Periodically report consolidated quiescent states > > > +#define rcu_softirq_qs_periodic(old_ts) \ > > scripts/kernel-doc says: > TIL, thanks. Let me send v4 to amend the text. Yan > include/linux/rcupdate.h:271: warning: Function parameter or struct member 'old_ts' not described in 'rcu_softirq_qs_periodic' > -- > pw-bot: cr
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 0746b1b0b663..e91ae38c33e3 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -247,6 +247,29 @@ do { \ cond_resched(); \ } while (0) +/** + * rcu_softirq_qs_periodic - Periodically report consolidated quiescent states + * + * This helper is for network processing in non-RT kernels, where there could + * be busy polling threads that block RCU synchronization indefinitely. In + * such context, simply calling cond_resched is insufficient, so give it a + * stronger push to eliminate potential blockage of all RCU types. + * + * NOTE: unless absolutely sure, this helper should in general be called + * outside of bh lock section to avoid reporting a surprising QS to updaters, + * who could be expecting RCU read critical section to end at local_bh_enable(). + */ +#define rcu_softirq_qs_periodic(old_ts) \ +do { \ + if (!IS_ENABLED(CONFIG_PREEMPT_RT) && \ + time_after(jiffies, (old_ts) + HZ / 10)) { \ + preempt_disable(); \ + rcu_softirq_qs(); \ + preempt_enable(); \ + (old_ts) = jiffies; \ + } \ +} while (0) + /* * Infrastructure to implement the synchronize_() primitives in * TREE_RCU and rcu_barrier_() primitives in TINY_RCU.