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:
parent
6877cff044
commit
ef47827ac4
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user