在网络处理中使用自旋变体

Roo*_*nix 10 deadlock locking linux-kernel

我编写了一个与net-filter挂钩交互的内核模块.网络过滤器挂钩在Softirq上下文中运行.

我从softirq上下文以及Process上下文访问全局数据结构 "Hash Table".进程上下文访问是由sysctl引起的文件用于修改Hash表的内容.

我正在使用spinlock_irq_save.

这个spin_lock api的选择是否正确?在性能和锁定标准方面.

如果在另一个处理器上安排中断会发生什么?当前处理器锁已被进程上下文代码保持?

Jer*_*err 1

首先:

因此,根据上述所有详细信息,我得出的结论是我的软中断可以在两个内核上同时运行。

是的,这是正确的。您的软中断处理程序可能“同时在多个 CPU 上”执行。

您使用自旋锁的结论对我来说听起来是正确的。然而,这假设关键部分(即,在持有自旋锁的情况下执行的部分)具有以下属性:

  • 它不能休眠(例如,获取阻塞互斥锁)
  • 它应该尽可能短

一般来说,如果您只是更新哈希表,那么这里应该没问题。

如果 IRQ 处理程序尝试获取进程上下文所持有的自旋锁,那就没问题。只要您的进程上下文未在持有该锁的情况下休眠,该锁就应该在短时间内释放,从而允许 IRQ 处理程序继续前进。