![](/img/trans.png)
[英]Can rcu_assign_pointer() be used between rcu_read_lock() and rcu_read_unlock()?
[英]Is it necessary invoke rcu_read_lock in softirq context
rcu_read_lock的實現是禁用搶占和屏障。 並且softirq上下文將不會被搶占。 因此有必要在softirq上下文中調用rcu_read_lock。 障礙重要嗎?
是的,即使在softirq上下文中,也有必要使用rcu_read_lock
來訪問受rcu保護的指針。
如您所指出的, rcu_read_lock
和softirqs的某些實現(例如:TINY_RCU)使它成為可能,即使您不使用rcu_read_lock
分隔rcu讀取側關鍵部分,也沒有損壞的風險。 但是,這不是rcu api的保證,由於特定的實現,僅是“ hack”。 這種破解可能會因使用rcu的其他實現而中斷(例如:PREEMPT_RCU)。
如果希望將softirqs視為顯式的rcu讀取側關鍵部分,則必須使用RCU調度的 api: Documentation / RCU / whatisRCU.txt
RCU主要作者寫的文章的以下部分直接解決了您的問題: RCU的要求第1部分:基礎-禁用搶占不會阻止寬限期
如果CONFIG_PROVE_RCU = y,我將添加在rcu_read_lock
之外執行rcu_dereference
代碼將觸發lockdep警告。
rcu_read_lock用於保護某些內核資源被同時修改而導致競爭條件錯誤。
資源必須防止的是:被兩個軟件任務/上下文同時使用和修改。
在Linux中,同時修改可能發生在以下任一情況中:
在單核CPU環境中,事件1)和2)仍然可能發生。 在修改關鍵資源的任務上,將產生一個軟件IRQ,進入軟件IRQ上下文,運行IRQ處理程序並同時修改同一資源。
出於文檔目的,在softirq
上下文中調用rcu_read_lock
是一個好主意,因此您和其他開發人員都知道此處使用了RCU保護的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.