Loading arch/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,12 @@ config STATIC_KEYS_SELFTEST help 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 def_bool y depends on KPROBES && HAVE_OPTPROBES Loading kernel/static_call.c +43 −0 Original line number Diff line number Diff line Loading @@ -369,3 +369,46 @@ static void __init static_call_init(void) #endif } 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
arch/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,12 @@ config STATIC_KEYS_SELFTEST help 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 def_bool y depends on KPROBES && HAVE_OPTPROBES Loading
kernel/static_call.c +43 −0 Original line number Diff line number Diff line Loading @@ -369,3 +369,46 @@ static void __init static_call_init(void) #endif } 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 */