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