• Nicholas Piggin's avatar
    powerpc/64s: Fix local irq disable when PMIs are disabled · bc88ef66
    Nicholas Piggin authored
    When PMI interrupts are soft-masked, local_irq_save() will clear the PMI
    mask bit, allowing PMIs in and causing a race condition. This causes a
    deadlock in native_hpte_insert via hash_preload, which depends on PMIs
    being disabled since commit 8b91cee5 ("powerpc/64s/hash: Make hash
    faults work in NMI context"). native_hpte_insert calls local_irq_save().
    It's possible the lpar hash code is also affected when tracing is
    enabled because __trace_hcall_entry() calls local_irq_save().
    
    Fix this by making arch_local_irq_save() _or_ the IRQS_DISABLED bit into
    the mask.
    
    This was found with the stress_hpt option with a kbuild workload running
    together with `perf record -g`.
    
    Fixes: f442d004 ("powerpc/64s: Add support to mask perf interrupts and replay them")
    Fixes: 8b91cee5 ("powerpc/64s/hash: Make hash faults work in NMI context")
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    [mpe: Just take the fix without the new warning]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20230121095352.2823517-1-npiggin@gmail.com
    bc88ef66
hw_irq.h 12.1 KB