2013-11-21 100 views
1

在Linux內核中使用FPU假定FPU塊包含kernel_fpu_beginkernel_fpu_end函數。第一個是這樣的:我們可以在中斷環境中使用FPU嗎?

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 ?

如果是我想知道爲什麼我們不能?

+1

您*可以*在中斷上下文中使用FPU,但僅限於如果你中斷了一個用戶模式程序,或者你中斷了一些沒有使用FPU的內核代碼。 –

+0

@CL。這是否意味着我不能在'softIRQ'上下文中使用FPU(在'net_rx_action'中,例如)? –

+1

以上限制在硬中斷上下文中沒有區別。 –

回答

2

內核只有一個位置來保存FPU狀態,所以不允許有內核FPU代碼來中斷其他內核FPU代碼。

irq_fpu_usable函數僅打印內核FPU代碼的警告,實際上正在中斷其他內核FPU代碼,但在實踐中,無法控制中斷何時運行。

因此,在中斷上下文中使用FPU是不可能的。 (它也沒有意義,因爲FPU代碼僅用作性能優化,並且中斷不應該長時間運行以至於需要這樣的優化。)

+0

好的,非常感謝。 –

相關問題