04 irqbypass 与 Kconfig 构建机制与实现详解

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_produceradd_consumer / del_consumer / stop / start
  • struct irq_bypass_consumer:对称回调
1
2
3
static LIST_HEAD(producers);
static LIST_HEAD(consumers);
static DEFINE_MUTEX(lock);

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
2
3
config KVM_COMPAT
def_bool y
depends on KVM && COMPAT && !(S390 || ARM64 || RISCV)

ARM64 KVM compat ioctl 路径。

3. arch/arm64/kvm/Kconfig 菜单

1
2
3
4
5
6
7
8
9
menuconfig VIRTUALIZATION
menuconfig KVM
depends on HAVE_KVM
select MMU_NOTIFIER
...
select IRQ_BYPASS_MANAGER
select HAVE_KVM_IRQ_BYPASS
config NVHE_EL2_DEBUG
config PROTECTED_NVHE_STACKTRACE
  • HAVE_KVM:在 arch/arm64/Kconfig select HAVE_KVM(CPU 具备虚拟化扩展时);
  • NVHE_EL2_DEBUG:非 VHE EL2 对象调试;
  • pKVM 相关选项在 arch Kconfig 更深处理(见 05 文档)。

4. 构建依赖链

1
2
3
4
5
arch/arm64/Kconfig: HAVE_KVM
→ arch/arm64/kvm/Kconfig: KVM + source virt/kvm/Kconfig
→ virt/kvm/Makefile.kvm → kvm-y 对象
→ arch/arm64/kvm/Makefile: + arm.o vgic/... hyp/
virt/Makefile → virt/lib/ → irqbypass.o

5. 与 drivers/vfio 的 Kconfig 交叉

drivers/vfio/Kconfigsource "virt/lib/Kconfig",保证 VFIO 与 KVM 可共用 IRQ_BYPASS_MANAGER

6. RK3588 配置示例

1
2
3
4
5
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_IRQ_BYPASS_MANAGER=y
# 可选模块
# CONFIG_KVM=m

需确认 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 支持一并考虑。

文章互动

阅读 --

留言

0 条留言

正在加载留言…