Linux 是否有必要在softirq上下文中调用rcu_read_lock

Linux 是否有必要在softirq上下文中调用rcu_read_lock,linux,kernel,rcu,Linux,Kernel,Rcu,rcu_读取_锁的实现是禁用抢占和屏障。并且softirq上下文不会被抢占。 因此,有必要在softirq上下文中调用rcu读取锁定。屏障重要吗?rcu read\u锁是为了保护一些同时被修改的内核资源,从而导致争用条件错误 资源必须防止的是:被两个软件任务/上下文同时使用和修改 在Linux中,同时进行的修改可能发生在: 从一个任务切换到另一个任务 从任务到IRQ上下文的上下文切换 不同VCPU内核中任务的并发访问 事件在单核CPU环境中,1)和2)仍然可能发生。 在修改关键资源的任务中,软件

rcu_读取_锁的实现是禁用抢占和屏障。并且softirq上下文不会被抢占。
因此,有必要在softirq上下文中调用rcu读取锁定。屏障重要吗?

rcu read\u锁是为了保护一些同时被修改的内核资源,从而导致争用条件错误

资源必须防止的是:被两个软件任务/上下文同时使用和修改

在Linux中,同时进行的修改可能发生在:

  • 从一个任务切换到另一个任务
  • 从任务到IRQ上下文的上下文切换
  • 不同VCPU内核中任务的并发访问
  • 事件在单核CPU环境中,1)和2)仍然可能发生。
    在修改关键资源的任务中,软件IRQ提升,输入软件IRQ上下文,运行IRQ处理程序并同时修改同一资源。

    最好在
    软IRQ
    上下文中调用
    rcu read\u lock
    ,以便文档使用,这样您和其他开发人员就知道rcu
    此处使用受保护的数据。

    是的,有必要使用
    rcu\u read\u lock
    访问受rcu保护的指针,即使在softirq上下文中也是如此

    正如您所指出的,
    RCU\u read\u lock
    和softirq的一些实现(例如:TINY\u RCU)使得即使您不使用
    RCU\u read\u lock
    来划分RCU read side临界部分,也不会有损坏的风险。然而,这并不是RCUAPI的保证,只是因为具体的实现而带来的“黑客攻击”。这种黑客可能会使用不同的rcu实现(例如:抢占rcu)来破解

    如果您希望将SoftIRQ视为显式rcu读取端关键部分,则必须使用rcu sched api:

    RCU的主要作者撰写的一篇文章的以下部分直接解决了您的问题:


    我想补充一点,如果CONFIG\u PROVE\u rcu=y,则在
    rcu read\u lock
    之外执行
    rcu\u dereference
    的代码将触发lockdep警告。

    但该软件不会被其他软件和正常任务抢占。如果可以同时访问资源,则需要使用锁对其进行保护。例如,一个线程正在修改一个资源,而资源处于准状态,软件irq进入并修改该资源,从而导致争用条件。此外,可能有多个VCPU同时运行软件irq和任务。如果资源不仅被软件irq访问,那么应该保护它不被同时访问。但我的问题是,在软件irq环境中,rcu read_锁是必要的吗?因为rcu读取锁定只实现抢占禁用。哦,我错过了这一部分。如果从下半部分读取资源,则必须使用宏:rcu_read_lock_bh。此宏禁用线程和下半部分的抢占。