[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1 8/8] xen/pt: Check for return values for xen_host_pci_[get|set] in init
On Mon, 29 Jun 2015, Konrad Rzeszutek Wilk wrote: > and if we have failures we call xen_pt_destroy introduced in > 'xen/pt: Move bulk of xen_pt_unregister_device in its own routine.' > and free all of the allocated structures. > > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > hw/xen/xen_pt.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) > > diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c > index 589c6c6..ce202e9 100644 > --- a/hw/xen/xen_pt.c > +++ b/hw/xen/xen_pt.c > @@ -779,10 +779,11 @@ static int xen_pt_initfn(PCIDevice *d) > } > > /* Initialize virtualized PCI configuration (Extended 256 Bytes) */ > - if (xen_host_pci_get_block(&s->real_device, 0, d->config, > - PCI_CONFIG_SPACE_SIZE) < 0) { > - xen_host_pci_device_put(&s->real_device); > - return -1; > + rc = xen_host_pci_get_block(&s->real_device, 0, d->config, > + PCI_CONFIG_SPACE_SIZE); > + if (rc < 0) { > + XEN_PT_ERR(d,"Could not read PCI_CONFIG space! (rc:%d)\n", rc); > + goto err_out; > } > > s->memory_listener = xen_pt_memory_listener; > @@ -792,17 +793,18 @@ static int xen_pt_initfn(PCIDevice *d) > xen_pt_register_regions(s, &cmd); > > /* reinitialize each config register to be emulated */ > - if (xen_pt_config_init(s)) { > + rc = xen_pt_config_init(s); > + if (rc) { > XEN_PT_ERR(d, "PCI Config space initialisation failed.\n"); > - xen_host_pci_device_put(&s->real_device); > - return -1; > + goto err_out; > } > > /* Bind interrupt */ > - if (xen_host_pci_get_byte(&s->real_device, PCI_INTERRUPT_PIN, > - &machine_irq /* temp scratch */)) { > + rc = xen_host_pci_get_byte(&s->real_device, PCI_INTERRUPT_PIN, > + &machine_irq /* temp scratch */); > + if (rc) { > XEN_PT_ERR(d, "Failed to read PCI_INTERRUPT_PIN! (rc:%d)\n", rc); > - machine_irq = 0; > + goto err_out; > } > if (!machine_irq) { > XEN_PT_LOG(d, "no pin interrupt\n"); > @@ -859,12 +861,15 @@ out: > rc = xen_host_pci_get_word(&s->real_device, PCI_COMMAND, &val); > if (rc) { > XEN_PT_ERR(d, "Failed to read PCI_COMMAND! (rc: %d)\n", rc); > + goto err_out; > } > else { > val |= cmd; > - if (xen_host_pci_set_word(&s->real_device, PCI_COMMAND, val)) { > + rc = xen_host_pci_set_word(&s->real_device, PCI_COMMAND, val); > + if (rc) { > XEN_PT_ERR(d, "Failed to write PCI_COMMAND val=0x%x!(rc: > %d)\n", > val, rc); > + goto err_out; > } > } > } > @@ -877,6 +882,11 @@ out: > s->hostaddr.bus, s->hostaddr.slot, s->hostaddr.function); > > return 0; > + > +err_out: > + xen_pt_destroy(d); > + assert(rc); > + return rc; > } > > static void xen_pt_unregister_device(PCIDevice *d) > -- > 2.1.0 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |