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

Submitted by Dustin Kirkland on Oct. 29, 2009, 2:43 p.m.

Details

Message ID 1256827417.25064.122.camel@x200
State New
Headers show

Commit Message

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 hide | download patch | download mbox

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)) {