From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46278) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afHa5-0002HH-E8 for qemu-devel@nongnu.org; Sun, 13 Mar 2016 21:46:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1afHZz-0001u9-8F for qemu-devel@nongnu.org; Sun, 13 Mar 2016 21:46:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59040) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1afHZz-0001tt-0t for qemu-devel@nongnu.org; Sun, 13 Mar 2016 21:45:55 -0400 References: <1457708548-14093-1-git-send-email-mst@redhat.com> <1457708548-14093-17-git-send-email-mst@redhat.com> <56E615A3.6090705@redhat.com> From: Laszlo Ersek Message-ID: <56E617CF.4040204@redhat.com> Date: Mon, 14 Mar 2016 02:45:51 +0100 MIME-Version: 1.0 In-Reply-To: <56E615A3.6090705@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PULL 16/53] virtio-pci: call pci reset variant when guest requests reset. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael S. Tsirkin" , qemu-devel@nongnu.org Cc: Peter Maydell , Fam Zheng , Eduardo Habkost , Gerd Hoffmann On 03/14/16 02:36, Laszlo Ersek wrote: > On 03/11/16 16:08, Michael S. Tsirkin wrote: >> From: Gerd Hoffmann >> >> 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 >> Reviewed-by: Michael S. Tsirkin >> Signed-off-by: Michael S. Tsirkin >> Reviewed-by: Fam Zheng >> Tested-by: Fam Zheng >> --- >> hw/virtio/virtio-pci.c | 11 ++++------- >> 1 file changed, 4 insertions(+), 7 deletions(-) >> >> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c >> index 440776c..0dadb66 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. */ >> @@ -404,9 +405,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val) >> case VIRTIO_PCI_QUEUE_PFN: >> pa = (hwaddr)val << VIRTIO_PCI_QUEUE_ADDR_SHIFT; >> if (pa == 0) { >> - virtio_pci_stop_ioeventfd(proxy); >> - virtio_reset(vdev); >> - msix_unuse_all_vectors(&proxy->pci_dev); >> + virtio_pci_reset(DEVICE(proxy)); >> } >> else >> virtio_queue_set_addr(vdev, vdev->queue_sel, pa); >> @@ -432,8 +431,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 >> @@ -1353,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; >> > > I spent about two days hunting this, and was just about to send a patch. > Nice to see you've already gotten to it. :) > > The specific problem was that the queue_enable field was not cleared > (for all possible queues of the device) on device reset, only on system > reset. ... If you wonder, it is not only needed for after reboot, but also for when OVMF hands off the devices to the kernel (but resets them first in the appropriate ExitBootServices() callbacks). It took me so long because when you work on new guest driver code and things break, you don't immediately suspect the host! :) Oh the hours I spent instrumenting the guest kernel. Sigh. :) Thanks Laszlo