From: Ankit Agrawal Date: Tue, 17 Feb 2026 15:30:09 +0000 (+0000) Subject: vfio: Add Error ** parameter to vfio_region_setup() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c42010197eb905fe826550bb5f7c236d5534ddb4;p=thirdparty%2Fqemu.git vfio: Add Error ** parameter to vfio_region_setup() Add an Error **errp parameter to vfio_region_setup() and vfio_setup_region_sparse_mmaps to allow proper error handling instead of just returning error codes. The function sets errors via error_setg() when failure occur. Suggested-by: Cedric Le Goater Signed-off-by: Ankit Agrawal Reviewed-by: Cédric Le Goater Link: https://lore.kernel.org/qemu-devel/20260217153010.408739-3-ankita@nvidia.com Signed-off-by: Cédric Le Goater --- diff --git a/hw/vfio/display.c b/hw/vfio/display.c index faacd9019a..5a42a6f7a2 100644 --- a/hw/vfio/display.c +++ b/hw/vfio/display.c @@ -446,13 +446,13 @@ static void vfio_display_region_update(void *opaque) if (!dpy->region.buffer.size) { /* mmap region */ + Error *error = NULL; ret = vfio_region_setup(OBJECT(vdev), &vdev->vbasedev, &dpy->region.buffer, plane.region_index, - "display"); + "display", &error); if (ret != 0) { - error_report("%s: vfio_region_setup(%d): %s", - __func__, plane.region_index, strerror(-ret)); + error_report_err(error); goto err; } ret = vfio_region_mmap(&dpy->region.buffer); diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 36d8fbe872..c89f3fbea3 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -3056,11 +3056,10 @@ bool vfio_pci_populate_device(VFIOPCIDevice *vdev, Error **errp) char *name = g_strdup_printf("%s BAR %d", vbasedev->name, i); ret = vfio_region_setup(OBJECT(vdev), vbasedev, - &vdev->bars[i].region, i, name); + &vdev->bars[i].region, i, name, errp); g_free(name); if (ret) { - error_setg_errno(errp, -ret, "failed to get region %d info", i); return false; } diff --git a/hw/vfio/region.c b/hw/vfio/region.c index 8fbc98918f..d464eadf9c 100644 --- a/hw/vfio/region.c +++ b/hw/vfio/region.c @@ -163,7 +163,8 @@ static int vfio_mmap_compare_offset(const void *a, const void *b) } static int vfio_setup_region_sparse_mmaps(VFIORegion *region, - struct vfio_region_info *info) + struct vfio_region_info *info, + Error **errp) { struct vfio_info_cap_header *hdr; struct vfio_region_info_cap_sparse_mmap *sparse; @@ -210,12 +211,12 @@ static int vfio_setup_region_sparse_mmaps(VFIORegion *region, off_t prev_end = region->mmaps[i - 1].offset + region->mmaps[i - 1].size; if (prev_end > region->mmaps[i].offset) { - error_report("%s: overlapping sparse mmap regions detected " - "in region %d: [0x%"PRIx64"-0x%"PRIx64"] overlaps " - "with [0x%"PRIx64"-0x%"PRIx64"]", - __func__, region->nr, region->mmaps[i - 1].offset, - prev_end - 1, region->mmaps[i].offset, - region->mmaps[i].offset + region->mmaps[i].size - 1); + error_setg(errp, "%s: overlapping sparse mmap regions detected " + "in region %d: [0x%"PRIx64"-0x%"PRIx64"] overlaps " + "with [0x%"PRIx64"-0x%"PRIx64"]", + __func__, region->nr, region->mmaps[i - 1].offset, + prev_end - 1, region->mmaps[i].offset, + region->mmaps[i].offset + region->mmaps[i].size - 1); g_free(region->mmaps); region->mmaps = NULL; region->nr_mmaps = 0; @@ -228,13 +229,14 @@ static int vfio_setup_region_sparse_mmaps(VFIORegion *region, } int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region, - int index, const char *name) + int index, const char *name, Error **errp) { struct vfio_region_info *info = NULL; int ret; ret = vfio_device_get_region_info(vbasedev, index, &info); if (ret) { + error_setg_errno(errp, -ret, "failed to get region %d info", index); return ret; } @@ -253,7 +255,7 @@ int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region, if (!vbasedev->no_mmap && region->flags & VFIO_REGION_INFO_FLAG_MMAP) { - ret = vfio_setup_region_sparse_mmaps(region, info); + ret = vfio_setup_region_sparse_mmaps(region, info, errp); if (ret == -ENODEV) { region->nr_mmaps = 1; diff --git a/hw/vfio/vfio-region.h b/hw/vfio/vfio-region.h index ede6e0c8f9..9b21d4ee5b 100644 --- a/hw/vfio/vfio-region.h +++ b/hw/vfio/vfio-region.h @@ -38,7 +38,7 @@ void vfio_region_write(void *opaque, hwaddr addr, uint64_t vfio_region_read(void *opaque, hwaddr addr, unsigned size); int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region, - int index, const char *name); + int index, const char *name, Error **errp); int vfio_region_mmap(VFIORegion *region); void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled); void vfio_region_unmap(VFIORegion *region);