[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 11/15] virtio: add missing region cache init in virti
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 11/15] virtio: add missing region cache init in virtio_load() |
Date: |
Thu, 2 Mar 2017 08:20:46 +0200 |
From: Stefan Hajnoczi <address@hidden>
Commit 97cd965c070152bc626c7507df9fb356bbe1cd81 ("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 <address@hidden>
Cc: Paolo Bonzini <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
Reviewed-by: Cornelia Huck <address@hidden>
Tested-by: Eric Auger <address@hidden>
---
hw/virtio/virtio.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 294c909..efce4b3 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1857,7 +1857,10 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
if (k->has_variable_vring_alignment) {
qemu_put_be32(f, vdev->vq[i].vring.align);
}
- /* XXX virtio-1 devices */
+ /*
+ * Save desc now, the rest of the ring addresses are saved in
+ * subsections for VIRTIO-1 devices.
+ */
qemu_put_be64(f, vdev->vq[i].vring.desc);
qemu_put_be16s(f, &vdev->vq[i].last_avail_idx);
if (k->save_queue) {
@@ -1998,14 +2001,11 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int
version_id)
vdev->vq[i].signalled_used_valid = false;
vdev->vq[i].notification = true;
- if (vdev->vq[i].vring.desc) {
- /* XXX virtio-1 devices */
- virtio_queue_update_rings(vdev, i);
- } else if (vdev->vq[i].last_avail_idx) {
+ if (!vdev->vq[i].vring.desc && vdev->vq[i].last_avail_idx) {
error_report("VQ %d address 0x0 "
"inconsistent with Host index 0x%x",
i, vdev->vq[i].last_avail_idx);
- return -1;
+ return -1;
}
if (k->load_queue) {
ret = k->load_queue(qbus->parent, i, f);
@@ -2066,6 +2066,19 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int
version_id)
for (i = 0; i < num; i++) {
if (vdev->vq[i].vring.desc) {
uint16_t nheads;
+
+ /*
+ * VIRTIO-1 devices migrate desc, used, and avail ring addresses so
+ * only the region cache needs to be set up. Legacy devices need
+ * to calculate used and avail ring addresses based on the desc
+ * address.
+ */
+ if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
+ virtio_init_region_cache(vdev, i);
+ } else {
+ virtio_queue_update_rings(vdev, i);
+ }
+
nheads = vring_avail_idx(&vdev->vq[i]) -
vdev->vq[i].last_avail_idx;
/* Check it isn't doing strange things with descriptor numbers. */
if (nheads > vdev->vq[i].vring.num) {
--
MST
- Re: [Qemu-devel] [PULL 05/15] qmp/hmp: add query-vm-generation-id and 'info vm-generation-id' commands, (continued)
[Qemu-devel] [PULL 04/15] ACPI: Add Virtual Machine Generation ID support, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 07/15] MAINTAINERS: Add VM Generation ID entries, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 06/15] tests: Move reusable ACPI code into a utility file, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 08/15] virtio: check for vring setup in virtio_queue_empty, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 10/15] virtio: invalidate memory in vring_set_avail_event(), Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 09/15] virtio: guard vring access when setting notification, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 11/15] virtio: add missing region cache init in virtio_load(),
Michael S. Tsirkin <=
[Qemu-devel] [PULL 12/15] virtio: unbreak virtio-pci with IOMMU after caching ring translations, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 14/15] tests/acpi: update DSDT after last patch, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 13/15] acpi: simplify _OSC, Michael S. Tsirkin, 2017/03/02
[Qemu-devel] [PULL 15/15] hw/pxb-pcie: fix PCI Express hotplug support, Michael S. Tsirkin, 2017/03/02
Re: [Qemu-devel] [PULL 00/15] virtio, pc: fixes, features, Peter Maydell, 2017/03/02
Re: [Qemu-devel] [PULL 00/15] virtio, pc: fixes, features, Peter Maydell, 2017/03/03
Re: [Qemu-devel] [PULL 00/15] virtio, pc: fixes, features, Peter Maydell, 2017/03/03