5

我正在开发一个内核模块,它在 softirq(netfilter 预路由钩子)和用户上下文(在 ioctl 调用中)之间共享数据结构。

阅读此链接后,我知道我需要在修改数据(使用spin_lock_bhspin_lock_irqsave)时禁用用户上下文中的软件中断,并在完成对共享数据的操作后重新启用它们。

但是,我不确定是否需要在 softirq 处理函数中获取锁。我是否也需要在这里抓住锁(使用 spin_lock)?

据我了解,如果与另一个 softirq 或 hardirq 共享数据,我只需要在 softirq 处理程序中使用自旋锁。我的理解正确吗?

4

1 回答 1

4

如果您与任何可以同时执行的代码共享数据,您必须获得锁。内核可能会同时执行您的 softirq 和 ioctl 处理程序,因此您必须获得锁。

当您使用spin_lock_bh或禁用中断时spin_lock_irqsave,仅在当前处理器上禁用中断。所以,处理另一个中断是可以的。

于 2013-07-11T19:28:29.797 回答