[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.