From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47658) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VqOXL-0006e2-LL for qemu-devel@nongnu.org; Tue, 10 Dec 2013 09:43:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VqOXJ-0000UA-VV for qemu-devel@nongnu.org; Tue, 10 Dec 2013 09:43:47 -0500 Received: from mnementh.archaic.org.uk ([2001:8b0:1d0::1]:43342) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VqOXJ-0000S5-PA for qemu-devel@nongnu.org; Tue, 10 Dec 2013 09:43:45 -0500 From: Peter Maydell Date: Tue, 10 Dec 2013 14:43:25 +0000 Message-Id: <1386686613-2390-30-git-send-email-peter.maydell@linaro.org> In-Reply-To: <1386686613-2390-1-git-send-email-peter.maydell@linaro.org> References: <1386686613-2390-1-git-send-email-peter.maydell@linaro.org> Subject: [Qemu-devel] [PULL 29/37] net/cadence_gem: Don't rx packets when no rx buffer available List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Blue Swirl , qemu-devel@nongnu.org, Aurelien Jarno From: Peter Crosthwaite Return false from can_receive() when no valid buffer descriptor is available. Ensures against mass packet droppage in some applications. Signed-off-by: Peter Crosthwaite Message-id: cde00ef774e84e2586bf10fd37b542f75bf36cfb.1386136219.git.peter.crosthwaite@xilinx.com Signed-off-by: Peter Maydell --- hw/net/cadence_gem.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c index f6e38ca..92dc2f2 100644 --- a/hw/net/cadence_gem.c +++ b/hw/net/cadence_gem.c @@ -463,6 +463,15 @@ static int gem_can_receive(NetClientState *nc) return 0; } + if (rx_desc_get_ownership(s->rx_desc) == 1) { + if (s->can_rx_state != 2) { + s->can_rx_state = 2; + DB_PRINT("can't receive - busy buffer descriptor 0x%x\n", + s->rx_desc_addr); + } + return 0; + } + if (s->can_rx_state != 0) { s->can_rx_state = 0; DB_PRINT("can receive 0x%x\n", s->rx_desc_addr); @@ -1142,7 +1151,7 @@ static void gem_write(void *opaque, hwaddr offset, uint64_t val, /* Reset to start of Q when transmit disabled. */ s->tx_desc_addr = s->regs[GEM_TXQBASE]; } - if (val & GEM_NWCTRL_RXENA) { + if (gem_can_receive(qemu_get_queue(s->nic))) { qemu_flush_queued_packets(qemu_get_queue(s->nic)); } break; -- 1.8.5