On Tue, 2021-03-16 at 14:17 +1100, Jordan Niethe wrote: > setup_text_poke_area() is a late init call so it runs before > mark_rodata_ro() and after the init calls. This lets all the init > code > patching simply write to their locations. In the future, kprobes is > going to allocate its instruction pages RO which means they will need > setup_text__poke_area() to have been already called for their code > patching. However, init_kprobes() (which allocates and patches some > instruction pages) is an early init call so it happens before > setup_text__poke_area(). > > start_kernel() calls poking_init() before any of the init calls. On > powerpc, poking_init() is currently a nop. setup_text_poke_area() > relies > on kernel virtual memory, cpu hotplug and per_cpu_areas being setup. > setup_per_cpu_areas(), boot_cpu_hotplug_init() and mm_init() are > called > before poking_init(). > > Turn setup_text_poke_area() into poking_init(). > > Signed-off-by: Jordan Niethe <jniet...@gmail.com>
Good job finding & fixing this bug! Reviewed-by: Russell Currey <rus...@russell.cc> > --- > v9: New to series > --- > arch/powerpc/lib/code-patching.c | 12 ++++-------- > 1 file changed, 4 insertions(+), 8 deletions(-) > > diff --git a/arch/powerpc/lib/code-patching.c > b/arch/powerpc/lib/code-patching.c > index 2333625b5e31..b28afa1133db 100644 > --- a/arch/powerpc/lib/code-patching.c > +++ b/arch/powerpc/lib/code-patching.c > @@ -65,14 +65,11 @@ static int text_area_cpu_down(unsigned int cpu) > } > > /* > - * Run as a late init call. This allows all the boot time patching > to be done > - * simply by patching the code, and then we're called here prior to > - * mark_rodata_ro(), which happens after all init calls are run. > Although > - * BUG_ON() is rude, in this case it should only happen if ENOMEM, > and we judge > - * it as being preferable to a kernel that will crash later when > someone tries > - * to use patch_instruction(). > + * Although BUG_ON() is rude, in this case it should only happen if > ENOMEM, and > + * we judge it as being preferable to a kernel that will crash later > when > + * someone tries to use patch_instruction(). > */ > -static int __init setup_text_poke_area(void) > +int __init poking_init(void) > { > BUG_ON(!cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, > "powerpc/text_poke:online", text_area_cpu_up, > @@ -80,7 +77,6 @@ static int __init setup_text_poke_area(void) > > return 0; > } > -late_initcall(setup_text_poke_area); > > /* > * This can be called for kernel text or a module.