On Fri, May 21, 2021 at 05:20:26PM -0700, Dave Jiang wrote: > +static int idxd_vdcm_mmap(struct vfio_device *vdev, struct vm_area_struct *vma) > +{ > + unsigned int wq_idx; > + unsigned long req_size, pgoff = 0, offset; > + pgprot_t pg_prot; > + struct vdcm_idxd *vidxd = vdev_to_vidxd(vdev); > + struct idxd_wq *wq = vidxd->wq; > + struct idxd_device *idxd = vidxd->idxd; > + enum idxd_portal_prot virt_portal, phys_portal; > + phys_addr_t base = pci_resource_start(idxd->pdev, IDXD_WQ_BAR); > + struct device *dev = vdev->dev; > + > + if (!(vma->vm_flags & VM_SHARED)) > + return -EINVAL; > + > + pg_prot = vma->vm_page_prot; > + req_size = vma->vm_end - vma->vm_start; > + if (req_size > PAGE_SIZE) > + return -EINVAL; > + > + vma->vm_flags |= VM_DONTCOPY; > + > + offset = (vma->vm_pgoff << PAGE_SHIFT) & > + ((1ULL << VFIO_PCI_OFFSET_SHIFT) - 1); > + > + wq_idx = offset >> (PAGE_SHIFT + 2); > + if (wq_idx >= 1) { > + dev_err(dev, "mapping invalid wq %d off %lx\n", > + wq_idx, offset); > + return -EINVAL; > + } This is a really wonky and leaky way to say that the vm_pgoff can only be one of two values? It is uAPI, be thorough. > +static long idxd_vdcm_ioctl(struct vfio_device *vdev, unsigned int cmd, unsigned long arg) > +{ > + struct vdcm_idxd *vidxd = vdev_to_vidxd(vdev); > + unsigned long minsz; > + int rc = -EINVAL; > + struct device *dev = vdev->dev; > + > + dev_dbg(dev, "vidxd %p ioctl, cmd: %d\n", vidxd, cmd); > + > + mutex_lock(&vidxd->dev_lock); > + if (cmd == VFIO_DEVICE_GET_INFO) { Sigh.. This ioctl stuff really needs splitting into proper functions called by the core code instead of cut&pasting all of this > static int idxd_mdev_drv_probe(struct device *dev) > diff --git a/drivers/vfio/mdev/idxd/mdev.h b/drivers/vfio/mdev/idxd/mdev.h > index f696fe38e374..dd4290bce772 100644 > +++ b/drivers/vfio/mdev/idxd/mdev.h > @@ -30,11 +30,26 @@ > #define VIDXD_MAX_MSIX_ENTRIES VIDXD_MAX_MSIX_VECS > #define VIDXD_MAX_WQS 1 > > +#define IDXD_MDEV_NAME_LEN 64 This is never used. Check everything.. Jason