Messages in this thread | | | Subject | Re: [PATCH v5 05/14] vfio/mdev: idxd: add basic mdev registration and helper functions | From | Dave Jiang <> | Date | Mon, 1 Mar 2021 17:23:47 -0700 |
| |
On 2/10/2021 4:59 PM, Jason Gunthorpe wrote: > On Fri, Feb 05, 2021 at 01:53:24PM -0700, Dave Jiang wrote:
<-- cut for brevity -->
> +static int vdcm_idxd_set_msix_trigger(struct vdcm_idxd *vidxd, > + unsigned int index, unsigned int start, > + unsigned int count, uint32_t flags, > + void *data) > +{ > + int i, rc = 0; > + > + if (count > VIDXD_MAX_MSIX_ENTRIES - 1) > + count = VIDXD_MAX_MSIX_ENTRIES - 1; > + > + if (count == 0 && (flags & VFIO_IRQ_SET_DATA_NONE)) { > + /* Disable all MSIX entries */ > + for (i = 0; i < VIDXD_MAX_MSIX_ENTRIES; i++) { > + rc = msix_trigger_unregister(vidxd, i); > + if (rc < 0) > + return rc; > + } > + return 0; > + } > + > + for (i = 0; i < count; i++) { > + if (flags & VFIO_IRQ_SET_DATA_EVENTFD) { > + u32 fd = *(u32 *)(data + i * sizeof(u32)); > + > + rc = msix_trigger_register(vidxd, fd, i); > + if (rc < 0) > + return rc; > + } else if (flags & VFIO_IRQ_SET_DATA_NONE) { > + rc = msix_trigger_unregister(vidxd, i); > + if (rc < 0) > + return rc; > + } > + } > + return rc; > +} > + > +static int idxd_vdcm_set_irqs(struct vdcm_idxd *vidxd, uint32_t flags, > + unsigned int index, unsigned int start, > + unsigned int count, void *data) > +{ > + int (*func)(struct vdcm_idxd *vidxd, unsigned int index, > + unsigned int start, unsigned int count, uint32_t flags, > + void *data) = NULL; > + struct mdev_device *mdev = vidxd->vdev.mdev; > + struct device *dev = mdev_dev(mdev); > + > + switch (index) { > + case VFIO_PCI_INTX_IRQ_INDEX: > + dev_warn(dev, "intx interrupts not supported.\n"); > + break; > + case VFIO_PCI_MSI_IRQ_INDEX: > + dev_dbg(dev, "msi interrupt.\n"); > + switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { > + case VFIO_IRQ_SET_ACTION_MASK: > + case VFIO_IRQ_SET_ACTION_UNMASK: > + break; > + case VFIO_IRQ_SET_ACTION_TRIGGER: > + func = vdcm_idxd_set_msix_trigger; > This would be a good place to insert a common VFIO helper library to > take care of the MSI-X emulation for IMS.
Hi Jason,
So after looking at the code in vfio_pci_intrs.c, I agree that the set_irqs code between VFIO_PCI and this driver can be made in common. Given that Alex doesn't want a vfio_pci device embedded in the driver, I think we'll need some sort of generic VFIO device that can be used from the vfio_pci side and vfio_mdev side to pass down in order to have common support library functions. Do you have any thoughts on how to do this cleanly architecturally? Also, with vfio_pci common split [1] still being worked on, do you think we can defer the work on making the interrupt setup code common until the vfio_pci split work settles? Thanks!
[1]: https://lore.kernel.org/kvm/20210201162828.5938-1-mgurtovoy@nvidia.com/
| |