Hello Mario,
On 6/22/26 14:09, Mario Casquero wrote:
Updates vfio_pci_load_rom() to use Error API for error propagation
instead of error_report(), improving error handling consistency.
Signed-off-by: Mario Casquero <[email protected]>
---
hw/vfio/pci.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
It is helpful for reviewers/maintainers to have a brief changelog here.
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 9df04fa2d7..e7afcc0a1a 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -1027,7 +1027,7 @@ static void vfio_update_msi(VFIOPCIDevice *vdev)
}
}
-static bool vfio_pci_load_rom(VFIOPCIDevice *vdev)
+static bool vfio_pci_load_rom(VFIOPCIDevice *vdev, Error **errp)
{
VFIODevice *vbasedev = &vdev->vbasedev;
struct vfio_region_info *reg_info = NULL;
@@ -1040,7 +1040,7 @@ static bool vfio_pci_load_rom(VFIOPCIDevice *vdev)
®_info);
if (ret != 0) {
- error_report("vfio: Error getting ROM info: %s", strerror(-ret));
+ error_setg_errno(errp, -ret, "vfio: Error getting ROM info");
return false;
}
@@ -1052,7 +1052,8 @@ static bool vfio_pci_load_rom(VFIOPCIDevice *vdev)
vdev->rom_offset = reg_info->offset;
if (!vdev->rom_size) {
- error_report("vfio-pci: Cannot read device rom at %s", vbasedev->name);
+ error_setg(errp, "vfio-pci: Cannot read device rom at %s",
+ vbasedev->name);
error_printf("Device option ROM contents are probably invalid "
"(check dmesg).\nSkip option ROM probe with rombar=0, "
"or load from file with romfile=\n");
error_setg() and error_printf() outputs will be in reverse order now.
Please use error_append_hint() for the second message.
Also, while at it, an since this is an error case, we should reset
rom_size and rom_offset :
vdev->rom_size = 0;
vdev->rom_offset = 0;
like done below.
Thanks,
C.
@@ -1076,10 +1077,12 @@ static bool vfio_pci_load_rom(VFIOPCIDevice *vdev)
if (bytes == -EINTR || bytes == -EAGAIN) {
continue;
}
- error_report("vfio: Error reading device ROM: %s",
- strreaderror(bytes));
-
- break;
+ error_setg_errno(errp, -bytes, "vfio: Error reading device ROM");
+ g_free(vdev->rom);
+ vdev->rom = NULL;
+ vdev->rom_size = 0;
+ vdev->rom_offset = 0;
+ return false;
}
}
@@ -1147,7 +1150,12 @@ static uint64_t vfio_rom_read(void *opaque, hwaddr addr, unsigned size)
/* Load the ROM lazily when the guest tries to read it */
if (unlikely(!vdev->rom && !vdev->rom_read_failed)) {
- vdev->rom_read_failed = !vfio_pci_load_rom(vdev);
+ Error *local_err = NULL;
+
+ vdev->rom_read_failed = !vfio_pci_load_rom(vdev, &local_err);
+ if (vdev->rom_read_failed) {
+ error_report_err(local_err);
+ }
}
memcpy(&val, vdev->rom + addr,