04 irqbypass 与 Kconfig 构建机制与实现详解
1. virt/lib/irqbypass.c
配置:CONFIG_IRQ_BYPASS_MANAGER(tristate,virt/lib/Kconfig)。
作用:IRQ producer(如 VFIO 物理设备中断)与 consumer(如 KVM guest 注入路径)注册匹配,在硬件支持时建立 bypass 通道,减少 host 内核中转延迟。
核心结构(include/linux/irqbypass.h):
struct irq_bypass_producer:add_consumer/del_consumer/stop/startstruct irq_bypass_consumer:对称回调
1 | static LIST_HEAD(producers); |
irq_bypass_register_producer 时尝试与已有 consumer __connect;断开时 __disconnect。
模块:可 =m 独立加载;ARM64 KVM 配置 select IRQ_BYPASS_MANAGER。
版权 注明 Linaro — 与 ARM IRQ forwarding 场景一致,利于 RK3588 + VFIO 直通。
2. virt/kvm/Kconfig — 能力声明
该文件 不 直接 config KVM(在 arch/arm64/kvm/Kconfig),仅定义 HAVE_* 能力供架构 select:
| 符号 | 含义 |
|---|---|
HAVE_KVM_IRQCHIP |
内核 irqchip 模型 |
HAVE_KVM_IRQ_ROUTING |
GSI 路由表 |
HAVE_KVM_IRQFD |
eventfd 注入 |
HAVE_KVM_EVENTFD |
依赖 EVENTFD |
HAVE_KVM_DIRTY_RING |
脏页环 |
HAVE_KVM_DIRTY_RING_TSO |
仅 x86 强序 |
HAVE_KVM_DIRTY_RING_ACQ_REL |
弱序架构 |
KVM_MMIO / KVM_ASYNC_PF |
MMIO 合并 / 异步缺页 |
KVM_VFIO |
VFIO 桥 |
HAVE_KVM_IRQ_BYPASS |
与 bypass 管理器协作 |
KVM_COMPAT |
32 位 compat ioctl(ARM64 排除) |
注意:
1 | config KVM_COMPAT |
ARM64 无 KVM compat ioctl 路径。
3. arch/arm64/kvm/Kconfig 菜单
1 | menuconfig VIRTUALIZATION |
HAVE_KVM:在arch/arm64/Kconfigselect HAVE_KVM(CPU 具备虚拟化扩展时);NVHE_EL2_DEBUG:非 VHE EL2 对象调试;- pKVM 相关选项在 arch Kconfig 更深处理(见 05 文档)。
4. 构建依赖链
1 | arch/arm64/Kconfig: HAVE_KVM |
5. 与 drivers/vfio 的 Kconfig 交叉
drivers/vfio/Kconfig 也 source "virt/lib/Kconfig",保证 VFIO 与 KVM 可共用 IRQ_BYPASS_MANAGER。
6. RK3588 配置示例
1 | CONFIG_VIRTUALIZATION=y |
需确认 CPU 支持 Virtualization(/proc/cpuinfo 或 cpufeature);部分 裁剪 BSP 关闭以缩小内核。
7. 小结
- irqbypass.c:VFIO/KVM 中断直通匹配器;
- virt/kvm/Kconfig:架构无关能力字典;
- 实际 KVM 开关在
arch/arm64/kvm/Kconfig。
RK3588 直通中断优化需 SMMU + VFIO + IRQ_BYPASS 与硬件 GIC 支持一并考虑。
正在加载留言…