vfio/pci: Don't regenerate vconfig for all BARs if !bardirty
authorZenghui Yu <yuzenghui@huawei.com>
Mon, 21 Sep 2020 04:51:16 +0000 (12:51 +0800)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 21 Sep 2020 20:08:12 +0000 (14:08 -0600)
Now we regenerate vconfig for all the BARs via vfio_bar_fixup(), every
time any offset of any of them are read.  Though BARs aren't re-read
regularly, the regeneration can be avoided if no BARs had been written
since they were last read, in which case vdev->bardirty is false.

Let's return immediately in vfio_bar_fixup() if bardirty is false.

Suggested-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci_config.c

index d98843f..5e02ba0 100644 (file)
@@ -467,6 +467,9 @@ static void vfio_bar_fixup(struct vfio_pci_device *vdev)
        __le32 *vbar;
        u64 mask;
 
+       if (!vdev->bardirty)
+               return;
+
        vbar = (__le32 *)&vdev->vconfig[PCI_BASE_ADDRESS_0];
 
        for (i = 0; i < PCI_STD_NUM_BARS; i++, vbar++) {