static_call: Add simple self-test for static calls
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20200818135804.922581202@infradead.org
This commit is contained in:
parent
1e7e478838
commit
f03c412915
|
@ -106,6 +106,12 @@ config STATIC_KEYS_SELFTEST
|
||||||
help
|
help
|
||||||
Boot time self-test of the branch patching code.
|
Boot time self-test of the branch patching code.
|
||||||
|
|
||||||
|
config STATIC_CALL_SELFTEST
|
||||||
|
bool "Static call selftest"
|
||||||
|
depends on HAVE_STATIC_CALL
|
||||||
|
help
|
||||||
|
Boot time self-test of the call patching code.
|
||||||
|
|
||||||
config OPTPROBES
|
config OPTPROBES
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on KPROBES && HAVE_OPTPROBES
|
depends on KPROBES && HAVE_OPTPROBES
|
||||||
|
|
|
@ -369,3 +369,46 @@ static void __init static_call_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
early_initcall(static_call_init);
|
early_initcall(static_call_init);
|
||||||
|
|
||||||
|
#ifdef CONFIG_STATIC_CALL_SELFTEST
|
||||||
|
|
||||||
|
static int func_a(int x)
|
||||||
|
{
|
||||||
|
return x+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int func_b(int x)
|
||||||
|
{
|
||||||
|
return x+2;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_STATIC_CALL(sc_selftest, func_a);
|
||||||
|
|
||||||
|
static struct static_call_data {
|
||||||
|
int (*func)(int);
|
||||||
|
int val;
|
||||||
|
int expect;
|
||||||
|
} static_call_data [] __initdata = {
|
||||||
|
{ NULL, 2, 3 },
|
||||||
|
{ func_b, 2, 4 },
|
||||||
|
{ func_a, 2, 3 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init test_static_call_init(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(static_call_data); i++ ) {
|
||||||
|
struct static_call_data *scd = &static_call_data[i];
|
||||||
|
|
||||||
|
if (scd->func)
|
||||||
|
static_call_update(sc_selftest, scd->func);
|
||||||
|
|
||||||
|
WARN_ON(static_call(sc_selftest)(scd->val) != scd->expect);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
early_initcall(test_static_call_init);
|
||||||
|
|
||||||
|
#endif /* CONFIG_STATIC_CALL_SELFTEST */
|
||||||
|
|
Loading…
Reference in New Issue