From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mark McLoughlin Subject: [PATCH 1/1] kvm: qemu: virtio-net: migration fixes Date: Tue, 6 Jan 2009 11:48:18 +0000 Message-ID: <1231242498-3191-1-git-send-email-markmc@redhat.com> Cc: kvm@vger.kernel.org, Mark McLoughlin To: Avi Kivity Return-path: Received: from mail20.svc.cra.dublin.eircom.net ([159.134.118.221]:37620 "HELO mail20.svc.cra.dublin.eircom.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751089AbZAFLsW (ORCPT ); Tue, 6 Jan 2009 06:48:22 -0500 Sender: kvm-owner@vger.kernel.org List-ID: 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. The mergeable rx buffers part has been sent upstream to qemu-devel, but the GSO part is KVM specific. Signed-off-by: Mark McLoughlin --- qemu/hw/virtio-net.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c index ef8f591..e47a0a4 100644 --- a/qemu/hw/virtio-net.c +++ b/qemu/hw/virtio-net.c @@ -360,6 +360,11 @@ 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) @@ -373,6 +378,12 @@ static int virtio_net_load(QEMUFile *f, void *opaque, int version_id) 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, -- 1.6.0.6