diff '--color=auto' -Naur --strip ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c ../nv-patch/kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c --- ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 2021-04-18 18:57:37.000000000 +0530 +++ ../nv-patch/kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.c 2021-06-28 05:13:41.641377520 +0530 @@ -24,6 +24,7 @@ #include #include #include +#include #include "nvstatus.h" #include "nv-misc.h" #include "nv-linux.h" @@ -2666,19 +2667,18 @@ static int vgpu_save_fd(vgpu_dev_t *vgpu_dev, int fd, NvU32 index) { - struct fd irqfd; + struct eventfd_ctx *evt; - irqfd = fdget(fd); - if (!irqfd.file) - return -EBADF; + evt = eventfd_ctx_fdget(fd); + if (IS_ERR(evt)) + return PTR_ERR(evt); if (index == VFIO_PCI_INTX_IRQ_INDEX) - vgpu_dev->intr_info.intx_file = irqfd.file; - else if (index == VFIO_PCI_MSI_IRQ_INDEX) - vgpu_dev->intr_info.msi_file = irqfd.file; + vgpu_dev->intr_info.intx_evtfd = evt; + else if (index == VFIO_PCI_MSI_IRQ_INDEX) + vgpu_dev->intr_info.msi_evtfd = evt; vgpu_dev->intr_info.index = index; - fdput(irqfd); return 0; } @@ -2687,11 +2687,8 @@ static irqreturn_t vgpu_msix_handler(int irq, void *arg) { vgpu_dev_t *vgpu_dev = (vgpu_dev_t *)arg; - struct file *pfile = NULL; - mm_segment_t old_fs; - NvU64 val = 1; + struct eventfd_ctx *evt = NULL; int ret = 0; - loff_t offset = 0; int i; unsigned long eflags; @@ -2699,21 +2696,16 @@ { if (vgpu_dev->intr_info.allocated_irq[i] == irq) { - pfile = vgpu_dev->intr_info.msix_fd[i].file; + evt = vgpu_dev->intr_info.msix_evtfd[i]; break; } } - if (pfile && pfile->f_op && pfile->f_op->write) + if (evt) { - old_fs = get_fs(); - set_fs(KERNEL_DS); - NV_SAVE_FLAGS(eflags); - ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); + ret = eventfd_signal(evt, 1); NV_RESTORE_FLAGS(eflags); - - set_fs(old_fs); } return IRQ_HANDLED; @@ -2724,23 +2716,24 @@ { struct pci_dev *pdev; int irq = INVALID_IRQ, ret; - struct fd irqfd; + struct eventfd_ctx *evt; pdev = to_pci_dev(NV_GET_MDEV_PARENT(vgpu_dev->mdev)); - if (vgpu_dev->intr_info.msix_fd[vector].file) + if (vgpu_dev->intr_info.msix_evtfd[vector]) { free_irq(vgpu_dev->intr_info.allocated_irq[vector], vgpu_dev); - vgpu_dev->intr_info.msix_fd[vector].file = NULL; + eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[vector]); + vgpu_dev->intr_info.msix_evtfd[vector] = NULL; vgpu_dev->intr_info.allocated_irq[vector] = INVALID_IRQ; } if (fd < 0) return 0; - irqfd = fdget(fd); - if (!irqfd.file) - return -EBADF; + evt = eventfd_ctx_fdget(fd); + if (IS_ERR(evt)) + return PTR_ERR(evt); if (vector < 0 || vector >= vgpu_dev->intr_info.num_ctx) return -EINVAL; @@ -2756,7 +2749,7 @@ vgpu_dev->intr_info.allocated_irq[vector] = irq; - vgpu_dev->intr_info.msix_fd[vector]= irqfd; + vgpu_dev->intr_info.msix_evtfd[vector]= evt; return 0; } @@ -2773,7 +2766,12 @@ if (vgpu_dev->intr_info.allocated_irq[i] != INVALID_IRQ) { free_irq(vgpu_dev->intr_info.allocated_irq[i], vgpu_dev); - vgpu_dev->intr_info.msix_fd[i].file = NULL; + + if (vgpu_dev->intr_info.msix_evtfd[i]) { + eventfd_ctx_put(vgpu_dev->intr_info.msix_evtfd[i]); + vgpu_dev->intr_info.msix_evtfd[i] = NULL; + } + vgpu_dev->intr_info.allocated_irq[i] = INVALID_IRQ; } } @@ -2862,7 +2860,10 @@ { if (flags & VFIO_IRQ_SET_DATA_NONE) { - vgpu_dev->intr_info.intx_file = NULL; + if (vgpu_dev->intr_info.intx_evtfd) { + eventfd_ctx_put(vgpu_dev->intr_info.intx_evtfd); + vgpu_dev->intr_info.intx_evtfd = NULL; + } break; } @@ -2887,7 +2888,10 @@ { if (flags & VFIO_IRQ_SET_DATA_NONE) { - vgpu_dev->intr_info.msi_file = NULL; + if (vgpu_dev->intr_info.msi_evtfd) { + eventfd_ctx_put(vgpu_dev->intr_info.msi_evtfd); + vgpu_dev->intr_info.msi_evtfd = NULL; + } vgpu_dev->intr_info.index = VFIO_PCI_INTX_IRQ_INDEX; break; } @@ -2895,10 +2899,9 @@ if (flags & VFIO_IRQ_SET_DATA_EVENTFD) { int fd = *(int *)data; - if (fd > 0) + if (fd > 0 && !vgpu_dev->intr_info.msi_evtfd) { - if (vgpu_dev->intr_info.msi_file == NULL) - ret = vgpu_save_fd(vgpu_dev, fd, index); + ret = vgpu_save_fd(vgpu_dev, fd, index); } } break; @@ -2953,12 +2956,9 @@ NV_STATUS nv_vgpu_inject_interrupt(void *vgpuRef) { - mm_segment_t old_fs; - NvU64 val = 1; int ret = 0; - loff_t offset = 0; NV_STATUS status = NV_OK; - struct file *pfile = NULL; + struct eventfd_ctx *evt = NULL; vgpu_dev_t *vgpu_dev = vgpuRef; unsigned long eflags; @@ -2967,12 +2967,12 @@ NV_SPIN_LOCK_IRQSAVE(&vgpu_dev->intr_info_lock, eflags); - if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (vgpu_dev->intr_info.msi_file == NULL)) + if ((vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) && (!vgpu_dev->intr_info.msi_evtfd)) { NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); return NV_ERR_INVALID_REQUEST; } - else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (vgpu_dev->intr_info.intx_file == NULL)) + else if ((vgpu_dev->intr_info.index == VFIO_PCI_INTX_IRQ_INDEX) && (!vgpu_dev->intr_info.intx_evtfd)) { NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); return NV_ERR_INVALID_REQUEST; @@ -2984,9 +2984,9 @@ } if (vgpu_dev->intr_info.index == VFIO_PCI_MSI_IRQ_INDEX) - pfile = vgpu_dev->intr_info.msi_file; + evt = vgpu_dev->intr_info.msi_evtfd; else - pfile = vgpu_dev->intr_info.intx_file; + evt = vgpu_dev->intr_info.intx_evtfd; // QEMU has exited. So, safe to ignore interrupts. if (vgpu_dev->intr_info.ignore_interrupts == NV_TRUE) @@ -2996,19 +2996,14 @@ } NV_SPIN_UNLOCK_IRQRESTORE(&vgpu_dev->intr_info_lock, eflags); - old_fs = get_fs(); - set_fs(KERNEL_DS); - - if (pfile->f_op && pfile->f_op->write) - ret = pfile->f_op->write(pfile, (char *)&val, sizeof(val), &offset); - else - status = NV_ERR_INVALID_REQUEST; + if (evt) + ret = eventfd_signal(evt, 1); + else + status = NV_ERR_INVALID_REQUEST; if (ret < 0) status = NV_ERR_INVALID_STATE; - set_fs(old_fs); - return status; } diff '--color=auto' -Naur --strip ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.h ../nv-patch/kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.h --- ./kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 2021-04-18 18:57:37.000000000 +0530 +++ ../nv-patch/kernel/nvidia-vgpu-vfio/nvidia-vgpu-vfio.h 2021-06-26 17:23:36.177744902 +0530 @@ -37,6 +37,7 @@ #include #include #include +#include struct vgpu_dev_s; struct mapping_node_s; @@ -293,15 +294,15 @@ typedef struct { - struct file *intx_file; - struct file *msi_file; + struct eventfd_ctx *intx_evtfd; + struct eventfd_ctx *msi_evtfd; int index; NvBool ignore_interrupts; NvU32 allocated_irq[MAX_NUM_VECTORS]; NvU32 num_ctx; #if defined(NV_VGPU_KVM_BUILD) - struct fd msix_fd[MAX_NUM_VECTORS]; + struct eventfd_ctx *msix_evtfd[MAX_NUM_VECTORS]; #endif } intr_info_t;