linux arm irq (6): softirq

linux arm irq (6)

softirq


Author: Yangkai Wang
wang_yangkai@163.com
Coding in 2026/08/16
转载请注明author,出处.

softirq的执行流程

EL0 / EL1
   │
   │ Hardware IRQ
   ▼
ARM64 IRQ Exception Entry
   │
   ▼
保存 CPU 异常现场
   │
   ▼
进入 Linux IRQ Handling
   │
   │
   |
   │
   ▼  
GIC 获取/确认 INTID 
   │ 
   ▼  
irq_domain → Linux IRQ 
   │ 
   ▼   
irq_desc
   │ 
   ▼ 
IRQ Flow Handler 
   │
   │ 
   ├── 根据 IRQ 类型执行 mask / ack 等操作 
   │ 
   ▼ 
action->handler() 
   │ 
   ▼ 
Driver ISR
   │
   ├── 读取 Device IRQ Status
   │ 
   ├── 清除 Device/Peripheral IRQ Flag
   │      │ 
   │      └── W1C / 写寄存器 / 读清除等
   │ 
   ├── 处理必要的硬件中断工作 
   │  
   └── raise_softirq() / napi_schedule() 
   │  
   ▼  
返回 IRQ Flow Handler 
   │  
   ├── 根据 irq_flow_handler 类型 
   │     ├── unmask
   │     ├── ack 
   │     └── EOI
   │ 
   ▼ 
GIC EOI 
   │ 
   └── 写 GIC EOI / DIR 等完成对应中断状态处理 
   │ 
   ▼  
IRQ Handler 返回
   │ 
   ▼  
irq_exit() 
   │ 
   ├── 检查 SoftIRQ pending 
   │ 
   └── 有 pending ?  ───────────────────────────────  │
          │                                           │
          ├── YES ──► __do_softirq()                  NO
          │              │                            │
          │              ├── SoftIRQ 处理前/过程中     │
          │              │   根据实现重新开启 IRQ      │
          │              │                            │
          │              ├── NET_RX_SOFTIRQ           │
          │              │      ↓                     │
          │              │   net_rx_action()          │
          │              │      ↓                     │
          │              │   NAPI poll()              │
          │              │                            │
          │              └── SoftIRQ 完成             │
          │                                           │
          └───────────────────────────────────────────┘
          │
   ───────
   │
   │
   │
   ▼
进入 IRQ Exit Path
   │
   ▼
检查调度 / 返回用户态等
   │
   ▼
恢复异常现场
   │
   ▼
ERET
   │
   ▼
返回异常发生前的 EL0 / EL1



Hardware
   │
   ▼
GIC
   │
   ▼
ARM64 IRQ Exception Entry
   │
   ├── 保存 CPU Context
   │
   └── 进入 IRQ 异常上下文
   │
   ▼
Linux IRQ Entry
   │
   ▼
irq_domain
   │
   ▼
irq_desc
   │
   ▼
IRQ Flow Handler
   │
   ├── 根据 IRQ 类型执行:
   │      ack / mask / ...
   │
   ▼
action->handler()
   │
   ▼
Driver ISR
   │
   ├── Read Device IRQ Status
   │
   ├── Clear Device IRQ Flag
   │
   └── raise_softirq() / napi_schedule()
   │
   ▼
返回 IRQ Flow Handler
   │
   ├── 根据 IRQ 类型执行:
   │      unmask / EOI / ...
   │
   └── irq_chip->irq_eoi()
              │
              ▼
            GIC EOI
              │
              ▼
        IRQ handling 完成
              │
              ▼
           irq_exit()
              │
              ▼
       SoftIRQ pending ?──────────────────────
          │                                   │
        YES                                   NO
          │                                   │
          ▼                                   │
     __do_softirq()                           │
          │                                   │
          ├── SoftIRQ 执行过程中               |
          │   允许新的 Hardware IRQ 响应       |
          │                                   |
          ├── SoftIRQ handler                 |
          │                                   |
          └── 完成 SoftIRQ                    |
          │                                   |
          └───────────────┐───────────────────
                          │
                          ▼
                  IRQ Exit / Return Path
                          │
                          ▼
                  检查调度等状态
                          │
                          ▼
                    Restore Context
                          │
                          ▼
                         ERET
                          │
                          ▼
                  返回 EL0 / EL1


irq_exit() 中并不是每次都会直接执行 SoftIRQ,SoftIRQ负载高的情况下,也可能进入 ksoftirqd 延后处理。



posted @ 2026-08-16 21:08  王阳开  阅读(1)  评论(0)    收藏  举报