VFIO代码分析(8)MSI/MSIX中断处理

1 MSI/MSIX中断介绍

        对于PCIE设备,一般支持MSI中断和MSIX中断,MSI和MSIX中断都是通过对某个映射内存区域写数据(写的地址为Message Addr,写的数据为Message Data),从而触发基于信息的中断。MSI和MSIX的差异点主要有两点:

  1. 产生MSI中断的内存映射区在PCIE设备的配置空间,而产生MSIX中断的内存映射区在PCIE设备的BAR空间;
  2. MSI中断最多支持32个,且要求申请的中断连续,而MSIX中断可支持的比较多(2048),不要求申请的中断连续;

        MSIX中断相关寄存器如下所示:

        默认在PCIE设备的配置空间存在着BAR地址指针,MSIX CAP寄存器等。其中MSIX CAP寄存中指定MSIX对应的Table和PBA所对应的BAR空间号以及在BAR中偏移,Table数目(Message Control指定)。在Table空间存放着每个MSIX中断对应的Message Addr/Message Data/Vector control。在PBA空间存放着MSIX中断对应的pending BIT。

2 VFIO设备中断产生过程

        这里分为以下几部分:硬件层(包括VFIO设备即PCIE设备,ITS等),host内核(包括KVM内核部分),QEMU(包括KVM用户态部分),VM。

 具体步骤如下:

  1. QEMU通过对设备ioctl(VFIO_DEVICE_SET_IRQS)将VFIO设备中断与eventfd关联,并对VFIO设备申请中断并填充中断处理函数vfio_msihandle();
  2. QEMU中将guest要求的中断virq与eventfd关联,即当eventfd收到事件时,会往guest OS注入中断,这是通过QEMU对调用ioctl(KVM_IRQFD)实现的;
  3. Guest OS对可以产生MSI/MSIX中断的内存映射区(设备配置空间或设备BAR空间)发起写操作时,会产生VM Exit到QEMU,QEMU将写的数据填写到设备的BAR空间中MSIX对应的Table中,从而触发ITS产生中断;
  4. 当VFIO设备收到中断时,首先触发vfio-pci设备的中断处理函数vfio_msihandler(),它会调用eventfd_signal()向与virq关联的eventfd发送事件,eventfd收到事件后往guest OS注入中断;

代码分析

(1)MSIX能力的检查

        在vfio_realize()中会调用vfio_msix_early_setup()进行设备MSIX能力的检查,同时根据MSIX相关的寄存器值设置table_bar和pba_bar等。

(2)MSIX的设置

        在guest OS中对MSIX中断的设置(使能和禁用)最终会VM Exit到QEMU,通过函数vfio_pci_write_config()进行处理。该函数首先检查QEMU是否支持MSIX中断且访问的寄存器是否为MSIX相关,若都成功,再判断是使能还是禁用中断分别作处理。

         这里仅介绍使能MSIX中断部分,即函数vfio_msix_enable()。过程如下:

        首先定义eventfd,将host上的中断号与之关联,然后通过KVM_IRQFD将eventfd与虚拟机中的中断关联,然后调用VFIO_DEVICE_SET_IRQS进入host OS上注册中断及回调函数。

(3)中断的申请及注册

        当QEMU调用系统调用VFIO_DEVICE_SET_IRQS时,会进入到host OS中,它首先会为向PCIE子系统分配中断,然后注册中断并设置回调函数vfio_msihandler()。

 

        当VFIO硬件产生中断后,回调函数vfio_msi_handler()直接调用eventfd_signal()往中断关联的eventfd发送事件,最终会往虚拟机注入中断,从而实现了虚拟机中断的产生。 

 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值