@@ -1754,18 +1754,18 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
uint8_t e_intx;
int r;
Error *local_err = NULL;
if (!kvm_enabled()) {
- error_report("pci-assign: error: requires KVM support");
- return -1;
+ error_setg(&local_err, "pci-assign requires KVM support");
+ goto exit_with_error;
}
if (!dev->host.domain && !dev->host.bus && !dev->host.slot &&
!dev->host.function) {
- error_report("pci-assign: error: no host device specified");
- return -1;
+ error_setg(&local_err, "no host device specified");
+ goto exit_with_error;
}
/*
* Set up basic config space access control. Will be further refined during
* device initialization.
@@ -1786,38 +1786,30 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
memcpy(dev->emulate_config_write, dev->emulate_config_read,
sizeof(dev->emulate_config_read));
get_real_device(dev, &local_err);
if (local_err) {
- qerror_report_err(local_err);
- error_free(local_err);
goto out;
}
if (assigned_device_pci_cap_init(pci_dev, &local_err) < 0) {
- qerror_report_err(local_err);
- error_free(local_err);
goto out;
}
/* intercept MSI-X entry page in the MMIO */
if (dev->cap.available & ASSIGNED_DEVICE_CAP_MSIX) {
assigned_dev_register_msix_mmio(dev, &local_err);
if (local_err) {
- qerror_report_err(local_err);
- error_free(local_err);
goto out;
}
}
/* handle real device's MMIO/PIO BARs */
assigned_dev_register_regions(dev->real_device.regions,
dev->real_device.region_number, dev,
&local_err);
if (local_err) {
- qerror_report_err(local_err);
- error_free(local_err);
goto out;
}
/* handle interrupt routing */
e_intx = dev->dev.config[PCI_INTERRUPT_PIN] - 1;
@@ -1826,20 +1818,16 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
dev->intx_route.irq = -1;
/* assign device to guest */
assign_device(dev, &local_err);
if (local_err) {
- qerror_report_err(local_err);
- error_free(local_err);
goto out;
}
/* assign legacy INTx to the device */
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);
@@ -1847,12 +1835,18 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
return 0;
assigned_out:
deassign_device(dev);
+
out:
free_assigned_device(dev);
+
+exit_with_error:
+ assert(local_err);
+ qerror_report_err(local_err);
+ error_free(local_err);
return -1;
}
static void assigned_exitfn(struct PCIDevice *pci_dev)
{
Signed-off-by: Laszlo Ersek <lersek@redhat.com> --- hw/i386/kvm/pci-assign.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-)