[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PULL 16/53] virtio-pci: call pci reset variant when gu
From: |
Laszlo Ersek |
Subject: |
Re: [Qemu-devel] [PULL 16/53] virtio-pci: call pci reset variant when guest requests reset. |
Date: |
Mon, 14 Mar 2016 02:45:51 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 |
On 03/14/16 02:36, Laszlo Ersek wrote:
> On 03/11/16 16:08, Michael S. Tsirkin wrote:
>> From: Gerd Hoffmann <address@hidden>
>>
>> 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 <address@hidden>
>> Reviewed-by: Michael S. Tsirkin <address@hidden>
>> Signed-off-by: Michael S. Tsirkin <address@hidden>
>> Reviewed-by: Fam Zheng <address@hidden>
>> Tested-by: Fam Zheng <address@hidden>
>> ---
>> 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
- [Qemu-devel] [PULL 08/53] virtio-balloon: add 'available' counter, (continued)
- [Qemu-devel] [PULL 08/53] virtio-balloon: add 'available' counter, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 11/53] i386/acpi: make floppy controller object dynamic, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 10/53] pc-dimm: fix error handling in pc_dimm_check_memdev_is_busy(), Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 09/53] vhost-user: verify that number of queues is less than MAX_QUEUE_NUM, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 12/53] i386: expose floppy drive CMOS type, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 14/53] i386: populate floppy drive information in DSDT, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 13/53] fdc: add function to determine drive chs limits, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 15/53] i386: update expected DSDT, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 16/53] virtio-pci: call pci reset variant when guest requests reset., Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 18/53] ich9lpc: fix typo, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 17/53] msi_supported -> msi_nonbroken, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 19/53] hw/acpi: fix Q35 support for legacy Windows OS, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 20/53] acpi-test-data: add _DIS methods, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 21/53] pci-ids: add virtio 1.0 ids to spec, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 22/53] nvdimm acpi: initialize the resource used by NVDIMM ACPI, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 23/53] nvdimm acpi: introduce patched dsm memory, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 24/53] nvdimm acpi: let qemu handle _DSM method, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 25/53] nvdimm acpi: emulate dsm method, Michael S. Tsirkin, 2016/03/11
- [Qemu-devel] [PULL 26/53] vhost-user: fix use after free, Michael S. Tsirkin, 2016/03/11