On Sun, Sep 14, 2014 at 08:23:26PM -0700, Anthony Liguori wrote:
> From: Anthony Liguori <[email protected]>
> 
> If MSI-X initialization fails after setting msix_enabled = 1, then
> the device is left in an inconsistent state.  This would normally
> only happen if there was a bug in the device emulation but it still
> should be handled correctly.
> 
> Cc: Matt Wilson <[email protected]>
> Cc: Rusty Russell <[email protected]>
> Cc: Michael Tsirkin <[email protected]>
> Signed-off-by: Anthony Liguori <[email protected]>

Reviewed-by: Matt Wilson <[email protected]>

--msw

> ---
>  drivers/virtio/virtio_pci.c |    8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
> index 9cbac33..3d2c2a5 100644
> --- a/drivers/virtio/virtio_pci.c
> +++ b/drivers/virtio/virtio_pci.c
> @@ -357,7 +357,7 @@ static int vp_request_msix_vectors(struct virtio_device 
> *vdev, int nvectors,
>       v = ioread16(vp_dev->ioaddr + VIRTIO_MSI_CONFIG_VECTOR);
>       if (v == VIRTIO_MSI_NO_VECTOR) {
>               err = -EBUSY;
> -             goto error;
> +             goto error_msix_used;
>       }
>  
>       if (!per_vq_vectors) {
> @@ -369,11 +369,15 @@ static int vp_request_msix_vectors(struct virtio_device 
> *vdev, int nvectors,
>                                 vp_vring_interrupt, 0, vp_dev->msix_names[v],
>                                 vp_dev);
>               if (err)
> -                     goto error;
> +                     goto error_msix_used;
>               ++vp_dev->msix_used_vectors;
>       }
>       return 0;
> +error_msix_used:
> +     v = --vp_dev->msix_used_vectors;
> +     free_irq(vp_dev->msix_entries[v].vector, vp_dev);
>  error:
> +     vp_dev->msix_enabled = 0;
>       vp_free_vectors(vdev);
>       return err;
>  }
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to