Skip to content

Commit 293bb04

Browse files
ardbiesheuvelRussell King (Oracle)
authored andcommitted
ARM: 9446/1: Disallow kernel mode NEON when IRQs are disabled
Commit c79f816 ("ARM: 9283/1: permit non-nested kernel mode NEON in softirq context") relaxed the rules around the use of SIMD instructions in kernel mode on ARM, to allow such use when serving a softirq. To avoid having to preserve/restore kernel mode NEON state when such a softirq is taken, softirqs are now disabled when using the NEON from task context. However, the fact that the softirq API does not allow unmasking of softirqs with interrupts disabled was overlooked, resulting in a WARN() in some cases, as reported by Guenter: WARNING: CPU: 0 PID: 1145 at kernel/softirq.c:369 __local_bh_enable_ip+0x118/0x194 Call trace: unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x7c/0xac dump_stack_lvl from __warn+0x7c/0x1b8 __warn from warn_slowpath_fmt+0x19c/0x1a4 warn_slowpath_fmt from __local_bh_enable_ip+0x118/0x194 __local_bh_enable_ip from crc_t10dif_arch+0xd4/0xe8 crc_t10dif_arch from crc_t10dif_wrapper+0x14/0x1c crc_t10dif_wrapper from crc_main_test+0x178/0x360 crc_main_test from kunit_try_run_case+0x78/0x1e0 kunit_try_run_case from kunit_generic_run_threadfn_adapter+0x1c/0x34 kunit_generic_run_threadfn_adapter from kthread+0x118/0x254 kthread from ret_from_fork+0x14/0x28 While disabling softirqs is not really needed when running with IRQs disabled (given that the only way a softirq can be delivered asynchrously is over the back of an IRQ), let's not complicate this logic more than needed, and simply disallow use of the NEON in kernel mode when IRQs are disabled. Another approach might be to only disable and re-enable softirqs if IRQs are enabled, but other than the test case above, there are no clear use cases for doing non-trivial arithmetic processing (hence using an accelerated SIMD implementation) with IRQs disabled. Reported-by: Guenter Roeck <[email protected]> Tested-by: Guenter Roeck <[email protected]> Link: https://lore.kernel.org/all/[email protected] Reviewed-by: Eric Biggers <[email protected]> Signed-off-by: Ard Biesheuvel <[email protected]> Signed-off-by: Russell King (Oracle) <[email protected]>
1 parent 96e0b35 commit 293bb04

File tree

2 files changed

+3
-1
lines changed

2 files changed

+3
-1
lines changed

arch/arm/include/asm/simd.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44

55
static __must_check inline bool may_use_simd(void)
66
{
7-
return IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && !in_hardirq();
7+
return IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && !in_hardirq()
8+
&& !irqs_disabled();
89
}

arch/arm/vfp/vfpmodule.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ void kernel_neon_begin(void)
877877
* the kernel mode NEON register contents never need to be preserved.
878878
*/
879879
BUG_ON(in_hardirq());
880+
BUG_ON(irqs_disabled());
880881
cpu = __smp_processor_id();
881882

882883
fpexc = fmrx(FPEXC) | FPEXC_EN;

0 commit comments

Comments
 (0)