diff options
author | Juergen Gross <jgross@suse.com> | 2021-03-11 17:23:08 +0300 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2021-03-11 18:12:33 +0300 |
commit | 6ea312d95e0226b306bb4b8ee3a0727d880378cb (patch) | |
tree | 0184628a85dac475cc6361b183a08e319690bf54 | |
parent | b046664872dd78a8bebe3d5f3bb9da9baa93f5ca (diff) | |
download | linux-6ea312d95e0226b306bb4b8ee3a0727d880378cb.tar.xz |
static_call: Add function to query current function
Some users of paravirtualized functions need to query which function
has been specified in a pv_ops vector element. In order to be able to
switch such paravirtualized functions to static_calls instead, there
needs to be a function to query the function which will be called via
static_call().
Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20210311142319.4723-4-jgross@suse.com
-rw-r--r-- | include/linux/static_call.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/static_call.h b/include/linux/static_call.h index 76b881259144..e01b61ab86b1 100644 --- a/include/linux/static_call.h +++ b/include/linux/static_call.h @@ -20,6 +20,7 @@ * static_call(name)(args...); * static_call_cond(name)(args...); * static_call_update(name, func); + * static_call_query(name); * * Usage example: * @@ -91,6 +92,10 @@ * * which will include the required value tests to avoid NULL-pointer * dereferences. + * + * To query which function is currently set to be called, use: + * + * func = static_call_query(name); */ #include <linux/types.h> @@ -118,6 +123,8 @@ extern void arch_static_call_transform(void *site, void *tramp, void *func, bool STATIC_CALL_TRAMP_ADDR(name), func); \ }) +#define static_call_query(name) (READ_ONCE(STATIC_CALL_KEY(name).func)) + #ifdef CONFIG_HAVE_STATIC_CALL_INLINE extern int __init static_call_init(void); @@ -191,6 +198,7 @@ static inline int static_call_init(void) { return 0; } }; \ ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) + #define static_call_cond(name) (void)__static_call(name) static inline |