首页 新闻 会员 周边

求助进入软中断之前获取的锁叫什么?

0
悬赏园豆:50 [待解决问题]

我的实验环境是Linux6.1,并且已经打了实时补丁preempt_rt,目的是提高网络方面的实时性。

我查阅了相关论文,看到论文中提到了一个锁,如下图箭头所示处(原文链接在这里:https://ieeexplore.ieee.org/document/8501912/citations?tabFilter=papers#citations)

论文表明,当网卡驱动的中断处理线程进入CPU的softirq机制时,该线程会尝试获取softirq_lock锁。
但是,我没有在源码中找到叫softirq_lock名字的变量,有无大佬能指点一下,这个锁在源码中叫什么?谢谢了!!这已经困扰我两个月了

wendy_ann的主页 wendy_ann | 初学一级 | 园豆:74
提问于:2024-04-19 22:24
< >
分享
所有回答(2)
0

在 Linux 内核中,软中断处理程序(softirq)并不会显式地获取一个叫做 softirq_lock 的锁。软中断处理程序是在中断上下文中执行的,它们是由内核中断处理程序或者其他内核代码触发的。因此,在软中断处理程序中,通常不需要额外的锁来保护共享资源,因为软中断是在中断上下文中执行的,无法被抢占。

然而,在 Linux 内核中,有一些全局的锁,它们可能在软中断处理程序中被获取。这些锁通常用于保护共享资源,以防止多个 CPU 同时访问。具体使用哪个锁取决于具体的内核代码和实现细节。

在你的情况下,可能论文中提到的 softirq_lock 是一个抽象的概念,用来表示软中断处理程序在处理软中断时需要保护共享资源的情况。实际上,在 Linux 内核源码中,这个锁可能具体是某个特定数据结构的自旋锁、互斥锁或者原子操作。你可能需要更深入地研究 Linux 内核的网络子系统的相关代码,以了解在软中断处理程序中确切使用了哪些锁。

Technologyforgood | 园豆:5686 (大侠五级) | 2024-04-20 21:06
0

在Linux源码中,softirq_lock锁在源码中并不直接以这个名字出现。实际上,在Linux内核中,softirq_lock锁被分成了两个锁:一个是用于非实时(non-RT)softirq处理的锁,另一个是用于实时(RT)softirq处理的锁。这种分离的softirq锁机制可以有效避免软中断处理中的优先级倒置问题;非RT和RT softirq锁可以在softirq机制中找到,非RT softirq锁被称为softirq_lock;而RT softirq锁被称为rt_softirq_lock。这两个锁分别用于处理非实时softirq和实时softirq。

VVWEBWEB | 园豆:204 (菜鸟二级) | 2024-04-26 11:29

softirq_lock 变量通常通过各种锁机制管理,确保在不同CPU核心和执行上下文中正确同步访问:
自旋锁(Spin Locks):通常使用 spin_lock() 和 spin_unlock() 机制来保护上下文中访问的共享数据。如果硬件中断处理程序与软中断共享数据,可能用 spin_lock_irq(),该锁在持有时会禁用CPU中断,防止在同一CPU上处理软中断。
软中断标志(Softirq Flags):通过每个CPU设置的标志来影响。从而决定是否推迟额外的软中断处理,避免影响用户空间操作。例如,当 ksoftirqd 线程被唤醒时,可能会设置一个标志,确保任何后续的进程上下文中的软中断处理检查此标志,并在设置时跳过处理。

加锁与解锁:在软中断可能被硬件中断中断或可能与硬件中断共享资源的上下文中,内核使用各种锁定原语来处理并发。在这些情况下,常用的是 spin_lock_irqsave(),因为它可以在禁用中断之前保存中断状态,使其适合在硬件中断处理程序和软中断中使用。

处理多个软中断:通常使用 spin_lock() 来确保在不同CPU上运行的其他软中断或任务小程序不能同时访问相同的数据。

这些机制通过确保代码的关键部分不会被多个处理器同时执行,

支持(0) 反对(0) VVWEBWEB | 园豆:204 (菜鸟二级) | 2024-04-26 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册