2015-08-27 36 views
2

(從文章LWN如何防止RCU閱讀器部分被搶佔?

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更新操作,以維護每個CPU做synchronize_rcu()切換的背景下,因此各RCU-讀者已經完成了它的任務。但RCU必須依靠讀者不被搶佔。事實上,LWN說未來:

雖然這個簡單的方法也適用於在搶佔 跨越RCU讀側臨界區禁止,換句話說,對於 非CONFIG_PREEMPT和CONFIG_PREEMPT內核內核,它不爲 工作CONFIG_PREEMPT_RT實時(-rt)內核。

我明白搶佔非CONFIG_PREEMPT內核被禁用,但爲什麼是OK的CONFIG_PREEMPT內核呢?

回答

2

因爲小心地完成RCU的任務被搶佔之前閱讀關鍵部分是對CONFIG_PREEMPT內核確定。調度程序檢查當前任務是否在rcu中讀取關鍵部分,如果是,則會提高其優先級,以便完成關鍵部分。有關更多細節,請參閱此文章:http://lwn.net/Articles/220677/

1

我們需要對RCU CONFIG_PREEMPT內核。如果沒有搶佔或阻塞,那麼我們不會在這個同步混亂。有兩種類型的RCU實現:

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

當synchronize_rcu()被調用一個CPU上,而其他CPU 是內RCU讀側臨界區,則 synchronize_rcu()是保證阻塞,直到畢竟其他 CPU退出其關鍵部分。類似地,如果call_rcu()被調用 一個CPU上,而其它的CPU是RCU讀側臨界 段,對應RCU回調調用被推遲 直到所有其它CPU退出其臨界段後內。

在非搶佔RCU實現它是非法在RCU讀側臨界區阻斷,與此同時。 在搶佔RCU實現(PREEMPT_RCU)在CONFIG_PREEMPT 內核構建,RCU讀側的關鍵部分可以被搶佔, 但明確的阻塞是非法的。最後,RCU 實時(使用-rt patchset)內核構建時,RCU 讀取端臨界區可能被搶佔,它們也可能被阻塞,但僅當獲取受優先級繼承影響的自旋鎖時纔會被阻塞,但是 。

+0

爲什麼引用說「這種簡單的方法適用於在RCU讀取端臨界區禁用搶佔的內核,換句話說,對於非CONFIG_PREEMPT和CONFIG_PREEMPT內核」。當內核是CONFIG_PREEMPT時,這種方法會工作嗎?爲什麼此報價表示禁止CONFIG_PREEMPT內核的搶佔? – 4pie0