static_call: Allow early init

In order to use static_call() to wire up x86_pmu, we need to
initialize earlier, specifically before memory allocation works; copy
some of the tricks from jump_label to enable this.

Primarily we overload key->next to store a sites pointer when there
are no modules, this avoids having to use kmalloc() to initialize the
sites and allows us to run much earlier.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Link: https://lore.kernel.org/r/20200818135805.220737930@infradead.org
This commit is contained in:
Peter Zijlstra
2020-08-18 15:57:51 +02:00
committed by Ingo Molnar
parent 6c3fce794e
commit a945c8345e
4 changed files with 85 additions and 7 deletions

View File

@ -11,7 +11,7 @@ enum insn_type {
RET = 3, /* tramp / site cond-tail-call */
};
static void __static_call_transform(void *insn, enum insn_type type, void *func)
static void __ref __static_call_transform(void *insn, enum insn_type type, void *func)
{
int size = CALL_INSN_SIZE;
const void *code;
@ -38,6 +38,9 @@ static void __static_call_transform(void *insn, enum insn_type type, void *func)
if (memcmp(insn, code, size) == 0)
return;
if (unlikely(system_state == SYSTEM_BOOTING))
return text_poke_early(insn, code, size);
text_poke_bp(insn, code, size, NULL);
}