Hi Avi,

A new version, with Anthony's suggested savevm version number bump.

Cheers,
Mark.

From: Mark McLoughlin <[email protected]>
Subject: [PATCH] kvm: qemu: virtio-net: migration fixes

We were failing to save two important pieces of state:

  1) Whether the guest will supply us rx buffers using the
     new mergeable format; this caused the migrated guest
     to crash with "virtio-net header not in first element"

  2) Whether the tx/rx buffers we exchange with the tap
     code should include a virtio_net_hdr header; this
     caused the migrated guest to receive garbage packets
     because the tap code was stripping away the header
     and virtio_net was interpreting packet data as the
     virtio_net header

With these fixes a guest using mergeable rx buffers and
GSO passes a simple "ping while migrating" test.

Bump the savevm version number and refuse to load v1 saves
just to be on the safe side.

Signed-off-by: Mark McLoughlin <[email protected]>
---
 qemu/hw/virtio-net.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c
index ef8f591..dfe370a 100644
--- a/qemu/hw/virtio-net.c
+++ b/qemu/hw/virtio-net.c
@@ -360,19 +360,30 @@ static void virtio_net_save(QEMUFile *f, void *opaque)
 
     qemu_put_buffer(f, n->mac, 6);
     qemu_put_be32(f, n->tx_timer_active);
+    qemu_put_be32(f, n->mergeable_rx_bufs);
+
+#ifdef TAP_VNET_HDR
+    qemu_put_be32(f, tap_has_vnet_hdr(n->vc->vlan->first_client));
+#endif
 }
 
 static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
 {
     VirtIONet *n = opaque;
 
-    if (version_id != 1)
+    if (version_id != 2)
         return -EINVAL;
 
     virtio_load(&n->vdev, f);
 
     qemu_get_buffer(f, n->mac, 6);
     n->tx_timer_active = qemu_get_be32(f);
+    n->mergeable_rx_bufs = qemu_get_be32(f);
+
+#ifdef TAP_VNET_HDR
+    if (qemu_get_be32(f))
+      tap_using_vnet_hdr(n->vc->vlan->first_client, 1);
+#endif
 
     if (n->tx_timer_active) {
         qemu_mod_timer(n->tx_timer,
@@ -407,7 +418,7 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int 
devfn)
     n->tx_timer_active = 0;
     n->mergeable_rx_bufs = 0;
 
-    register_savevm("virtio-net", virtio_net_id++, 1,
+    register_savevm("virtio-net", virtio_net_id++, 2,
                     virtio_net_save, virtio_net_load, n);
 
     return (PCIDevice *)n;
-- 
1.6.0.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to