> > > From: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> > > > Sent: Tuesday, March 21, 2023 6:28 PM [...] > > > Subject: [PATCH 1/1] Reduce synchronize_rcu() waiting time > > > > > > A call to a synchronize_rcu() can be expensive from time point of view. > > > Different workloads can be affected by this especially the ones > > > which use this API in its time critical sections. > > > > > > > This is interesting and meaningful research. ;-) > > > > > For example in case of NOCB scenario the wakeme_after_rcu() > > > callback invocation depends on where in a nocb-list it is located. > > > Below is an example when it was the last out of ~3600 callbacks: > > > > > > Can it be implemented separately as follows? it seems that the code > is simpler (only personal opinion) 😊. > > But I didn't test whether this reduce synchronize_rcu() waiting time > > +static void rcu_poll_wait_gp(struct rcu_tasks *rtp) { > + unsigned long gp_snap; > + > + gp_snap = start_poll_synchronize_rcu(); > + while (!poll_state_synchronize_rcu(gp_snap)) > + schedule_timeout_idle(1); } > + > +void call_rcu_poll(struct rcu_head *rhp, rcu_callback_t func); > +DEFINE_RCU_TASKS(rcu_poll, rcu_poll_wait_gp, call_rcu_poll, > + "RCU Poll"); > +void call_rcu_poll(struct rcu_head *rhp, rcu_callback_t func) { > + call_rcu_tasks_generic(rhp, func, &rcu_poll); } > +EXPORT_SYMBOL_GPL(call_rcu_poll); > + > +void synchronize_rcu_poll(void) > +{ > + synchronize_rcu_tasks_generic(&rcu_poll); > +} > +EXPORT_SYMBOL_GPL(synchronize_rcu_poll); > + > +static int __init rcu_spawn_poll_kthread(void) { > + cblist_init_generic(&rcu_poll); > + rcu_poll.gp_sleep = HZ / 10; > + rcu_spawn_tasks_kthread_generic(&rcu_poll); > + return 0; > +} > >Uh.. I am working on v2 of original patch where i need to add a Kconfig parameter. You are inventing a new API :) Looking forward to V2 😊. Thanks Zqiang > >-- >Uladzislau Rezki