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 延后处理。
浙公网安备 33010602011771号