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

use of spin variants in network processing

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

我正在访问全局数据结构 "Hash Table" 来自软中断上下文和进程上下文。进程上下文访问是由于 sysctl 文件被用来修改 Hash-table.

的内容

我正在使用 spinlock_irq_save。

spin_lockapi这个选择对吗??在性能和锁定标准方面。

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

我认为这个解决方案是合适的。 Softirqs 反正 运行s 禁用抢占。要与进程共享数据,进程还必须禁用抢占和中断。在计时器的情况下,只减少条目的时间戳可以原子地完成,即时间戳变量必须是原子的。如果在另一个核心softirqs 运行 并且想要获取自旋锁,当它已经在另一个核心中时,它必须等待。

首先:

So, with all the above details I concluded that my softirqs can run concurrently on both cores.

是的,这是正确的。您的软中断处理程序可能会执行 "simultaneously on more than one CPU".

我认为你使用自旋锁的结论是正确的。但是,这假定临界区(即,在持有自旋锁的情况下执行的临界区)具有以下属性:

  • 它不能休眠(例如,获取阻塞互斥体)
  • 越短越好

一般来说,如果您只是更新哈希值 table,您应该没问题。

如果 IRQ 处理程序试图获取由进程上下文持有的自旋锁,那很好。只要您的进程上下文没有在持有该锁的情况下休眠,就应该在短时间内释放该锁,从而允许 IRQ 处理程序向前推进。