]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
vfio/pci: Virtualize Maximum Payload Size
authorAlex Williamson <alex.williamson@redhat.com>
Mon, 2 Oct 2017 18:39:09 +0000 (12:39 -0600)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 2 Oct 2017 18:39:09 +0000 (12:39 -0600)
With virtual PCI-Express chipsets, we now see userspace/guest drivers
trying to match the physical MPS setting to a virtual downstream port.
Of course a lone physical device surrounded by virtual interconnects
cannot make a correct decision for a proper MPS setting.  Instead,
let's virtualize the MPS control register so that writes through to
hardware are disallowed.  Userspace drivers like QEMU assume they can
write anything to the device and we'll filter out anything dangerous.
Since mismatched MPS can lead to AER and other faults, let's add it
to the kernel side rather than relying on userspace virtualization to
handle it.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
drivers/vfio/pci/vfio_pci_config.c

index 5628fe114347a9d710860022182a26893a87d5ab..91335e6de88a24ca12cc5e8c465fce91f9382e15 100644 (file)
@@ -849,11 +849,13 @@ static int __init init_pci_cap_exp_perm(struct perm_bits *perm)
 
        /*
         * Allow writes to device control fields, except devctl_phantom,
-        * which could confuse IOMMU, and the ARI bit in devctl2, which
+        * which could confuse IOMMU, MPS, which can break communication
+        * with other physical devices, and the ARI bit in devctl2, which
         * is set at probe time.  FLR gets virtualized via our writefn.
         */
        p_setw(perm, PCI_EXP_DEVCTL,
-              PCI_EXP_DEVCTL_BCR_FLR, ~PCI_EXP_DEVCTL_PHANTOM);
+              PCI_EXP_DEVCTL_BCR_FLR | PCI_EXP_DEVCTL_PAYLOAD,
+              ~PCI_EXP_DEVCTL_PHANTOM);
        p_setw(perm, PCI_EXP_DEVCTL2, NO_VIRT, ~PCI_EXP_DEVCTL2_ARI);
        return 0;
 }