Linux kernel 我们可以在中断上下文中使用FPU吗?

Linux kernel 我们可以在中断上下文中使用FPU吗?,linux-kernel,fpu,Linux Kernel,Fpu,在Linux内核中使用FPU假设FPU块包含kernel\u FPU\u begin和kernel\u FPU\u end函数。第一个是这样的: 41 static inline void kernel_fpu_begin(void) 42 { 43 WARN_ON_ONCE(!irq_fpu_usable()); 44 preempt_disable(); 45 __kernel_fpu_begin(); 46 } 如果FPU因以下

在Linux内核中使用FPU假设FPU块包含
kernel\u FPU\u begin
kernel\u FPU\u end
函数。第一个是这样的:

 41 static inline void kernel_fpu_begin(void)
 42 {
 43         WARN_ON_ONCE(!irq_fpu_usable());
 44         preempt_disable();
 45         __kernel_fpu_begin();
 46 }
如果FPU因以下原因无法使用,内核将发出警告:

 64 bool irq_fpu_usable(void)
 65 {
 66         return !in_interrupt() ||
 67                 interrupted_user_mode() ||
 68                 interrupted_kernel_fpu_idle();
 69 }
 70 EXPORT_SYMBOL(irq_fpu_usable);
那么,我们不能在中断上下文中使用FPU,对吗


如果是,我想知道为什么我们不能?

内核只有一个地方可以保存FPU状态,因此不允许有中断其他内核FPU代码的内核FPU代码

irq\u fpu\u-available
函数仅为实际中断其他内核fpu代码的内核fpu代码打印警告,但实际上,无法控制中断何时运行

因此,在中断上下文中使用FPU是不可能的。
(这也没什么意义,因为FPU代码仅用于性能优化,中断的运行时间不应太长,因此需要进行此类优化。)

您可以在中断上下文中使用FPU,但仅当您中断了一个用户模式程序或中断了一些不使用FPU的内核代码时。@CL.这是否意味着我不能在
softIRQ
上下文(例如在
net\u rx\u action
中)中使用FPU?上述限制对硬中断上下文和软中断上下文没有区别。@CL.仅作最后澄清。我没有机会在softIRQ上下文中运行基于FPU的代码,对吗?。。