powerpc/64: Fix msr_check_and_set/clear MSR[EE] race
authorNicholas Piggin <npiggin@gmail.com>
Tue, 4 Oct 2022 05:11:57 +0000 (15:11 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 4 Oct 2022 12:16:20 +0000 (23:16 +1100)
commit0fa6831811f62cfc10415d731bcf9fde2647ad81
tree396e7da30b261132d749317a00e7fc0d5673545b
parent8154850b28bd57a35ea73a7518ffcb9ccd5e43bc
powerpc/64: Fix msr_check_and_set/clear MSR[EE] race

irq soft-masking means that when Linux irqs are disabled, the MSR[EE]
value can change from 1 to 0 asynchronously: if a masked interrupt of
the PACA_IRQ_MUST_HARD_MASK variety fires while irqs are disabled,
the masked handler will return with MSR[EE]=0.

This means a sequence like mtmsr(mfmsr() | MSR_FP) is racy if it can
be called with local irqs disabled, unless a hard_irq_disable has been
done.

Reported-by: Sachin Sant <sachinp@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221004051157.308999-2-npiggin@gmail.com
arch/powerpc/include/asm/hw_irq.h
arch/powerpc/kernel/process.c