可以选择被内核模块无中断地阻止吗?

时间:2012-09-27 02:42:22

标签: c linux linux-kernel

tl; dr:对读取文件描述符(指向procfs内核模块)的select调用是否可以无限期地阻塞,即使指定了超时?

我在嵌入式Linux系统中工作,我们有几个内核模块来管理对服务的访问。一个这样的模块监视VLAN的状态以进行更改。它将接口导出到/proc下的目录中。进程可以通过尝试从在那里创建的proc_file读取来绑定通知给该模块。当有更改时,模块将提供该接口上的数据,并且调用者的读取将返回信息。

这似乎导致了问题,因为内核模块使用内核信号量(struct semaphore)阻止调用者的读取。我认为这会导致调用者进入“D”或不间断阻塞状态。该过程不能被正确杀死,如果终止则仍然无效。它不仅已经不存在,而且还没有释放其资源。

我认为这是“不要那样做”的情况,但我不是内核模块方面的专家。似乎更好的方法是在模块中使用spinlock或wait_event_interruptable。更改这些遗留内核模块是一个大问题,因此我尝试通过在执行读取之前使用select检查FD来解决它。但是,这似乎也无限期地阻止了。

有没有办法在不改变内核模块中使用的静音的情况下纠正这个问题?

1 个答案:

答案 0 :(得分:1)

Linux允许内核模块执行各种破坏正确程序的恶意内容。我担心没有比“不加载错误或恶意模块”更好的答案。在您的情况下,因为您需要它们,您可能需要修复它们。