• Michael Ellerman's avatar
    powerpc/code-patching: Pre-map patch area · 591b4b26
    Michael Ellerman authored
    Paul reported a warning with DEBUG_ATOMIC_SLEEP=y:
    
      BUG: sleeping function called from invalid context at include/linux/sched/mm.h:256
      in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper/0
      preempt_count: 0, expected: 0
      ...
      Call Trace:
        dump_stack_lvl+0xa0/0xec (unreliable)
        __might_resched+0x2f4/0x310
        kmem_cache_alloc+0x220/0x4b0
        __pud_alloc+0x74/0x1d0
        hash__map_kernel_page+0x2cc/0x390
        do_patch_instruction+0x134/0x4a0
        arch_jump_label_transform+0x64/0x78
        __jump_label_update+0x148/0x180
        static_key_enable_cpuslocked+0xd0/0x120
        static_key_enable+0x30/0x50
        check_kvm_guest+0x60/0x88
        pSeries_smp_probe+0x54/0xb0
        smp_prepare_cpus+0x3e0/0x430
        kernel_init_freeable+0x20c/0x43c
        kernel_init+0x30/0x1a0
        ret_from_kernel_thread+0x5c/0x64
    
    Peter pointed out that this is because do_patch_instruction() has
    disabled interrupts, but then map_patch_area() calls map_kernel_page()
    then hash__map_kernel_page() which does a sleeping memory allocation.
    
    We only see the warning in KVM guests with SMT enabled, which is not
    particularly common, or on other platforms if CONFIG_KPROBES is
    disabled, also not common. The reason we don't see it in most
    configurations is that another path that happens to have interrupts
    enabled has allocated the required page tables for us, eg. there's a
    path in kprobes init that does that. That's just pure luck though.
    
    As Christophe suggested, the simplest solution is to do a dummy
    map/unmap when we initialise the patching, so that any required page
    table levels are pre-allocated before the first call to
    do_patch_instruction(). This works because the unmap doesn't free any
    page tables that were allocated by the map, it just clears the PTE,
    leaving the page table levels there for the next map.
    Reported-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
    Debugged-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Suggested-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220223015821.473097-1-mpe@ellerman.id.au
    591b4b26
code-patching.c 8.54 KB