On Wed, 15 May 2019 18:22:54 +0800 Li Qiang <liq...@gmail.com> wrote:
> Auger Eric <eric.au...@redhat.com> 于2019年5月15日周三 下午6:16写道: > > > Hi, > > > > On 5/15/19 12:01 PM, Li Qiang wrote: > > > Hello Paolo, Alex and all, > > > > > > In vfio_intx_enable_kvm(qemu) I see we associate a resamplefd with the > > > umask function(vfio_pci_intx_unmask_handler in linux). > > > > > > irq_set = g_malloc0(argsz); > > > irq_set->argsz = argsz; > > > irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | > > VFIO_IRQ_SET_ACTION_UNMASK; > > > irq_set->index = VFIO_PCI_INTX_IRQ_INDEX; > > > irq_set->start = 0; > > > irq_set->count = 1; > > > pfd = (int32_t *)&irq_set->data; > > > > > > *pfd = irqfd.resamplefd; > > > > > > ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_SET_IRQS, irq_set); > > > > > > I know this resamplefd is triggered when the interrupt controller > > receives > > > an EOI and > > > then we unmask and re-enabled the VFIO devices' interrupt. > > > > > > So I think there there must be a mask process(so we unmask it later), I > > > mean there must a > > > call of function vfio_pci_set_intx_mask(in linux). > > > > > > What I can't understand is when this process(mask VFIO devices' > > interrupt) > > > occurs? > > It is done in the VFIO interrupt handler: > > vfio_intx_handler/disable_irq_nosync for VFIO PCI (vfio_pci_intrs.c) or > > vfio_automasked_irq_handler (vfio_platform_irq.c) for VFIO PLATFORM . > > > > > Thanks Eric, > > Got it. > I just forget to look at the interrupt handler(vfio_intx_handler)! Importantly, PCI INTx interrupts are exposed in VFIO_DEVICE_GET_IRQ_INFO with the VFIO_IRQ_INFO_AUTOMASKED flag which indicates that the interrupt is masked in the host kernel when it is signaled via the eventfd and userspace is only required to perform an unmask operation to receive the next interrupt. Thanks, Alex