簡體   English   中英

如何保護RCU讀卡器部分免於搶占?

[英]How RCU reader section is protected from preemption?

(來自LWN上的一篇文章)

 1 rcu_read_lock();
 2 list_for_each_entry_rcu(p, head, list) {
 3   do_something_with(p->a, p->b, p->c);
 4 }
 5 rcu_read_unlock();

RCU更新操作將執行synchronize_rcu()以斷言每個CPU切換上下文,因此每個RCU讀取器已完成它的工作。 但RCU必須依靠讀者不被搶先一步。 事實上,LWN接着說:

雖然這種簡單的方法適用於在RCU讀取端關鍵部分禁用搶占的內核,換句話說,對於非CONFIG_PREEMPT和CONFIG_PREEMPT內核,它不適用於CONFIG_PREEMPT_RT實時(-rt)內核。

我理解對於非CONFIG_PREEMPT內核禁用搶占,但為什么CONFIG_PREEMPT內核也可以呢?

在CONFIG_PREEMPT內核上沒問題,因為在任務被搶占之前需要注意完成rcu read critical部分。 調度程序檢查當前任務是否在rcu讀取臨界區中,如果是,則增強其優先級以使其完成臨界區。 有關詳細信息,請參閱此文章: http//lwn.net/Articles/220677/

我們需要RCU用於CONFIG_PREEMPT內核。 如果沒有先發制人或阻止,那么我們就不會在同步混亂中。 RCU實現有兩種類型:

1) Non-preemptible RCU implementation
2) Preemptible RCU implementation

當在一個CPU上調用synchronize_rcu()而其他CPU在RCU讀取端關鍵部分內時,則同步_rcu()保證阻塞,直到所有其他CPU退出其關鍵部分。 類似地,如果在一個CPU上調用call_rcu()而其他CPU在RCU讀取端關鍵部分內,則調用相應的RCU回調,直到所有其他CPU退出其關鍵部分。

在不可搶占的RCU實現中,在RCU讀取端關鍵部分中阻塞是非法的。 在CONFIG_PREEMPT內核構建中的可搶占RCU實現(PREEMPT_RCU)中,RCU讀取端關鍵部分可能被搶占,但顯式阻塞是非法的。 最后,在實時(帶有-rt補丁集)內核構建的可搶占RCU實現中,RCU讀取端關鍵部分可能被搶占並且它們也可能阻塞,但僅在獲取受優先級繼承影響的自旋鎖時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM