On Fri, Mar 06, 2020 at 01:59:25PM -0500, Steven Rostedt wrote: [snip] > > > - rcu_irq_enter_irqson(); \ > > > - } \ > > > \ > > > it_func_ptr = rcu_dereference_raw((tp)->funcs); \ > > > \ > > > if (it_func_ptr) { \ > > > do { \ > > > + int rcu_flags; \ > > > it_func = (it_func_ptr)->func; \ > > > + if (rcuidle && \ > > > + (it_func_ptr)->requires_rcu) \ > > > + rcu_flags = trace_rcu_enter(); \ > > > __data = (it_func_ptr)->data; \ > > > ((void(*)(proto))(it_func))(args); \ > > > + if (rcuidle && \ > > > + (it_func_ptr)->requires_rcu) \ > > > + trace_rcu_exit(rcu_flags); \ > > > > Nit: If we have incurred the cost of trace_rcu_enter() once, we can call > > it only once and then call trace_rcu_exit() after the do-while loop. That way > > we pay the price only once. > > > > I thought about that, but the common case is only one callback attached at > a time. To make the code complex for the non common case seemed too much > of an overkill. If we find that it does help, it's best to do that as a > separate patch because then if something goes wrong we know where it > happened. > > Currently, this provides the same overhead as if each callback did it > themselves like we were proposing (but without the added need to do it for > all instances of the callback). That's ok, it could be a separate patch. thanks, - Joel