[dpdk-dev] [PATCH] virtio: fix rx ring descriptor starvation

Tom Kiely tkiely at brocade.com
Fri Nov 13 10:30:13 CET 2015


If all rx descriptors are processed while transient
mbuf exhaustion is present, the rx ring ends up with
no available descriptors. Thus no packets are received
on that ring. Since descriptor refill is performed post
rx descriptor processing, in this case no refill is
ever subsequently performed resulting in permanent rx
traffic drop.

Signed-off-by: Tom Kiely <tkiely at brocade.com>
---
 drivers/net/virtio/virtio_rxtx.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c
index 5770fa2..a95e234 100644
--- a/drivers/net/virtio/virtio_rxtx.c
+++ b/drivers/net/virtio/virtio_rxtx.c
@@ -586,7 +586,8 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 	if (likely(num > DESC_PER_CACHELINE))
 		num = num - ((rxvq->vq_used_cons_idx + num) % DESC_PER_CACHELINE);
 
-	if (num == 0)
+	/* Refill free descriptors even if no pkts recvd */
+	if (num == 0 && virtqueue_full(rxvq))
 		return 0;
 
 	num = virtqueue_dequeue_burst_rx(rxvq, rcv_pkts, len, num);
@@ -683,7 +684,8 @@ virtio_recv_mergeable_pkts(void *rx_queue,
 
 	virtio_rmb();
 
-	if (nb_used == 0)
+	/* Refill free descriptors even if no pkts recvd */
+	if (nb_used == 0 && virtqueue_full(rxvq))
 		return 0;
 
 	PMD_RX_LOG(DEBUG, "used:%d\n", nb_used);
-- 
1.7.10.4



More information about the dev mailing list