• Srikar Dronamraju's avatar
    powerpc/smp: Use GFP_ATOMIC while allocating tmp mask · 84dbf66c
    Srikar Dronamraju authored
    Qian Cai reported a regression where CPU Hotplug fails with the latest
    powerpc/next
    
    BUG: sleeping function called from invalid context at mm/slab.h:494
    in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 0, name: swapper/88
    no locks held by swapper/88/0.
    irq event stamp: 18074448
    hardirqs last  enabled at (18074447): [<c0000000001a2a7c>] tick_nohz_idle_enter+0x9c/0x110
    hardirqs last disabled at (18074448): [<c000000000106798>] do_idle+0x138/0x3b0
    do_idle at kernel/sched/idle.c:253 (discriminator 1)
    softirqs last  enabled at (18074440): [<c0000000000bbec4>] irq_enter_rcu+0x94/0xa0
    softirqs last disabled at (18074439): [<c0000000000bbea0>] irq_enter_rcu+0x70/0xa0
    CPU: 88 PID: 0 Comm: swapper/88 Tainted: G        W         5.9.0-rc8-next-20201007 #1
    Call Trace:
    [c00020000a4bfcf0] [c000000000649e98] dump_stack+0xec/0x144 (unreliable)
    [c00020000a4bfd30] [c0000000000f6c34] ___might_sleep+0x2f4/0x310
    [c00020000a4bfdb0] [c000000000354f94] slab_pre_alloc_hook.constprop.82+0x124/0x190
    [c00020000a4bfe00] [c00000000035e9e8] __kmalloc_node+0x88/0x3a0
    slab_alloc_node at mm/slub.c:2817
    (inlined by) __kmalloc_node at mm/slub.c:4013
    [c00020000a4bfe80] [c0000000006494d8] alloc_cpumask_var_node+0x38/0x80
    kmalloc_node at include/linux/slab.h:577
    (inlined by) alloc_cpumask_var_node at lib/cpumask.c:116
    [c00020000a4bfef0] [c00000000003eedc] start_secondary+0x27c/0x800
    update_mask_by_l2 at arch/powerpc/kernel/smp.c:1267
    (inlined by) add_cpu_to_masks at arch/powerpc/kernel/smp.c:1387
    (inlined by) start_secondary at arch/powerpc/kernel/smp.c:1420
    [c00020000a4bff90] [c00000000000c468] start_secondary_resume+0x10/0x14
    
    Allocating a temporary mask while performing a CPU Hotplug operation
    with CONFIG_CPUMASK_OFFSTACK enabled, leads to calling a sleepable
    function from a atomic context. Fix this by allocating the temporary
    mask with GFP_ATOMIC flag. Also instead of having to allocate twice,
    allocate the mask in the caller so that we only have to allocate once.
    If the allocation fails, assume the mask to be same as sibling mask, which
    will make the scheduler to drop this domain for this CPU.
    
    Fixes: 70a94089 ("powerpc/smp: Optimize update_coregroup_mask")
    Fixes: 3ab33d6d ("powerpc/smp: Optimize update_mask_by_l2")
    Reported-by: default avatarQian Cai <cai@redhat.com>
    Signed-off-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20201019042716.106234-3-srikar@linux.vnet.ibm.com
    84dbf66c
smp.c 36.4 KB