Patchwork qemu-kvm-0.11 regression, crashes on older guests with virtio network

login
register
mail settings
Submitter Dustin Kirkland
Date Oct. 29, 2009, 2:43 p.m.
Message ID <1256827417.25064.122.camel@x200>
Download mbox | patch
Permalink /patch/37197/
State New
Headers show

Comments

Dustin Kirkland - Oct. 29, 2009, 2:43 p.m.
On Thu, 2009-10-29 at 09:16 +0000, Mark McLoughlin wrote:
> Hi Dustin,
> 
> On Wed, 2009-10-28 at 14:22 -0500, Dustin Kirkland wrote:
> > I believe that we have identified a regression in qemu-kvm-0.11.0.
> 
> Regression versus which previous version of qemu-kvm?

Okay, sorry for the ambiguity.  I actually had to clarify this for
myself.  The regression is as compared to the kvm-84 package that the
previous version of Ubuntu (9.04 Jaunty) carried.

In this package, we carried the attached patch from Anthony Liguori.

I had incorrectly assumed that this patch made it into the upstream
tree.  As Anthony stated in his earlier email, a different
implementation of the fix from Rusty was committed instead.  The fix as
committed doesn't quite solve the problem as we're experiencing it.

:-Dustin

Patch

Work around broken virtio drivers in 2.6.26

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c

index 9bce3a0..5b615f9 100644

--- a/qemu/hw/virtio-net.c

+++ b/qemu/hw/virtio-net.c

@@ -120,6 +120,9 @@  static uint32_t virtio_net_get_features(VirtIODevice *vdev)

 
     if (tap_has_vnet_hdr(host)) {
         tap_using_vnet_hdr(host, 1);
+#if 0

+        /* Stop advertising advanced features until we work around the fact

+         * that this is totally broken in 2.6.26 kernels */

         features |= (1 << VIRTIO_NET_F_CSUM);
         features |= (1 << VIRTIO_NET_F_GUEST_CSUM);
         features |= (1 << VIRTIO_NET_F_GUEST_TSO4);
@@ -130,6 +133,7 @@  static uint32_t virtio_net_get_features(VirtIODevice *vdev)

         features |= (1 << VIRTIO_NET_F_HOST_ECN);
         features |= (1 << VIRTIO_NET_F_MRG_RXBUF);
         /* Kernel can't actually handle UFO in software currently. */
+#endif

     }
 #endif
 
@@ -374,8 +378,14 @@  static int receive_header(VirtIONet *n, struct iovec *iov, int iovcnt,

     struct virtio_net_hdr *hdr = iov[0].iov_base;
     int offset = 0;
 
+#if 0

     hdr->flags = 0;
     hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
+#else

+    /* we need to clear out the whole header, including any garbage that may be

+     */

+    memset(hdr, 0, sizeof(*hdr));

+#endif

 
 #ifdef TAP_VNET_HDR
     if (tap_has_vnet_hdr(n->vc->vlan->first_client)) {