qemu/hw/virtio
Stefan Hajnoczi 874adf45db virtio: add missing region cache init in virtio_load()
Commit 97cd965c07 ("virtio: use
VRingMemoryRegionCaches for avail and used rings") switched to a memory
region cache to avoid repeated map/unmap operations.

The virtio_load() process is a little tricky because vring addresses are
serialized in two separate places.  VIRTIO 1.0 devices serialize desc
and then a subsection with used and avail.  Legacy devices only
serialize desc.

Live migration of VIRTIO 1.0 devices fails on the destination host with:

  VQ 0 size 0x80 < last_avail_idx 0x12f8 - used_idx 0x0
  Failed to load virtio-blk:virtio
  error while loading state for instance 0x0 of device '0000:00:04.0/virtio-blk'

This happens because the memory region cache is only initialized after
desc is loaded and not after the used and avail subsection is loaded.
If the guest chose memory addresses that don't match the legacy ring
layout then the wrong guest memory location is accessed.

Wait until all ring addresses are known before trying to initialize the
region cache.  Also clarify the incomplete comment about VIRTIO-1 ring
address subsection.

Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
2017-03-02 07:14:28 +02:00
..
Makefile.objs stubs: move vhost stubs to stubs/vhost.o 2017-01-16 17:52:35 +01:00
trace-events balloon: Don't balloon roms 2017-01-10 07:02:52 +02:00
vhost-backend.c vhost_net: device IOTLB support 2017-01-18 22:59:53 +02:00
vhost-stub.c stubs: move vhost stubs to stubs/vhost.o 2017-01-16 17:52:35 +01:00
vhost-user.c vhost-user: Add MTU protocol feature and op 2017-01-10 07:02:53 +02:00
vhost-vsock.c virtio: cleanup VMSTATE_VIRTIO_DEVICE 2016-10-10 02:21:43 +03:00
vhost.c vhost: skip ROM sections 2017-02-01 03:37:18 +02:00
virtio-balloon.c balloon: Don't balloon roms 2017-01-10 07:02:52 +02:00
virtio-bus.c virtio: force VIRTIO_F_IOMMU_PLATFORM 2017-01-19 23:00:31 +02:00
virtio-crypto-pci.c virtio-crypto-pci: tag virtio-crypto device hot pluggable 2017-01-10 07:02:52 +02:00
virtio-crypto.c hw: Fix typos found by codespell 2017-01-24 23:26:52 +03:00
virtio-mmio.c virtio-mmio: switch to linux headers 2017-01-18 22:59:53 +02:00
virtio-pci.c pci: Convert msix_init() to Error and fix callers 2017-02-01 03:37:18 +02:00
virtio-pci.h virtio-pci: address space translation service (ATS) support 2017-01-10 05:56:59 +02:00
virtio-rng.c virtio: cleanup VMSTATE_VIRTIO_DEVICE 2016-10-10 02:21:43 +03:00
virtio.c virtio: add missing region cache init in virtio_load() 2017-03-02 07:14:28 +02:00