中斷和鎖
1. 硬中斷和軟中斷(包括tasklet和timer)共享數據,硬中斷中使用spin_lock/spin_unlock,軟中斷中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中斷可以打斷軟中斷,所以軟中斷中訪問共享數據需要禁止中斷;考慮如下情況,當軟中斷中獲取到鎖,之后被硬中斷打斷,硬中斷此時嘗試獲取鎖,因為鎖已經被軟中斷持有,硬中斷獲取不到,產生死鎖;
2. 硬中斷和進程上下文共享數據,硬中斷中使用spin_lock/spin_unlock,進程上下文中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中斷可以打斷進程上下文,所以進程上下文中訪問共享數據需要禁止中斷;考慮如下情況,當進程上下文中獲取到鎖,之后被硬中斷打斷,硬中斷此時嘗試獲取鎖,因為鎖已經被進程上下文持有,硬中斷獲取不到,產生死鎖;
3. 多個相同硬中斷共享數據,不存在這種情況;
同一個中斷處理程序同時只有一個實例,當一個中斷處理程序運行時,相應中斷線在所有處理器上都會屏蔽掉;
4. 多個不同的硬中斷共享數據,需要使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中斷可以被一個比自己優先級高的硬中斷打斷,考慮如下情況,當優先級低的中斷中獲取到鎖,之后被優先級高的中斷打斷,高優先級中斷此時嘗試獲取鎖,因為鎖已經被低優先級中斷持有,高優先級中斷獲取不到,產生死鎖;
5. 軟中斷(包括tasklet和timer)和進程上下文共享數據,軟中斷中需要使用spin_lock/spin_unlock,進程上下文中需要使用spin_lock_bh/spin_unlock_bh;
軟中斷可以打斷進程上下文,所以進程上下文中訪問共享數據需要禁止中斷下半部;考慮如下情況,當進程上下文中獲取到鎖,之后被軟中斷打斷,軟中斷此時嘗試獲取鎖,因為鎖已經被進程上下文持有,軟中斷獲取不到,產生死鎖;
6. 多個相同軟中斷(不包括tasklet和timer)之間共享數據,需要使用spin_lock/spin_unlock;
多個相同的軟中斷可以在不同CPU上同時運行,他們之間訪問共享數據需要加鎖;
7. 多個不同軟中斷(不包括tasklet和timer)之間共享數據,需要使用spin_lock/spin_unlock;
多個不同的軟中斷可以在不同CPU上同時運行,他們之間訪問共享數據需要加鎖;
8. 多個相同tasklet(timer)之間共享數據,不存在這種情況;
tasklet(timer)同時只會有一個實例運行,在SMP環境也是如此,只有一個運行中的實例,不需要加鎖;
9. 多個不同tasklet(timer)之間共享數據,需要使用spin_lock/spin_unlock;
多個不同的tasklet(timer)是可以在不同CPU上同時運行的,他們之間訪問共享數據需要加鎖;
中斷打斷關系
1. 同類型的硬中斷同時只會有一個實例執行,SMP環境也是如此,同級中斷會被屏蔽掉;
2. 不同類型的硬中斷可以同時在不同CPU上同時執行;
3. 同一個CPU上的優先級高的硬中斷可以打斷優先級低的硬中斷;
4. 硬中斷可以打斷軟中斷,可以打斷進程上下文;
5. 相同軟中斷(不包括tasklet和timer)可以在不同CPU上同時執行;
6. 同一個CPU上的軟中斷(不包括tasklet和timer)是串行執行的,他們不會互相搶占;
7. 相同tasklet(timer)同時只會有一個實例執行,SMP環境也是如此;
8. 不同的tasklet(timer)可以同時在不同的CPU上同時執行;
9. 軟中斷可以打斷進程上下文;