Merge tag 'vfio-v4.19-rc1' of git://github.com/awilliam/linux-vfio
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Aug 2018 17:34:05 +0000 (10:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Aug 2018 17:34:05 +0000 (10:34 -0700)
Pull VFIO updates from Alex Williamson:

 - mark switch fall-through cases (Gustavo A. R. Silva)

 - disable binding SR-IOV enabled PFs (Alex Williamson)

* tag 'vfio-v4.19-rc1' of git://github.com/awilliam/linux-vfio:
  vfio-pci: Disable binding to PFs with SR-IOV enabled
  vfio: Mark expected switch fall-throughs

drivers/vfio/pci/vfio_pci.c
drivers/vfio/vfio_iommu_type1.c

index 3b1083fdb89828ecb61871680100999ebd115516..cddb453a1ba578408a050a18d52c7372ace92029 100644 (file)
@@ -789,7 +789,7 @@ static long vfio_pci_ioctl(void *device_data,
                case VFIO_PCI_ERR_IRQ_INDEX:
                        if (pci_is_pcie(vdev->pdev))
                                break;
-               /* pass thru to return error */
+               /* fall through */
                default:
                        return -EINVAL;
                }
@@ -1192,6 +1192,19 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        if (pdev->hdr_type != PCI_HEADER_TYPE_NORMAL)
                return -EINVAL;
 
+       /*
+        * Prevent binding to PFs with VFs enabled, this too easily allows
+        * userspace instance with VFs and PFs from the same device, which
+        * cannot work.  Disabling SR-IOV here would initiate removing the
+        * VFs, which would unbind the driver, which is prone to blocking
+        * if that VF is also in use by vfio-pci.  Just reject these PFs
+        * and let the user sort it out.
+        */
+       if (pci_num_vf(pdev)) {
+               pci_warn(pdev, "Cannot bind to PF with SR-IOV enabled\n");
+               return -EBUSY;
+       }
+
        group = vfio_iommu_group_get(&pdev->dev);
        if (!group)
                return -EINVAL;
index 3e5b17710a4f1fa47eb4f1333c17c96e1eae2cdd..d9fd3188615dc66267ba5ff715388f27356164b0 100644 (file)
@@ -1601,6 +1601,7 @@ static void *vfio_iommu_type1_open(unsigned long arg)
                break;
        case VFIO_TYPE1_NESTING_IOMMU:
                iommu->nesting = true;
+               /* fall through */
        case VFIO_TYPE1v2_IOMMU:
                iommu->v2 = true;
                break;