2012/1/30 Fernando Luis Vázquez Cao <ferna...@oss.ntt.co.jp>: > Some drivers (Linux' 8139too among them) rely on the NIC injecting an > interrupt > in the event of a receive buffer overflow and, accordingly, set the RxOverflow > bit in the interrupt mask. Unfortunately rtl8139's can_receive method ignores > the RxOverflow flag, which may lead to a situation where rtl8139 stops > receiving > packets (can_receive returns 0) when the receive buffer becomes full. > > If the driver eventually read from the receive buffer or reset the card the > emulator could recover from this situation. However some implementations only > do this upon receiving an interrupt with either RxOK or RxOverflow set in the > ISR; interrupt that will never come because QEMU's flow control mechanisms > would > prevent rtl8139 from receiving any packet. > > Letting packets go through when the overflow interrupt is enabled makes the > QEMU emulator compliant to the spec and solves the problem. > > This patch should fix a relatively common (in our experience) network stall > observed when running enterprise distros with rtl8139 as the NIC; in some > cases > the 8139too device driver gets loaded and when under heavy load the network > eventually stops working. > > Reported-by: Hayato Kakuta <kakuta.hay...@oss.ntt.co.jp> > Tested-by: Hayato Kakuta <kakuta.hay...@oss.ntt.co.jp> > Signed-off-by: Fernando Luis Vazquez Cao<ferna...@oss.ntt.co.jp> > --- > > diff -urNp qemu-kvm-orig/hw/rtl8139.c qemu-kvm/hw/rtl8139.c > --- qemu-kvm-orig/hw/rtl8139.c 2012-01-12 20:55:27.000000000 +0900 > +++ qemu-kvm/hw/rtl8139.c 2012-01-18 17:20:12.000000000 +0900 > @@ -824,7 +824,7 @@ static int rtl8139_can_receive(VLANClien > } else { > avail = MOD2(s->RxBufferSize + s->RxBufPtr - s->RxBufAddr, > s->RxBufferSize); > - return (avail == 0 || avail >= 1514); > + return (avail == 0 || avail >= 1514 || (s->IntrMask & RxOverflow)); > } > } > > >
Acked-by: Igor Kovalenko <igor.v.kovale...@gmail.com> -- Kind regards, Igor V. Kovalenko