qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache
@ 2017-02-22 16:37 Stefan Hajnoczi
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 1/2] virtio: invalidate memory in vring_set_avail_event() Stefan Hajnoczi
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-22 16:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael S. Tsirkin, Cornelia Huck, Stefan Hajnoczi

v2:
 * Avoid early region cache initialization in virtio_load() with wrong ring
   addresses for VIRTIO-1 in Patch 2 [Cornelia]

Bug fixes for the recently added memory region cache in virtio.  This series
fixes live migration, see patches for details.

Stefan Hajnoczi (2):
  virtio: invalidate memory in vring_set_avail_event()
  virtio: add missing region cache init in virtio_load()

 hw/virtio/virtio.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

-- 
2.9.3

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 1/2] virtio: invalidate memory in vring_set_avail_event()
  2017-02-22 16:37 [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Stefan Hajnoczi
@ 2017-02-22 16:37 ` Stefan Hajnoczi
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load() Stefan Hajnoczi
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-22 16:37 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Cornelia Huck, Stefan Hajnoczi, Paolo Bonzini

Remember to invalidate the avail event field so the memory pages are
marked dirty.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 hw/virtio/virtio.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 23483c7..da5c6fe 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -282,6 +282,7 @@ static inline void vring_set_avail_event(VirtQueue *vq, uint16_t val)
     caches = atomic_rcu_read(&vq->vring.caches);
     pa = offsetof(VRingUsed, ring[vq->vring.num]);
     virtio_stw_phys_cached(vq->vdev, &caches->used, pa, val);
+    address_space_cache_invalidate(&caches->used, pa, sizeof(val));
 }
 
 void virtio_queue_set_notification(VirtQueue *vq, int enable)
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load()
  2017-02-22 16:37 [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Stefan Hajnoczi
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 1/2] virtio: invalidate memory in vring_set_avail_event() Stefan Hajnoczi
@ 2017-02-22 16:37 ` Stefan Hajnoczi
  2017-02-27 14:06   ` Cornelia Huck
  2017-02-24 14:24 ` [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Auger Eric
  2017-02-28 13:18 ` Stefan Hajnoczi
  3 siblings, 1 reply; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-22 16:37 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Cornelia Huck, Stefan Hajnoczi,
	Dr . David Alan Gilbert, Paolo Bonzini

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>
---
 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 da5c6fe..f3bbf38 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1853,7 +1853,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) {
@@ -1994,14 +1997,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);
@@ -2062,6 +2062,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) {
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache
  2017-02-22 16:37 [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Stefan Hajnoczi
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 1/2] virtio: invalidate memory in vring_set_avail_event() Stefan Hajnoczi
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load() Stefan Hajnoczi
@ 2017-02-24 14:24 ` Auger Eric
  2017-02-28 13:18 ` Stefan Hajnoczi
  3 siblings, 0 replies; 6+ messages in thread
From: Auger Eric @ 2017-02-24 14:24 UTC (permalink / raw)
  To: Stefan Hajnoczi, qemu-devel; +Cc: Cornelia Huck, Michael S. Tsirkin

Hi Stephan,

On 22/02/2017 17:37, Stefan Hajnoczi wrote:
> v2:
>  * Avoid early region cache initialization in virtio_load() with wrong ring
>    addresses for VIRTIO-1 in Patch 2 [Cornelia]
> 
> Bug fixes for the recently added memory region cache in virtio.  This series
> fixes live migration, see patches for details.
> 
> Stefan Hajnoczi (2):
>   virtio: invalidate memory in vring_set_avail_event()
>   virtio: add missing region cache init in virtio_load()
> 
>  hw/virtio/virtio.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)
> 

For me this fixes virtio-net migration issue caused by "virtio: use
VRingMemoryRegionCaches for avail and used rings".

Tested-by: Eric Auger <eric.auger@redhat.com>

Thanks

Eric

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load()
  2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load() Stefan Hajnoczi
@ 2017-02-27 14:06   ` Cornelia Huck
  0 siblings, 0 replies; 6+ messages in thread
From: Cornelia Huck @ 2017-02-27 14:06 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: qemu-devel, Paolo Bonzini, Dr . David Alan Gilbert,
	Michael S. Tsirkin

On Wed, 22 Feb 2017 16:37:34 +0000
Stefan Hajnoczi <stefanha@redhat.com> wrote:

> 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>
> ---
>  hw/virtio/virtio.c | 25 +++++++++++++++++++------
>  1 file changed, 19 insertions(+), 6 deletions(-)

Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache
  2017-02-22 16:37 [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Stefan Hajnoczi
                   ` (2 preceding siblings ...)
  2017-02-24 14:24 ` [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Auger Eric
@ 2017-02-28 13:18 ` Stefan Hajnoczi
  3 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2017-02-28 13:18 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel, Cornelia Huck, Stefan Hajnoczi

[-- Attachment #1: Type: text/plain, Size: 613 bytes --]

On Wed, Feb 22, 2017 at 04:37:32PM +0000, Stefan Hajnoczi wrote:
> v2:
>  * Avoid early region cache initialization in virtio_load() with wrong ring
>    addresses for VIRTIO-1 in Patch 2 [Cornelia]
> 
> Bug fixes for the recently added memory region cache in virtio.  This series
> fixes live migration, see patches for details.
> 
> Stefan Hajnoczi (2):
>   virtio: invalidate memory in vring_set_avail_event()
>   virtio: add missing region cache init in virtio_load()
> 
>  hw/virtio/virtio.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)

Michael: Ping?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-02-28 13:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-22 16:37 [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Stefan Hajnoczi
2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 1/2] virtio: invalidate memory in vring_set_avail_event() Stefan Hajnoczi
2017-02-22 16:37 ` [Qemu-devel] [PATCH v2 2/2] virtio: add missing region cache init in virtio_load() Stefan Hajnoczi
2017-02-27 14:06   ` Cornelia Huck
2017-02-24 14:24 ` [Qemu-devel] [PATCH v2 0/2] virtio: migration fixes for memory region cache Auger Eric
2017-02-28 13:18 ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).