Linux kernel 在SMP系统上并行运行同一中断的多个实例

Linux kernel 在SMP系统上并行运行同一中断的多个实例,linux-kernel,linux-device-driver,interrupt,interrupt-handling,Linux Kernel,Linux Device Driver,Interrupt,Interrupt Handling,在linux的多处理器系统上,是否可以同时运行同一中断的多个实例? 如果不可能,为什么我们需要使用旋转锁在中断处理程序之间进行同步 谢谢 SMP架构上的Venkatesh高级可编程中断控制器(APIC)用于将中断从外围设备路由到CPU APIC,基于 1。路由表(其中中断关联设置为特定处理器), 2.中断的优先级, 3.CPU上的负载 例如,考虑在IRQ线32接收中断,这通过APIC,中断被路由到一个特定的CPU,现在考虑CPU0,这个中断行被屏蔽,直到ISR被处理,这意味着如果ISR执行正在进

在linux的多处理器系统上,是否可以同时运行同一中断的多个实例? 如果不可能,为什么我们需要使用旋转锁在中断处理程序之间进行同步

谢谢
SMP架构上的Venkatesh高级可编程中断控制器(APIC)用于将中断从外围设备路由到CPU

APIC,基于
1。路由表(其中中断关联设置为特定处理器),
2.中断的优先级,
3.CPU上的负载

例如,考虑在IRQ线32接收中断,这通过APIC,中断被路由到一个特定的CPU,现在考虑CPU0,这个中断行被屏蔽,直到ISR被处理,这意味着如果ISR执行正在进行中,则不会得到相同类型的中断。


一旦处理了ISR,只有在中断线为将来的中断解除屏蔽时,才能在linux的多处理器系统上同时运行同一中断的多个实例。

中断处理程序通常是序列化的。也就是说,只有一个处理程序实例正在运行(在任何一个处理器上)。在运行时,如果再次生成相同类型的中断,则仅在当前中断完成后才对其进行处理,从而序列化。当一个核心执行“this”处理程序时,另一个核心可能会为不同实例的处理程序提供服务

为什么我们需要使用旋转锁在中断处理程序之间进行同步?

即使在必须保护数据不受其他线程影响的情况下(例如,下半部、用户读/写处理程序函数等),也会使用自旋锁。 场景可能是这样的:

my_ISR()
{
    lock(&l);
    // data is accessed here
    unlock(&l);    
}

my_other_thread()
{
    lock(&l);
    // same data is accessed here
    unlock(&l);
}

来自Sreekrishnan Venkateswaran的《设备驱动程序概要》一书,“您不需要设计可重入的中断处理程序。当中断处理程序运行时,相应的IRQ被禁用,直到处理程序返回。因此,与流程上下文代码不同,同一处理程序的不同实例不会在多个处理器上同时运行。“从上面的语句中,当一个内核已经在为该中断执行处理程序时,是否可以由任何内核处理另一个中断?如果没有第二个中断处理程序实例在运行,那么为什么我们需要自旋锁?当前处理器上对应的IRQ”“已禁用。APIC仍然可以将IRQ驱动到另一个核心。是的,在任何内核处理您的中断时,都可以处理该内核的另一个中断。正如我已经提到的,即使相同的实例可能不会一起运行,也有可能与其他线程共享数据,例如下半部分(可能在与处理程序并行的其他内核上运行)@raghav3276因此,如果你说除了已经被服务的中断之外,其他任何内核都可以处理另一个中断,那么这是否意味着与一个中断相对应的每个ISR(上半部分)在其分配的每个内核中作为单独的内核线程并行运行?我这里只说上半场。因此,当APIC驱动第二个IRQ时,内核将spwan一个新的内核线程/进程,以便在尚未占用的内核上运行其相应的ISR,为什么我们需要自旋锁来同步,因为没有两个相同的中断处理程序同时运行?自旋锁用于在上半部分和下半部分处理之间进行同步