powerpc/code-patching: Use jump_label for testing freed initmem
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 22 Mar 2022 15:40:20 +0000 (16:40 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 11 May 2022 13:06:39 +0000 (23:06 +1000)
Once init is done, initmem is freed forever so no need to
test system_state at every call to patch_instruction().

Use jump_label.

This reduces by 2% the time needed to activate ftrace on an 8xx.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/0aee964721cab7316cffde21a2ca223cee14d373.1647962456.git.christophe.leroy@csgroup.eu
arch/powerpc/include/asm/code-patching.h
arch/powerpc/lib/code-patching.c
arch/powerpc/mm/mem.c

index 409483b..bccc3a5 100644 (file)
@@ -22,6 +22,8 @@
 #define BRANCH_SET_LINK        0x1
 #define BRANCH_ABSOLUTE        0x2
 
+DECLARE_STATIC_KEY_FALSE(init_mem_is_free);
+
 bool is_offset_in_branch_range(long offset);
 bool is_offset_in_cond_branch_range(long offset);
 int create_branch(ppc_inst_t *instr, const u32 *addr,
index f970f18..1ecd166 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/init.h>
 #include <linux/cpuhotplug.h>
 #include <linux/uaccess.h>
+#include <linux/jump_label.h>
 
 #include <asm/tlbflush.h>
 #include <asm/page.h>
@@ -188,10 +189,12 @@ static int do_patch_instruction(u32 *addr, ppc_inst_t instr)
 
 #endif /* CONFIG_STRICT_KERNEL_RWX */
 
+__ro_after_init DEFINE_STATIC_KEY_FALSE(init_mem_is_free);
+
 int patch_instruction(u32 *addr, ppc_inst_t instr)
 {
        /* Make sure we aren't patching a freed init section */
-       if (system_state >= SYSTEM_FREEING_INITMEM && init_section_contains(addr, 4))
+       if (static_branch_likely(&init_mem_is_free) && init_section_contains(addr, 4))
                return 0;
 
        return do_patch_instruction(addr, instr);
index 4d221d0..177fae5 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/kasan.h>
 #include <asm/svm.h>
 #include <asm/mmzone.h>
+#include <asm/code-patching.h>
 
 #include <mm/mmu_decl.h>
 
@@ -311,6 +312,7 @@ void free_initmem(void)
 {
        ppc_md.progress = ppc_printk_progress;
        mark_initmem_nx();
+       static_branch_enable(&init_mem_is_free);
        free_initmem_default(POISON_FREE_INITMEM);
 }