All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Eric Auger <eric.auger@redhat.com>
Subject: [Qemu-devel] [PULL 11/15] virtio: add missing region cache init in virtio_load()
Date: Thu, 2 Mar 2017 08:20:46 +0200	[thread overview]
Message-ID: <1488435591-17882-12-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1488435591-17882-1-git-send-email-mst@redhat.com>

From: Stefan Hajnoczi <stefanha@redhat.com>

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 <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>
---
 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

  parent reply	other threads:[~2017-03-02  6:20 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-02  6:20 [Qemu-devel] [PULL 00/15] virtio, pc: fixes, features Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 01/15] linker-loader: Add new 'write pointer' command Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 02/15] docs: VM Generation ID device description Michael S. Tsirkin
2017-04-12 20:06   ` Marc-André Lureau
2017-04-12 20:17     ` Laszlo Ersek
2017-04-12 20:17     ` Ben Warren
2017-04-12 20:22       ` Marc-André Lureau
2017-04-12 20:25         ` Ben Warren
2017-04-12 20:47           ` Marc-André Lureau
2017-04-12 21:03             ` Ben Warren
2017-04-12 21:17               ` Marc-André Lureau
2017-04-12 21:25                 ` Michael S. Tsirkin
2017-04-13 10:18                 ` Marc-André Lureau
2017-04-12 20:20     ` Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 03/15] ACPI: Add vmgenid blob storage to the build tables Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 04/15] ACPI: Add Virtual Machine Generation ID support Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 05/15] qmp/hmp: add query-vm-generation-id and 'info vm-generation-id' commands Michael S. Tsirkin
2017-03-02  8:11   ` Markus Armbruster
2017-03-02  8:25     ` Laszlo Ersek
2017-03-02  8:37       ` Laszlo Ersek
2017-03-02  9:54         ` Markus Armbruster
2017-03-02  8:42       ` Markus Armbruster
2017-03-02 13:15         ` Laszlo Ersek
2017-03-02 14:50           ` Ben Warren
2017-03-02 15:32             ` Michael S. Tsirkin
2017-03-02 16:24               ` Laszlo Ersek
2017-03-02  6:20 ` [Qemu-devel] [PULL 06/15] tests: Move reusable ACPI code into a utility file Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 07/15] MAINTAINERS: Add VM Generation ID entries Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 08/15] virtio: check for vring setup in virtio_queue_empty Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 09/15] virtio: guard vring access when setting notification Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 10/15] virtio: invalidate memory in vring_set_avail_event() Michael S. Tsirkin
2017-03-02  6:20 ` Michael S. Tsirkin [this message]
2017-03-02  6:20 ` [Qemu-devel] [PULL 12/15] virtio: unbreak virtio-pci with IOMMU after caching ring translations Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 13/15] acpi: simplify _OSC Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 14/15] tests/acpi: update DSDT after last patch Michael S. Tsirkin
2017-03-02  6:20 ` [Qemu-devel] [PULL 15/15] hw/pxb-pcie: fix PCI Express hotplug support Michael S. Tsirkin
2017-03-02  8:34 ` [Qemu-devel] [PULL 00/15] virtio, pc: fixes, features Peter Maydell
2017-03-02 15:29   ` Michael S. Tsirkin
2017-03-03 12:42 ` Peter Maydell
2017-03-03 12:44 ` Peter Maydell
2017-03-03 19:10   ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1488435591-17882-12-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=dgilbert@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.