中断中的资源锁定

中断中的资源锁定

我有一个内核模块,在数据包路由的不同点具有 netfilter 挂钩,并且这些挂钩使用共享资源。此外,该模块有一个可写入的字符设备,这也会影响这些资源。

我不确定当不同的处理程序访问这些资源时是否需要使用锁。我读到中断无法休眠,这是否意味着我可以保证我的处理程序(挂钩和读取处理程序)将依次执行,或者我是否需要使用锁来防止从不同的函数同时访问相同的资源?

谢谢。

答案1

根据您编写的内容以及它使用的数据结构,很难说,但是:

我读到中断无法休眠,这是否意味着我可以保证我的处理程序(挂钩和读取处理程序)将依次执行,或者我是否需要使用锁来防止从不同的函数同时访问相同的资源?

虽然确实不允许中断休眠,但您还必须考虑与此数据结构连接的中断也可以同时在另一个 CPU 上运行,或者另一个中断可能会堆栈在当前正在处理的中断之上,从而将其占用暂时关闭CPU。无论哪种情况,您都需要处理死锁情况以及两个线程竞争写入/读取的情况。

所以是的,没有理由仅仅根据您所写的内容就相信您不需要某种同步机制。根据您的具体情况,如果您禁用该 CPU 上的进一步中断(例如,在 percpu 变量的情况下),您可能会发现同步更简单。

适当的机制是什么将取决于您要保护对什么的访问以及这可能有多长和昂贵,尽管由于您正在执行中断,所以您受到一定的限制,因为您只能真正选择非阻塞原语。

相关内容