From ec12df9504fe416bcde30224c2b02251151d679c Mon Sep 17 00:00:00 2001 From: Pascal Mazon Date: Thu, 27 Apr 2017 15:51:42 +0200 Subject: [PATCH] net/tap: fix support for large Rx queues Rx queues configured with more than 1023 descriptors cause readv() calls to fail due to more iovec entries than permitted by the kernel. As a result, no packets can be received. Quietly limit internal Rx queue size to the maximum number of iovec entries to fix this issue. Fixes: 0781f5762cfe ("net/tap: support segmented mbufs") Signed-off-by: Pascal Mazon --- drivers/net/tap/rte_eth_tap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index d9ec14d709..e44de027d7 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -875,7 +875,9 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, struct pmd_internals *internals = dev->data->dev_private; struct rx_queue *rxq = &internals->rxq[rx_queue_id]; struct rte_mbuf **tmp = &rxq->pool; - struct iovec (*iovecs)[nb_rx_desc + 1]; + long iov_max = sysconf(_SC_IOV_MAX); + uint16_t nb_desc = RTE_MIN(nb_rx_desc, iov_max - 1); + struct iovec (*iovecs)[nb_desc + 1]; int data_off = RTE_PKTMBUF_HEADROOM; int ret = 0; int fd; @@ -891,13 +893,13 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, rxq->mp = mp; rxq->trigger_seen = 1; /* force initial burst */ rxq->in_port = dev->data->port_id; - rxq->nb_rx_desc = nb_rx_desc; + rxq->nb_rx_desc = nb_desc; iovecs = rte_zmalloc_socket(dev->data->name, sizeof(*iovecs), 0, socket_id); if (!iovecs) { RTE_LOG(WARNING, PMD, "%s: Couldn't allocate %d RX descriptors\n", - dev->data->name, nb_rx_desc); + dev->data->name, nb_desc); return -ENOMEM; } rxq->iovecs = iovecs; @@ -911,7 +913,7 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, (*rxq->iovecs)[0].iov_len = sizeof(struct tun_pi); (*rxq->iovecs)[0].iov_base = &rxq->pi; - for (i = 1; i <= nb_rx_desc; i++) { + for (i = 1; i <= nb_desc; i++) { *tmp = rte_pktmbuf_alloc(rxq->mp); if (!*tmp) { RTE_LOG(WARNING, PMD,