Revert "powerpc/code-patching: Improve verification of patchability"
authorMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Nov 2021 06:41:52 +0000 (17:41 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 29 Nov 2021 06:41:52 +0000 (17:41 +1100)
This reverts commit 8b8a8f0ab3f5519e45c526f826a655817486c5bb.

As reported[1] by Sachin this causes problems with ftrace, and it also
causes the code patching selftests to fail as reported[2] by Stephen.

So revert it for now.

1: https://lore.kernel.org/linuxppc-dev/3668743C-09DF-4673-B15C-2FFE2A57F7D7@linux.vnet.ibm.com/
2: https://lore.kernel.org/linuxppc-dev/20211126161747.1f7795b0@canb.auug.org.au/

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/setup.h
arch/powerpc/lib/code-patching.c
arch/powerpc/mm/mem.c

index 426a2d8..6c1a7d2 100644 (file)
@@ -9,6 +9,7 @@ extern void ppc_printk_progress(char *s, unsigned short hex);
 
 extern unsigned int rtas_data;
 extern unsigned long long memory_limit;
+extern bool init_mem_is_free;
 extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
 
 struct device_node;
index 5e2fe13..c5ed988 100644 (file)
@@ -190,9 +190,10 @@ static int do_patch_instruction(u32 *addr, struct ppc_inst instr)
 int patch_instruction(u32 *addr, struct ppc_inst instr)
 {
        /* Make sure we aren't patching a freed init section */
-       if (!kernel_text_address((unsigned long)addr))
+       if (init_mem_is_free && init_section_contains(addr, 4)) {
+               pr_debug("Skipping init section patching addr: 0x%px\n", addr);
                return 0;
-
+       }
        return do_patch_instruction(addr, instr);
 }
 NOKPROBE_SYMBOL(patch_instruction);
index 8e301cd..bd5d91a 100644 (file)
@@ -26,6 +26,7 @@
 #include <mm/mmu_decl.h>
 
 unsigned long long memory_limit;
+bool init_mem_is_free;
 
 unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] __page_aligned_bss;
 EXPORT_SYMBOL(empty_zero_page);
@@ -311,6 +312,7 @@ void free_initmem(void)
 {
        ppc_md.progress = ppc_printk_progress;
        mark_initmem_nx();
+       init_mem_is_free = true;
        free_initmem_default(POISON_FREE_INITMEM);
 }