From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id DF2A5298F for ; Thu, 27 Apr 2017 15:51:52 +0200 (CEST) Received: from 6wind.com (unknown [10.16.0.184]) by proxy.6wind.com (Postfix) with SMTP id 5ABEE24AED; Thu, 27 Apr 2017 15:51:46 +0200 (CEST) Received: by 6wind.com (sSMTP sendmail emulation); Thu, 27 Apr 2017 15:51:46 +0200 From: Pascal Mazon To: dev@dpdk.org Cc: pascal.mazon@6wind.com Date: Thu, 27 Apr 2017 15:51:42 +0200 Message-Id: <185dca03cb8d8665feef0adcfbe36e51529c4563.1493301089.git.pascal.mazon@6wind.com> X-Mailer: git-send-email 2.12.0.306.g4a9b9b3 Subject: [dpdk-dev] [PATCH] net/tap: fix support for large Rx queues X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Apr 2017 13:51:53 -0000 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 d9ec14d709ed..e44de027d705 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, -- 2.12.0.306.g4a9b9b3