Among the callers, only assigned_initfn() should set the monitor's stored error. Other callers may run in contexts where the monitor's stored error makes no sense. For example:
assigned_dev_pci_write_config() assigned_dev_update_msix() assign_intx() Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- hw/i386/kvm/pci-assign.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c index 0fedca8..6891729 100644 --- a/hw/i386/kvm/pci-assign.c +++ b/hw/i386/kvm/pci-assign.c @@ -845,11 +845,11 @@ static void verify_irqchip_in_kernel(Error **errp) return; } error_setg(errp, "pci-assign requires KVM with in-kernel irqchip enabled"); } -static int assign_intx(AssignedDevice *dev) +static int assign_intx(AssignedDevice *dev, Error **errp) { AssignedIRQType new_type; PCIINTxRoute intx_route; bool intx_host_msi; int r; @@ -861,12 +861,11 @@ static int assign_intx(AssignedDevice *dev) return 0; } verify_irqchip_in_kernel(&local_err); if (local_err) { - error_report("%s", error_get_pretty(local_err)); - error_free(local_err); + error_propagate(errp, local_err); return -ENOTSUP; } pci_device_set_intx_routing_notifier(&dev->dev, assigned_dev_update_irq_routing); @@ -925,14 +924,15 @@ retry: "using MSI instead"); error_printf("Some devices do not work properly in this mode.\n"); dev->features |= ASSIGNED_DEVICE_PREFER_MSI_MASK; goto retry; } - error_report("Failed to assign irq for \"%s\": %s", - dev->dev.qdev.id, strerror(-r)); - error_report("Perhaps you are assigning a device " - "that shares an IRQ with another device?"); + error_setg_errno(errp, -r, + "Failed to assign irq for \"%s\"\n" + "Perhaps you are assigning a device " + "that shares an IRQ with another device?", + dev->dev.qdev.id); return r; } dev->intx_route = intx_route; dev->assigned_irq_type = new_type; @@ -954,12 +954,15 @@ static void assigned_dev_update_irq_routing(PCIDevice *dev) { AssignedDevice *assigned_dev = DO_UPCAST(AssignedDevice, dev, dev); Error *err = NULL; int r; - r = assign_intx(assigned_dev); + r = assign_intx(assigned_dev, &err); if (r < 0) { + error_report("%s", error_get_pretty(err)); + error_free(err); + err = NULL; qdev_unplug(&dev->qdev, &err); assert(!err); } } @@ -1006,11 +1009,17 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev) assigned_dev->intx_route.mode = PCI_INTX_DISABLED; assigned_dev->intx_route.irq = -1; assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSI; } else { - assign_intx(assigned_dev); + Error *local_err = NULL; + + assign_intx(assigned_dev, &local_err); + if (local_err) { + error_report("%s", error_get_pretty(local_err)); + error_free(local_err); + } } } static void assigned_dev_update_msi_msg(PCIDevice *pci_dev) { @@ -1148,11 +1157,17 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev) } assigned_dev->intx_route.mode = PCI_INTX_DISABLED; assigned_dev->intx_route.irq = -1; assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSIX; } else { - assign_intx(assigned_dev); + Error *local_err = NULL; + + assign_intx(assigned_dev, &local_err); + if (local_err) { + error_report("%s", error_get_pretty(local_err)); + error_free(local_err); + } } } static uint32_t assigned_dev_pci_read_config(PCIDevice *pci_dev, uint32_t address, int len) @@ -1817,12 +1832,14 @@ static int assigned_initfn(struct PCIDevice *pci_dev) error_free(local_err); goto out; } /* assign legacy INTx to the device */ - r = assign_intx(dev); + r = assign_intx(dev, &local_err); if (r < 0) { + qerror_report_err(local_err); + error_free(local_err); goto assigned_out; } assigned_dev_load_option_rom(dev); -- 1.8.3.1