pci-assign: propagate errors from assign_intx()

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 <lersek@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Laszlo Ersek 2014-04-10 10:24:44 +02:00 committed by Luiz Capitulino
parent 6877cff044
commit ef47827ac4

View File

@ -847,7 +847,7 @@ static void verify_irqchip_in_kernel(Error **errp)
error_setg(errp, "pci-assign requires KVM with in-kernel irqchip enabled"); 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; AssignedIRQType new_type;
PCIINTxRoute intx_route; PCIINTxRoute intx_route;
@ -863,8 +863,7 @@ static int assign_intx(AssignedDevice *dev)
verify_irqchip_in_kernel(&local_err); verify_irqchip_in_kernel(&local_err);
if (local_err) { if (local_err) {
error_report("%s", error_get_pretty(local_err)); error_propagate(errp, local_err);
error_free(local_err);
return -ENOTSUP; return -ENOTSUP;
} }
@ -927,10 +926,11 @@ retry:
dev->features |= ASSIGNED_DEVICE_PREFER_MSI_MASK; dev->features |= ASSIGNED_DEVICE_PREFER_MSI_MASK;
goto retry; goto retry;
} }
error_report("Failed to assign irq for \"%s\": %s", error_setg_errno(errp, -r,
dev->dev.qdev.id, strerror(-r)); "Failed to assign irq for \"%s\"\n"
error_report("Perhaps you are assigning a device " "Perhaps you are assigning a device "
"that shares an IRQ with another device?"); "that shares an IRQ with another device?",
dev->dev.qdev.id);
return r; return r;
} }
@ -956,8 +956,11 @@ static void assigned_dev_update_irq_routing(PCIDevice *dev)
Error *err = NULL; Error *err = NULL;
int r; int r;
r = assign_intx(assigned_dev); r = assign_intx(assigned_dev, &err);
if (r < 0) { if (r < 0) {
error_report("%s", error_get_pretty(err));
error_free(err);
err = NULL;
qdev_unplug(&dev->qdev, &err); qdev_unplug(&dev->qdev, &err);
assert(!err); assert(!err);
} }
@ -1008,7 +1011,13 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
assigned_dev->intx_route.irq = -1; assigned_dev->intx_route.irq = -1;
assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSI; assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSI;
} else { } 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);
}
} }
} }
@ -1150,7 +1159,13 @@ static void assigned_dev_update_msix(PCIDevice *pci_dev)
assigned_dev->intx_route.irq = -1; assigned_dev->intx_route.irq = -1;
assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSIX; assigned_dev->assigned_irq_type = ASSIGNED_IRQ_MSIX;
} else { } 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);
}
} }
} }
@ -1819,8 +1834,10 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
} }
/* assign legacy INTx to the device */ /* assign legacy INTx to the device */
r = assign_intx(dev); r = assign_intx(dev, &local_err);
if (r < 0) { if (r < 0) {
qerror_report_err(local_err);
error_free(local_err);
goto assigned_out; goto assigned_out;
} }