嗨,大家好, 雖然做了一些我們的驅動器(上 PowerPC的目標)SMP移植我們觀察到一些行爲上,我需要你們 一些啓發:disable_local_irq和內核定時器
在在UP系統上執行local_irq_disable(),jiffies往往會凍結,即計數停止遞增。這是預期的嗎?我認爲 減法器中斷是'內部',並且不應得到 受local_irq_disable類型調用影響,因爲我期望它到 禁用本地IRQ中斷處理(外部中斷)。 系統當然凍結,然後也做了local_irq_enable()012ffjiffies計數跳轉,它似乎是補償local_irq_disable()和enable()調用之間的'時間 失效'。
在SMP系統(帶2個e500核心的P2020)上做同樣的工作, 的結果令人驚訝。首先,插入到 的模塊會執行此測試,並始終在覈心1上執行。此外,有時候 沒有看到「jiffies」計數器的凍結,有時我們發現它確實凍結。再次在計數凍結的情況下,在執行local_irq_enable()之後,它傾向於跳轉 。我不知道爲什麼這可能是 發生。 我們知道在SMP的情況下兩個內核是否都運行計劃計時器,因此 在某些情況下,我們看不到jiffie計數的凍結,或者僅在覈心0上顯示爲 ?
此外,由於內核定時器依靠「jiffies的」 - 這將意味着 沒有我們的內核定時器將火如果local_irq_disable()一直 做了什麼?在一個 SMP系統中的核心之一將會怎樣?
還有許多其他的問題,但我想這些就足以 在一般性討論開始差不多:)
TIA
NS從所做的實驗
一些更多評論。我在這個時間點的理解是,由於內核定時器依賴'jiffies'來觸發,所以當我發出local_irq_save()時,它們實際上不會在UP系統上觸發。事實上,我們的一些代碼是基於這樣一個假設,即當我發出local_irq_save()時,它確保可以保護本地處理器和內核定時器的中斷。
但是在SMP系統上執行同樣的實驗,即使兩個內核都執行local_irq_save(),jiffies也不會停止遞增,系統也不會凍結。這怎麼可能 ? LINUX是否使用其他機制觸發SMP系統中的定時器中斷或可能使用IPI?這也破壞了我們的假設,即local_irq_disable將保護系統免受至少在同一核心上運行的內核定時器的影響。
我們該如何編寫一個安全的異步事件代碼,即中斷和內核定時器,並且對於UP和SMP都是有效的。
因爲我在module_init中做了所有這些,所以我也在打印cpu(get_cpu())。現在令人難過的是,在我看到'jiffies'被卡住的情況下,我在覈心1上,在'jiffies'沒有卡住的情況下,我仍然處於核心1! –
奇怪的是,當我使用local_irq_save()/ restore()而不是local_irq_enable()/ disable()時,jiffies卡住的問題永遠不會發生,而不管我所在的核心是什麼。徹底迷茫! :( –
Victor,你同時運行多個核心是什麼意思?這是一個特性嗎?你能指點我一些關於它的文獻嗎? –