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

Reply via email to