No functional changes. These refactors multiple region array accessing into one place. This prepares for the RCU locking in the following patches. Signed-off-by: Mahmoud Adam --- drivers/vfio/pci/vfio_pci_core.c | 21 ++++++++++++--------- drivers/vfio/pci/vfio_pci_igd.c | 20 ++++++++++++++------ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c index 7dcf5439dedc9..ea04c1291af68 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -1003,6 +1003,7 @@ static int vfio_pci_ioctl_get_region_info(struct vfio_pci_core_device *vdev, struct pci_dev *pdev = vdev->pdev; struct vfio_region_info info; struct vfio_info_cap caps = { .buf = NULL, .size = 0 }; + struct vfio_pci_region *region; int i, ret; if (copy_from_user(&info, arg, minsz)) @@ -1091,22 +1092,23 @@ static int vfio_pci_ioctl_get_region_info(struct vfio_pci_core_device *vdev, info.index, VFIO_PCI_NUM_REGIONS + vdev->num_regions); i = info.index - VFIO_PCI_NUM_REGIONS; + region = &vdev->region[i]; info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); - info.size = vdev->region[i].size; - info.flags = vdev->region[i].flags; + info.size = region->size; + info.flags = region->flags; - cap_type.type = vdev->region[i].type; - cap_type.subtype = vdev->region[i].subtype; + cap_type.type = region->type; + cap_type.subtype = region->subtype; ret = vfio_info_add_capability(&caps, &cap_type.header, sizeof(cap_type)); if (ret) return ret; - if (vdev->region[i].ops->add_capability) { - ret = vdev->region[i].ops->add_capability( - vdev, &vdev->region[i], &caps); + if (region->ops->add_capability) { + ret = region->ops->add_capability( + vdev, region, &caps); if (ret) return ret; } @@ -1726,10 +1728,11 @@ int vfio_pci_core_mmap(struct vfio_device *core_vdev, struct vm_area_struct *vma int regnum = index - VFIO_PCI_NUM_REGIONS; struct vfio_pci_region *region = vdev->region + regnum; + ret = -EINVAL; if (region->ops && region->ops->mmap && (region->flags & VFIO_REGION_INFO_FLAG_MMAP)) - return region->ops->mmap(vdev, region, vma); - return -EINVAL; + ret = region->ops->mmap(vdev, region, vma); + return ret; } if (index >= VFIO_PCI_ROM_REGION_INDEX) return -EINVAL; diff --git a/drivers/vfio/pci/vfio_pci_igd.c b/drivers/vfio/pci/vfio_pci_igd.c index 988b6919c2c31..ac0921fdc62da 100644 --- a/drivers/vfio/pci/vfio_pci_igd.c +++ b/drivers/vfio/pci/vfio_pci_igd.c @@ -66,14 +66,18 @@ static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev, bool iswrite) { unsigned int i = VFIO_PCI_OFFSET_TO_INDEX(*ppos) - VFIO_PCI_NUM_REGIONS; - struct igd_opregion_vbt *opregionvbt = vdev->region[i].data; loff_t pos = *ppos & VFIO_PCI_OFFSET_MASK, off = 0; size_t remaining; + struct vfio_pci_region *region; + struct igd_opregion_vbt *opregionvbt; + + region = &vdev->region[i]; + opregionvbt = region->data; - if (pos >= vdev->region[i].size || iswrite) + if (pos >= region->size || iswrite) return -EINVAL; - count = min_t(size_t, count, vdev->region[i].size - pos); + count = min_t(size_t, count, region->size - pos); remaining = count; /* Copy until OpRegion version */ @@ -283,15 +287,19 @@ static ssize_t vfio_pci_igd_cfg_rw(struct vfio_pci_core_device *vdev, bool iswrite) { unsigned int i = VFIO_PCI_OFFSET_TO_INDEX(*ppos) - VFIO_PCI_NUM_REGIONS; - struct pci_dev *pdev = vdev->region[i].data; loff_t pos = *ppos & VFIO_PCI_OFFSET_MASK; size_t size; int ret; + struct vfio_pci_region *region; + struct pci_dev *pdev; + + region = &vdev->region[i]; + pdev = region->data; - if (pos >= vdev->region[i].size || iswrite) + if (pos >= region->size || iswrite) return -EINVAL; - size = count = min(count, (size_t)(vdev->region[i].size - pos)); + size = count = min(count, (size_t)(region->size - pos)); if ((pos & 1) && size) { u8 val; -- 2.47.3 Amazon Web Services Development Center Germany GmbH Tamara-Danz-Str. 13 10243 Berlin Geschaeftsfuehrung: Christian Schlaeger Eingetragen am Amtsgericht Charlottenburg unter HRB 257764 B Sitz: Berlin Ust-ID: DE 365 538 597