Pull VFIO fixes from Alex Williamson: - Fix error path return value (Zhen Lei) - Add vfio-pci CONFIG_MMU dependency (Randy Dunlap) - Replace open coding with struct_size() (Gustavo A. R. Silva) - Fix sample driver error path (Wei Yongjun) - Fix vfio-platform error path module_put() (Max Gurtovoy) * tag 'vfio-v5.13-rc5' of git://github.com/awilliam/linux-vfio: vfio/platform: fix module_put call in error flow samples: vfio-mdev: fix error handing in mdpy_fb_probe() vfio/iommu_type1: Use struct_size() for kzalloc() vfio/pci: zap_vma_ptes() needs MMU vfio/pci: Fix error return code in vfio_ecap_init()
Unified · Split
| @@ -2,6 +2,7 @@ · 1 unmodified line | ||
| 2 | 2 | config VFIO_PCI |
| 3 | 3 | tristate "VFIO support for PCI devices" |
| 4 | 4 | depends on VFIO && PCI && EVENTFD |
| 5 | + depends on MMU | |
| 5 | 6 | select VFIO_VIRQFD |
| 6 | 7 | select IRQ_BYPASS_MANAGER |
| 7 | 8 | help |
| @@ -1581,7 +1581,7 @@ static int vfio_ecap_init(struct vfio_pci_device *vdev) · 1580 unmodified lines | ||
| 1581 | 1581 | if (len == 0xFF) { |
| 1582 | 1582 | len = vfio_ext_cap_len(vdev, ecap, epos); |
| 1583 | 1583 | if (len < 0) |
| 1584 | − return ret; | |
| 1584 | + return len; | |
| 1585 | 1585 | } |
| 1586 | 1586 | } |
| 1587 | 1587 | |
| @@ -291,7 +291,7 @@ err_irq: · 290 unmodified lines | ||
| 291 | 291 | vfio_platform_regions_cleanup(vdev); |
| 292 | 292 | err_reg: |
| 293 | 293 | mutex_unlock(&driver_lock); |
| 294 | − module_put(THIS_MODULE); | |
| 294 | + module_put(vdev->parent_module); | |
| 295 | 295 | return ret; |
| 296 | 296 | } |
| 297 | 297 | |
| @@ -2795,7 +2795,7 @@ static int vfio_iommu_iova_build_caps(struct vfio_iommu *iommu, · 2794 unmodified lines | ||
| 2795 | 2795 | return 0; |
| 2796 | 2796 | } |
| 2797 | 2797 | |
| 2798 | − size = sizeof(*cap_iovas) + (iovas * sizeof(*cap_iovas->iova_ranges)); | |
| 2798 | + size = struct_size(cap_iovas, iova_ranges, iovas); | |
| 2799 | 2799 | |
| 2800 | 2800 | cap_iovas = kzalloc(size, GFP_KERNEL); |
| 2801 | 2801 | if (!cap_iovas) |
| @@ -117,22 +117,27 @@ static int mdpy_fb_probe(struct pci_dev *pdev, · 116 unmodified lines | ||
| 117 | 117 | if (format != DRM_FORMAT_XRGB8888) { |
| 118 | 118 | pci_err(pdev, "format mismatch (0x%x != 0x%x)\n", |
| 119 | 119 | format, DRM_FORMAT_XRGB8888); |
| 120 | − return -EINVAL; | |
| 120 | + ret = -EINVAL; | |
| 121 | + goto err_release_regions; | |
| 121 | 122 | } |
| 122 | 123 | if (width < 100 || width > 10000) { |
| 123 | 124 | pci_err(pdev, "width (%d) out of range\n", width); |
| 124 | − return -EINVAL; | |
| 125 | + ret = -EINVAL; | |
| 126 | + goto err_release_regions; | |
| 125 | 127 | } |
| 126 | 128 | if (height < 100 || height > 10000) { |
| 127 | 129 | pci_err(pdev, "height (%d) out of range\n", height); |
| 128 | − return -EINVAL; | |
| 130 | + ret = -EINVAL; | |
| 131 | + goto err_release_regions; | |
| 129 | 132 | } |
| 130 | 133 | pci_info(pdev, "mdpy found: %dx%d framebuffer\n", |
| 131 | 134 | width, height); |
| 132 | 135 | |
| 133 | 136 | info = framebuffer_alloc(sizeof(struct mdpy_fb_par), &pdev->dev); |
| 134 | − if (!info) | |
| 137 | + if (!info) { | |
| 138 | + ret = -ENOMEM; | |
| 135 | 139 | goto err_release_regions; |
| 140 | + } | |
| 136 | 141 | pci_set_drvdata(pdev, info); |
| 137 | 142 | par = info->par; |
| 138 | 143 | |