我正在开发一个内核模块,它在softirq(netfilter预路由挂钩)和用户上下文(在ioctl调用中)之间共享数据结构。
阅读此link后,我知道我需要在修改数据时使用spin_lock_bh
或spin_lock_irqsave
禁用用户上下文中的软件中断,并重新启用它们一次共享数据的操作已完成。
但是,我不确定是否需要在softirq处理函数中获取锁定。 我是否也需要在这里抓住锁(使用spin_lock)?
据我了解,如果与另一个softirq或hardirq共享数据,我只需要在softirq处理程序中使用自旋锁。我的理解是否正确?
答案 0 :(得分:4)
如果您与任何代码共享数据,您必须获得锁定,这可以在同一时间执行。内核可能同时执行你的softirq和你的ioctl处理程序,所以你必须获得一个锁。
使用spin_lock_bh
或spin_lock_irqsave
禁用中断时,仅在当前处理器上禁用中断。因此,处理另一个中断是可以的。