2012-09-27 18 views
0

tl; dr:即使指定了超時,讀取文件描述符(指向procfs內核模塊)的選擇調用是否可以無限期地結束阻塞?可以選擇被內核模塊不間斷地阻塞嗎?

我正在嵌入式Linux系統中工作,我們有幾個內核模塊來管理對服務的訪問。一個這樣的模塊監視VLAN的狀態以進行更改。它將接口導出到/proc下的目錄中。一個進程可以通過嘗試從在那裏創建的proc_file讀取來綁定通知到這個模塊。當發生變化時,模塊將在該接口上提供數據,並且調用者的讀取將隨信息一起返回。

這似乎是造成問題的原因,因爲內核模塊會阻止調用者使用內核信號量(struct semaphore)進行讀取。我認爲這導致呼叫者進入「D」或不間斷的阻塞狀態。這個過程不能被正確的終止,如果終止,它仍然不會被終止。它不僅不存在,而且也不釋放其資源。

我認爲這是一個「不這樣做」的情況,但我不是內核模塊的專家。看來更好的方法是在模塊中使用螺旋鎖或wait_event_interruptable。更改這些傳統的內核模塊是一件大事,所以我嘗試在讀取之前通過選擇FD來解決它。但是,這似乎也無限期阻止。

有沒有辦法糾正這種情況,而不改變內核模塊中使用的互斥?

+0

如果您的模塊導致進程在select()調用時阻塞爲零超時,那麼它會被真正徹底地破壞。唯一的補救辦法是修復它。 –

+0

@ n.m。 - 是的,它絕對好像被打破了。我認爲當產品遷移到嵌入式Linux時,很多這些內核模塊都是急速開發的。開發人員似乎並不瞭解阻止呼叫者的正確方法。謝謝! – agentchuck

回答

1

Linux允許內核模塊執行各種破壞正確程序的惡意事件。恐怕沒有比「不加載錯誤或惡意模塊」更好的答案了。在你的情況,因爲你需要他們,你可能需要修復它們。

+0

謝謝!這是我們平臺上沒有人維護和廣泛使用的模塊之一,因此難以改變。但你是對的......似乎沒有任何辦法解決它。 – agentchuck

相關問題