这些天,我正在研究内核内部网络代码,尤其是RPS代码。你知道,有很多关于它的功能。但我主要关注一些关于SMP 队列处理的功能,例如enqueue_to_backlog
和process_backlog
.
enqueue_to_backlog
我想知道通过使用两个函数 -和-来同步两个内核(或单核)process_backlog
。
在该函数中,A core(A) 持有spin_lock
另一个 core(B) 的 a,用于将数据包排队进入input_pkt_queue
并调度 core(B) 的 napi。并且A Core(B) 还拥有一个spin_lock
用于拼接input_pkt_queue
到process_queue
core(B) 并自行删除 napi 时间表。我知道spin_lock
应该保留以防止两个核心在处理队列期间相互访问同一个队列。
但我不明白为什么spin_lock
用local_irq_disable
(或local_irq_save
)调用。我认为rps_lock
当中断(TH)抢占当前上下文(softirq,BH)时,中断上下文(TH)无法访问队列或核心(B)。- 当然,可以访问 napi 结构以通过 TH 调度 napi,但它会禁用 irq,直到排队数据包 -所以我想知道为什么spin_lock
使用 irq disable 调用。
我认为其他 BH(例如 tasklet)不可能抢占当前上下文(napi,softirq)。这是真的吗?而且我想知道 local_irq_disable 是禁用所有核心 irq 还是仅从字面上禁用当前核心的 irq?实际上,我读过一本关于内核开发的书,但我认为我对抢占的理解不够。
能解释一下为什么 rps 程序使用spin_lock
with的原因local_irq_disable
吗?