在网络处理中使用自旋变量
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 处理程序向前推进。
我编写了一个与网络过滤器挂钩交互的内核模块。 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 处理程序向前推进。