Jim Paris wrote:
Daniel P. Berrange wrote:
> On Tue, Sep 29, 2009 at 02:39:59AM -0400, Jim Paris wrote:
> > Hi,
> >
> > After upgrading libvirt on one system, my kvm guests running a 2.6.26
> > kernel with virtio networking could no longer communicate with the
> > network.
> >
> > It seems that the problem is caused by newer libvirt versions
> > unconditionally enabling GSO support by setting IFF_VNET_HDR [1].
> >
> > However, support for this feature is apparently broken in 2.6.26.
> > Ubuntu seems to have also discovered this problem [2] and they
> > currently work around it by removing GSO support from kvm [3].
> >
> > Currently, I'm running with a patched libvirt that never sets
> > IFF_VNET_HDR, and it's working fine once again.
> >
> > While this is not a libvirt problem per se, it certainly violated the
> > principle of least surprise given that libvirt was the only thing that
> > changed! But I don't know if there's much that libvirt can do to
> > avoid this problem, as it's really something that needs to get fixed
> > in kvm, or the guest needs to be upgraded, or switched away from
> > virtio.
>
> libvirt probes to see if IFF_VNET_HDR is supported by the kernel
> and if so, enables it. If its broken in the kernel, the kernel
> should have been patch, or had the flag disabled as its not really
> practical for libvirt to special case this thing further
Libvirt probes support in the host kernel. The problem lies with the
guest kernel, which fails to communicate with the host when the host
has IFF_VNET_HDR enabled.
Nevermind that, my conclusions were bogus. Things still didn't quite add
up, so I tracked down what's really going on here:
- Libvirt 0.7.1 (as packaged by Debian) has IFF_VNET_HDR support.
- Qemu-kvm 0.11.0 (as built by myself) did NOT include IFF_VNET_HDR
support, because it was built against the older headers on my
system.
Libvirt assumes that if it can support IFF_VNET_HDR, and qemu is new
enough, then qemu must support IFF_VNET_HDR too. This assumption was
wrong in my case, but it seems there's no easy way for libvirt to
figure out the correct thing to do.
Anyway, after updating the linux-libc-dev package and rebuilding
qemu-kvm, things work now.
-jim