Commit 6ea312d9 authored by Juergen Gross's avatar Juergen Gross Committed by Borislav Petkov

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: default avatarJuergen Gross <jgross@suse.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20210311142319.4723-4-jgross@suse.com
parent b0466648
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
* static_call(name)(args...); * static_call(name)(args...);
* static_call_cond(name)(args...); * static_call_cond(name)(args...);
* static_call_update(name, func); * static_call_update(name, func);
* static_call_query(name);
* *
* Usage example: * Usage example:
* *
...@@ -91,6 +92,10 @@ ...@@ -91,6 +92,10 @@
* *
* which will include the required value tests to avoid NULL-pointer * which will include the required value tests to avoid NULL-pointer
* dereferences. * dereferences.
*
* To query which function is currently set to be called, use:
*
* func = static_call_query(name);
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -118,6 +123,8 @@ extern void arch_static_call_transform(void *site, void *tramp, void *func, bool ...@@ -118,6 +123,8 @@ extern void arch_static_call_transform(void *site, void *tramp, void *func, bool
STATIC_CALL_TRAMP_ADDR(name), func); \ STATIC_CALL_TRAMP_ADDR(name), func); \
}) })
#define static_call_query(name) (READ_ONCE(STATIC_CALL_KEY(name).func))
#ifdef CONFIG_HAVE_STATIC_CALL_INLINE #ifdef CONFIG_HAVE_STATIC_CALL_INLINE
extern int __init static_call_init(void); extern int __init static_call_init(void);
...@@ -191,6 +198,7 @@ static inline int static_call_init(void) { return 0; } ...@@ -191,6 +198,7 @@ static inline int static_call_init(void) { return 0; }
}; \ }; \
ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name) ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name)
#define static_call_cond(name) (void)__static_call(name) #define static_call_cond(name) (void)__static_call(name)
static inline static inline
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment