Re: [PATCH] x86/efi: Restore IRQ state in EFI page fault handler
Eric Biggers <[email protected]> Mon, 4 May 2026 11:01:07 -0700
| Newsgroups | org.kernel.vger.linux-efi |
|---|---|
| Message-ID | <20260504180107.GD2291@sol> |
On Fri, May 01, 2026 at 11:03:12AM +0200, Ard Biesheuvel wrote: > From: Ard Biesheuvel <[email protected]> > > The kernel's softirq API does not permit re-enabling softirqs while IRQs > are disabled. The reason for this is that local_bh_enable() will not > only re-enable delivery of softirqs over the back of IRQs, it will also > handle any pending softirqs immediately, regardless of whether IRQs are > enabled at that point. > > For this reason, commit > > d02198550423 ("x86/fpu: Improve crypto performance by making kernel-mode FPU reliably usable in softirqs") > > disables softirqs only when IRQs are enabled, as it is not permitted > otherwise, but also unnecessary, given that asynchronous softirq > delivery never happens to begin with while IRQs are disabled. > > However, this does mean that entering a kernel mode FPU section with > IRQs enabled and leaving it with IRQs disabled leads to problems, as > identified by Sashiko [0]: the EFI page fault handler is called from > page_fault_oops() with IRQs disabled, and thus ends the kernel mode FPU > section with IRQs disabled as well, regardless of whether IRQs were > enabled when it was started. This may result in schedule() being called > with a non-zero preempt_count, causing a BUG(). > > So take care to re-enable IRQs when handling any EFI page faults if they > were taken with IRQs enabled. > > [0] https://sashiko.dev/#/patchset/20260430074107.27051-1-ivan.hu%40canonical.com > > Cc: Eric Biggers <[email protected]> > Cc: Ivan Hu <[email protected]> > Fixes: d02198550423 ("x86/fpu: Improve crypto performance by making kernel-mode FPU reliably usable in softirqs") > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > arch/x86/include/asm/efi.h | 3 ++- > arch/x86/mm/fault.c | 2 +- > arch/x86/platform/efi/quirks.c | 11 ++++++++++- > 3 files changed, 13 insertions(+), 3 deletions(-) Reviewed-by: Eric Biggers <[email protected]> - Eric