[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] rtl8139: honor RxOverflow flag in can_receive m
From: |
Igor Kovalenko |
Subject: |
Re: [Qemu-devel] [PATCH] rtl8139: honor RxOverflow flag in can_receive method |
Date: |
Tue, 31 Jan 2012 07:12:59 +0300 |
2012/1/30 Fernando Luis Vázquez Cao <address@hidden>:
> 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 <address@hidden>
> Tested-by: Hayato Kakuta <address@hidden>
> Signed-off-by: Fernando Luis Vazquez Cao<address@hidden>
> ---
>
> 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 <address@hidden>
--
Kind regards,
Igor V. Kovalenko