On Tue, 17 Mar 2020 15:50:39 -0400
Peter Xu wrote:
> VFIO is currently the only one left that is not using the generic
> function (kvm_irqchip_add_irqfd_notifier_gsi()) to register irqfds.
> Let VFIO use the common framework too.
>
> Follow up patches will introduce extra features for kvm irqfd, so that
> VFIO can easily leverage that after the switch.
>
> Reviewed-by: Eric Auger
> Reviewed-by: Cornelia Huck
> Signed-off-by: Peter Xu
> ---
> hw/vfio/pci.c | 37 +++--
> 1 file changed, 15 insertions(+), 22 deletions(-)
Reviewed-by: Alex Williamson
Acked-by: Alex Williamson
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index 98e0e0c994..09703362df 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -115,11 +115,7 @@ static void vfio_intx_eoi(VFIODevice *vbasedev)
> static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp)
> {
> #ifdef CONFIG_KVM
> -struct kvm_irqfd irqfd = {
> -.fd = event_notifier_get_fd(>intx.interrupt),
> -.gsi = vdev->intx.route.irq,
> -.flags = KVM_IRQFD_FLAG_RESAMPLE,
> -};
> +int irq_fd = event_notifier_get_fd(>intx.interrupt);
> Error *err = NULL;
>
> if (vdev->no_kvm_intx || !kvm_irqfds_enabled() ||
> @@ -141,7 +137,7 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev,
> Error **errp)
> }
>
> /* Get to a known interrupt state */
> -qemu_set_fd_handler(irqfd.fd, NULL, NULL, vdev);
> +qemu_set_fd_handler(irq_fd, NULL, NULL, vdev);
> vfio_mask_single_irqindex(>vbasedev, VFIO_PCI_INTX_IRQ_INDEX);
> vdev->intx.pending = false;
> pci_irq_deassert(>pdev);
> @@ -152,17 +148,18 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev,
> Error **errp)
> goto fail;
> }
>
> -/* KVM triggers it, VFIO listens for it */
> -irqfd.resamplefd = event_notifier_get_fd(>intx.unmask);
> -
> -if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, )) {
> +if (kvm_irqchip_add_irqfd_notifier_gsi(kvm_state,
> + >intx.interrupt,
> + >intx.unmask,
> + vdev->intx.route.irq)) {
> error_setg_errno(errp, errno, "failed to setup resample irqfd");
> goto fail_irqfd;
> }
>
> if (vfio_set_irq_signaling(>vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0,
> VFIO_IRQ_SET_ACTION_UNMASK,
> - irqfd.resamplefd, )) {
> + event_notifier_get_fd(>intx.unmask),
> + )) {
> error_propagate(errp, err);
> goto fail_vfio;
> }
> @@ -177,12 +174,12 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev,
> Error **errp)
> return;
>
> fail_vfio:
> -irqfd.flags = KVM_IRQFD_FLAG_DEASSIGN;
> -kvm_vm_ioctl(kvm_state, KVM_IRQFD, );
> +kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, >intx.interrupt,
> + vdev->intx.route.irq);
> fail_irqfd:
> event_notifier_cleanup(>intx.unmask);
> fail:
> -qemu_set_fd_handler(irqfd.fd, vfio_intx_interrupt, NULL, vdev);
> +qemu_set_fd_handler(irq_fd, vfio_intx_interrupt, NULL, vdev);
> vfio_unmask_single_irqindex(>vbasedev, VFIO_PCI_INTX_IRQ_INDEX);
> #endif
> }
> @@ -190,12 +187,6 @@ fail:
> static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev)
> {
> #ifdef CONFIG_KVM
> -struct kvm_irqfd irqfd = {
> -.fd = event_notifier_get_fd(>intx.interrupt),
> -.gsi = vdev->intx.route.irq,
> -.flags = KVM_IRQFD_FLAG_DEASSIGN,
> -};
> -
> if (!vdev->intx.kvm_accel) {
> return;
> }
> @@ -209,7 +200,8 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev)
> pci_irq_deassert(>pdev);
>
> /* Tell KVM to stop listening for an INTx irqfd */
> -if (kvm_vm_ioctl(kvm_state, KVM_IRQFD, )) {
> +if (kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state,
> >intx.interrupt,
> + vdev->intx.route.irq)) {
> error_report("vfio: Error: Failed to disable INTx irqfd: %m");
> }
>
> @@ -217,7 +209,8 @@ static void vfio_intx_disable_kvm(VFIOPCIDevice *vdev)
> event_notifier_cleanup(>intx.unmask);
>
> /* QEMU starts listening for interrupt events. */
> -qemu_set_fd_handler(irqfd.fd, vfio_intx_interrupt, NULL, vdev);
> +qemu_set_fd_handler(event_notifier_get_fd(>intx.interrupt),
> +vfio_intx_interrupt, NULL, vdev);
>
> vdev->intx.kvm_accel = false;
>