diff mbox

[v2] virtio-pci: call pci reset variant when guest clears status.

Message ID 1453903798-28857-1-git-send-email-kraxel@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Gerd Hoffmann Jan. 27, 2016, 2:09 p.m. UTC
Actually fixes linux not finding virtio 1.0 device virtqueues after
reboot.  Which is new I think, any chance linux kernel virtio code
became more strict in 4.3?

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/virtio/virtio-pci.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

Comments

Michael S. Tsirkin Jan. 27, 2016, 3:50 p.m. UTC | #1
On Wed, Jan 27, 2016 at 03:09:58PM +0100, Gerd Hoffmann wrote:
> Actually fixes linux not finding virtio 1.0 device virtqueues after
> reboot.  Which is new I think, any chance linux kernel virtio code
> became more strict in 4.3?
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/virtio/virtio-pci.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 94667e6..8213d94 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -47,6 +47,7 @@
>  
>  static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size,
>                                 VirtIOPCIProxy *dev);
> +static void virtio_pci_reset(DeviceState *qdev);
>  
>  /* virtio device */
>  /* DeviceState to VirtIOPCIProxy. For use off data-path. TODO: use QOM. */
> @@ -432,8 +433,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
>          }
>  
>          if (vdev->status == 0) {
> -            virtio_reset(vdev);
> -            msix_unuse_all_vectors(&proxy->pci_dev);
> +            virtio_pci_reset(DEVICE(proxy));
>          }
>  
>          /* Linux before 2.6.34 drives the device without enabling

Aren't there two call sites in virtio_ioport_write?

> @@ -1351,8 +1351,7 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
>          }
>  
>          if (vdev->status == 0) {
> -            virtio_reset(vdev);
> -            msix_unuse_all_vectors(&proxy->pci_dev);
> +            virtio_pci_reset(DEVICE(proxy));
>          }
>  
>          break;
> -- 
> 1.8.3.1
Gerd Hoffmann Jan. 28, 2016, 9:33 a.m. UTC | #2
> >          if (vdev->status == 0) {
> > -            virtio_reset(vdev);
> > -            msix_unuse_all_vectors(&proxy->pci_dev);
> > +            virtio_pci_reset(DEVICE(proxy));
> >          }
> >  
> >          /* Linux before 2.6.34 drives the device without enabling
> 
> Aren't there two call sites in virtio_ioport_write?

/me was specifically fixing clear-status code paths mentioned in the
commit message.

Yes, there is another one, not fully sure what is supposed to happen
there.

cheers,
  Gerd
Michael S. Tsirkin Jan. 28, 2016, 11:26 a.m. UTC | #3
On Thu, Jan 28, 2016 at 10:33:25AM +0100, Gerd Hoffmann wrote:
> > >          if (vdev->status == 0) {
> > > -            virtio_reset(vdev);
> > > -            msix_unuse_all_vectors(&proxy->pci_dev);
> > > +            virtio_pci_reset(DEVICE(proxy));
> > >          }
> > >  
> > >          /* Linux before 2.6.34 drives the device without enabling
> > 
> > Aren't there two call sites in virtio_ioport_write?
> 
> /me was specifically fixing clear-status code paths mentioned in the
> commit message.
> 
> Yes, there is another one, not fully sure what is supposed to happen
> there.
> 
> cheers,
>   Gerd

Same thing really - virtio 0 has two equivalent ways to
reset a device: write 0 into status or write 0 into PFN
register.
diff mbox

Patch

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 94667e6..8213d94 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -47,6 +47,7 @@ 
 
 static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size,
                                VirtIOPCIProxy *dev);
+static void virtio_pci_reset(DeviceState *qdev);
 
 /* virtio device */
 /* DeviceState to VirtIOPCIProxy. For use off data-path. TODO: use QOM. */
@@ -432,8 +433,7 @@  static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
         }
 
         if (vdev->status == 0) {
-            virtio_reset(vdev);
-            msix_unuse_all_vectors(&proxy->pci_dev);
+            virtio_pci_reset(DEVICE(proxy));
         }
 
         /* Linux before 2.6.34 drives the device without enabling
@@ -1351,8 +1351,7 @@  static void virtio_pci_common_write(void *opaque, hwaddr addr,
         }
 
         if (vdev->status == 0) {
-            virtio_reset(vdev);
-            msix_unuse_all_vectors(&proxy->pci_dev);
+            virtio_pci_reset(DEVICE(proxy));
         }
 
         break;