Messages in this thread | | | Date | Fri, 27 Mar 2020 11:08:31 +0100 | From | Peter Zijlstra <> | Subject | Re: [RESEND][PATCH v3 14/17] static_call: Add static_cond_call() |
| |
On Fri, Mar 27, 2020 at 12:37:35AM +0100, Rasmus Villemoes wrote: > On 24/03/2020 14.56, Peter Zijlstra wrote: > > Extend the static_call infrastructure to optimize the following common > > pattern: > > > > if (func_ptr) > > func_ptr(args...) > > > > > +#define DEFINE_STATIC_COND_CALL(name, _func) \ > > + DECLARE_STATIC_CALL(name, _func); \ > > + struct static_call_key STATIC_CALL_NAME(name) = { \ > > + .func = NULL, \ > > + } > > + > > #define static_call(name) \ > > ((typeof(STATIC_CALL_TRAMP(name))*)(STATIC_CALL_NAME(name).func)) > > > > +#define static_cond_call(name) \ > > + if (STATIC_CALL_NAME(name).func) \ > > + ((typeof(STATIC_CALL_TRAMP(name))*)(STATIC_CALL_NAME(name).func)) > > + > > What, apart from fear of being ridiculed by kernel folks, prevents the > compiler from reloading STATIC_CALL_NAME(name).func ? IOW, doesn't this > want a READ_ONCE somewhere?
Hurmph.. I suspect you're quite right, but at the same time I can't seem to write a macro that does that :/ Let me try harder.
> And please remind me, what is the consensus for sizeof(long) loads: does > static_call() need load-tearing protection or not?
We all like to believe compilers are broken when they tear naturally aligned words, but we're also not quite comfortable trusting that.
| |