[1/1] kvm: qemu: virtio-net: migration fixes
diff mbox

Message ID 1231323820.5050.10.camel@localhost.localdomain
State Accepted, archived
Headers show

Commit Message

Mark McLoughlin Jan. 7, 2009, 10:23 a.m. UTC
Hi Avi,

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

Cheers,
Mark.

From: Mark McLoughlin <markmc@redhat.com>
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 <markmc@redhat.com>
---
 qemu/hw/virtio-net.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

Comments

Avi Kivity Jan. 8, 2009, 2:11 p.m. UTC | #1
Mark McLoughlin wrote:
> Hi Avi,
>
> A new version, with Anthony's suggested savevm version number bump.
>   

Applied, thanks.  There wasn't much chance of me applying this before 
Anthony; so next time please send an incremental patch.
Avi Kivity Jan. 11, 2009, 3:50 p.m. UTC | #2
Mark McLoughlin wrote:
> Hi Avi,
>
> A new version, with Anthony's suggested savevm version number bump.
>   

I've already committed this as ea47a77149b1.  Sorry if my previous 
message gave the impression I didn't.
Avi Kivity Jan. 11, 2009, 3:51 p.m. UTC | #3
Avi Kivity wrote:
> Mark McLoughlin wrote:
>> Hi Avi,
>>
>> A new version, with Anthony's suggested savevm version number bump.
>>   
>
> I've already committed this as ea47a77149b1.  Sorry if my previous 
> message gave the impression I didn't.
>
>

Oops.  For some reason I though this was a new message.

Patch
diff mbox

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;