• Pavel Tatashin's avatar
    x86/alternatives, jumplabel: Use text_poke_early() before mm_init() · 6fffacb3
    Pavel Tatashin authored
    It supposed to be safe to modify static branches after jump_label_init().
    But, because static key modifying code eventually calls text_poke() it can
    end up accessing a struct page which has not been initialized yet.
    
    Here is how to quickly reproduce the problem. Insert code like this
    into init/main.c:
    
    | +static DEFINE_STATIC_KEY_FALSE(__test);
    | asmlinkage __visible void __init start_kernel(void)
    | {
    |        char *command_line;
    |@@ -587,6 +609,10 @@ asmlinkage __visible void __init start_kernel(void)
    |        vfs_caches_init_early();
    |        sort_main_extable();
    |        trap_init();
    |+       {
    |+       static_branch_enable(&__test);
    |+       WARN_ON(!static_branch_likely(&__test));
    |+       }
    |        mm_init();
    
    The following warnings show-up:
    WARNING: CPU: 0 PID: 0 at arch/x86/kernel/alternative.c:701 text_poke+0x20d/0x230
    RIP: 0010:text_poke+0x20d/0x230
    Call Trace:
     ? text_poke_bp+0x50/0xda
     ? arch_jump_label_transform+0x89/0xe0
     ? __jump_label_update+0x78/0xb0
     ? static_key_enable_cpuslocked+0x4d/0x80
     ? static_key_enable+0x11/0x20
     ? start_kernel+0x23e/0x4c8
     ? secondary_startup_64+0xa5/0xb0
    
    ---[ end trace abdc99c031b8a90a ]---
    
    If the code above is moved after mm_init(), no warning is shown, as struct
    pages are initialized during handover from memblock.
    
    Use text_poke_early() in static branching until early boot IRQs are enabled
    and from there switch to text_poke. Also, ensure text_poke() is never
    invoked when unitialized memory access may happen by using adding a
    !after_bootmem assertion.
    Signed-off-by: default avatarPavel Tatashin <pasha.tatashin@oracle.com>
    Cc: steven.sistare@oracle.com
    Cc: daniel.m.jordan@oracle.com
    Cc: linux@armlinux.org.uk
    Cc: schwidefsky@de.ibm.com
    Cc: heiko.carstens@de.ibm.com
    Cc: john.stultz@linaro.org
    Cc: sboyd@codeaurora.org
    Cc: hpa@zytor.com
    Cc: douly.fnst@cn.fujitsu.com
    Cc: peterz@infradead.org
    Cc: prarit@redhat.com
    Cc: feng.tang@intel.com
    Cc: pmladek@suse.com
    Cc: gnomes@lxorguk.ukuu.org.uk
    Cc: linux-s390@vger.kernel.org
    Cc: boris.ostrovsky@oracle.com
    Cc: jgross@suse.com
    Cc: pbonzini@redhat.com
    Link: https://lkml.kernel.org/r/20180719205545.16512-9-pasha.tatashin@oracle.com
    6fffacb3
alternative.c 20.1 KB