Replace embedded rxq/txq arrays in pmd_internals with per-queue allocations using rte_zmalloc_socket during queue setup. Queue structures are freed in queue release and device close.
This reduces the size of pmd_internals and allocates queue resources. Can safely remove some redundant checks in rx_queue_setup since these checks are already done in the ethdev layer. Signed-off-by: Stephen Hemminger <[email protected]> --- drivers/net/tap/rte_eth_tap.c | 130 +++++++++++++++++++++++----------- drivers/net/tap/rte_eth_tap.h | 3 +- 2 files changed, 90 insertions(+), 43 deletions(-) diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 6640ac1596..75fa517ae2 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -942,29 +942,36 @@ tap_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *tap_stats, uint64_t rx_total = 0, tx_total = 0, tx_err_total = 0; uint64_t rx_bytes_total = 0, tx_bytes_total = 0; uint64_t rx_nombuf = 0, ierrors = 0; - const struct pmd_internals *pmd = dev->data->dev_private; /* rx queue statistics */ for (i = 0; i < dev->data->nb_rx_queues; i++) { + struct rx_queue *rxq = dev->data->rx_queues[i]; + + if (rxq == NULL) + continue; if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) { - qstats->q_ipackets[i] = pmd->rxq[i].stats.ipackets; - qstats->q_ibytes[i] = pmd->rxq[i].stats.ibytes; + qstats->q_ipackets[i] = rxq->stats.ipackets; + qstats->q_ibytes[i] = rxq->stats.ibytes; } - rx_total += pmd->rxq[i].stats.ipackets; - rx_bytes_total += pmd->rxq[i].stats.ibytes; - rx_nombuf += pmd->rxq[i].stats.rx_nombuf; - ierrors += pmd->rxq[i].stats.ierrors; + rx_total += rxq->stats.ipackets; + rx_bytes_total += rxq->stats.ibytes; + rx_nombuf += rxq->stats.rx_nombuf; + ierrors += rxq->stats.ierrors; } /* tx queue statistics */ for (i = 0; i < dev->data->nb_tx_queues; i++) { + struct tx_queue *txq = dev->data->tx_queues[i]; + + if (txq == NULL) + continue; if (qstats != NULL && i < RTE_ETHDEV_QUEUE_STAT_CNTRS) { - qstats->q_opackets[i] = pmd->txq[i].stats.opackets; - qstats->q_obytes[i] = pmd->txq[i].stats.obytes; + qstats->q_opackets[i] = txq->stats.opackets; + qstats->q_obytes[i] = txq->stats.obytes; } - tx_total += pmd->txq[i].stats.opackets; - tx_bytes_total += pmd->txq[i].stats.obytes; - tx_err_total += pmd->txq[i].stats.errs; + tx_total += txq->stats.opackets; + tx_bytes_total += txq->stats.obytes; + tx_err_total += txq->stats.errs; } tap_stats->ipackets = rx_total; @@ -981,11 +988,19 @@ static int tap_stats_reset(struct rte_eth_dev *dev) { unsigned int i; - struct pmd_internals *pmd = dev->data->dev_private; - for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { - memset(&pmd->rxq[i].stats, 0, sizeof(struct pkt_stats)); - memset(&pmd->txq[i].stats, 0, sizeof(struct pkt_stats)); + for (i = 0; i < dev->data->nb_rx_queues; i++) { + struct rx_queue *rxq = dev->data->rx_queues[i]; + + if (rxq != NULL) + memset(&rxq->stats, 0, sizeof(struct pkt_stats)); + } + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + struct tx_queue *txq = dev->data->tx_queues[i]; + + if (txq != NULL) + memset(&txq->stats, 0, sizeof(struct pkt_stats)); } return 0; @@ -1028,14 +1043,21 @@ tap_dev_close(struct rte_eth_dev *dev) #endif for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { - struct rx_queue *rxq = &internals->rxq[i]; + struct rx_queue *rxq = dev->data->rx_queues[i]; tap_queue_close(process_private, i); - tap_rxq_pool_free(rxq->pool); - rte_free(rxq->iovecs); - rxq->pool = NULL; - rxq->iovecs = NULL; + if (rxq != NULL) { + tap_rxq_pool_free(rxq->pool); + rte_free(rxq->iovecs); + rte_free(rxq); + dev->data->rx_queues[i] = NULL; + } + + if (dev->data->tx_queues[i] != NULL) { + rte_free(dev->data->tx_queues[i]); + dev->data->tx_queues[i] = NULL; + } } if (internals->remote_if_index) { @@ -1094,11 +1116,12 @@ tap_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) tap_rxq_pool_free(rxq->pool); rte_free(rxq->iovecs); - rxq->pool = NULL; - rxq->iovecs = NULL; if (dev->data->tx_queues[qid] == NULL) tap_queue_close(process_private, qid); + + rte_free(rxq); + dev->data->rx_queues[qid] = NULL; } static void @@ -1113,6 +1136,9 @@ tap_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) process_private = rte_eth_devices[txq->out_port].process_private; if (dev->data->rx_queues[qid] == NULL) tap_queue_close(process_private, qid); + + rte_free(txq); + dev->data->tx_queues[qid] = NULL; } static int @@ -1424,16 +1450,14 @@ tap_gso_ctx_setup(struct rte_gso_ctx *gso_ctx, struct rte_eth_dev *dev) static int tap_setup_queue(struct rte_eth_dev *dev, - struct pmd_internals *internals, uint16_t qid, int is_rx) { int fd, ret; struct pmd_internals *pmd = dev->data->dev_private; struct pmd_process_private *process_private = dev->process_private; - struct rx_queue *rx = &internals->rxq[qid]; - struct tx_queue *tx = &internals->txq[qid]; - struct rte_gso_ctx *gso_ctx = is_rx ? NULL : &tx->gso_ctx; + struct tx_queue *tx = dev->data->tx_queues[qid]; + struct rte_gso_ctx *gso_ctx = (is_rx || tx == NULL) ? NULL : &tx->gso_ctx; const char *dir = is_rx ? "rx" : "tx"; fd = process_private->fds[qid]; @@ -1455,16 +1479,16 @@ tap_setup_queue(struct rte_eth_dev *dev, process_private->fds[qid] = fd; } - tx->mtu = &dev->data->mtu; - rx->rxmode = &dev->data->dev_conf.rxmode; + if (tx != NULL) { + tx->mtu = &dev->data->mtu; + tx->type = pmd->type; + } if (gso_ctx) { ret = tap_gso_ctx_setup(gso_ctx, dev); if (ret) return -1; } - tx->type = pmd->type; - return fd; } @@ -1478,8 +1502,8 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, { struct pmd_internals *internals = dev->data->dev_private; struct pmd_process_private *process_private = dev->process_private; - struct rx_queue *rxq = &internals->rxq[rx_queue_id]; - struct rte_mbuf **tmp = &rxq->pool; + struct rx_queue *rxq; + struct rte_mbuf **tmp; long iov_max = sysconf(_SC_IOV_MAX); if (iov_max <= 0) { @@ -1502,23 +1526,35 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, return -1; } + rxq = rte_zmalloc_socket(dev->device->name, sizeof(*rxq), 0, + socket_id); + if (!rxq) { + TAP_LOG(ERR, + "%s: Couldn't allocate rx queue structure", + dev->device->name); + return -ENOMEM; + } + tmp = &rxq->pool; + rxq->mp = mp; rxq->trigger_seen = 1; /* force initial burst */ rxq->in_port = dev->data->port_id; rxq->queue_id = rx_queue_id; rxq->nb_rx_desc = nb_desc; + rxq->rxmode = &dev->data->dev_conf.rxmode; iovecs = rte_zmalloc_socket(dev->device->name, sizeof(*iovecs), 0, socket_id); if (!iovecs) { TAP_LOG(WARNING, "%s: Couldn't allocate %d RX descriptors", dev->device->name, nb_desc); + rte_free(rxq); return -ENOMEM; } rxq->iovecs = iovecs; dev->data->rx_queues[rx_queue_id] = rxq; - fd = tap_setup_queue(dev, internals, rx_queue_id, 1); + fd = tap_setup_queue(dev, rx_queue_id, 1); if (fd == -1) { ret = fd; goto error; @@ -1556,9 +1592,9 @@ tap_rx_queue_setup(struct rte_eth_dev *dev, error: tap_rxq_pool_free(rxq->pool); - rxq->pool = NULL; rte_free(rxq->iovecs); - rxq->iovecs = NULL; + rte_free(rxq); + dev->data->rx_queues[rx_queue_id] = NULL; return ret; } @@ -1566,7 +1602,7 @@ static int tap_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id, uint16_t nb_tx_desc __rte_unused, - unsigned int socket_id __rte_unused, + unsigned int socket_id, const struct rte_eth_txconf *tx_conf) { struct pmd_internals *internals = dev->data->dev_private; @@ -1577,8 +1613,17 @@ tap_tx_queue_setup(struct rte_eth_dev *dev, if (tx_queue_id >= dev->data->nb_tx_queues) return -1; - dev->data->tx_queues[tx_queue_id] = &internals->txq[tx_queue_id]; - txq = dev->data->tx_queues[tx_queue_id]; + + txq = rte_zmalloc_socket(dev->device->name, sizeof(*txq), 0, + socket_id); + if (!txq) { + TAP_LOG(ERR, + "%s: Couldn't allocate tx queue structure", + dev->device->name); + return -ENOMEM; + } + + dev->data->tx_queues[tx_queue_id] = txq; txq->out_port = dev->data->port_id; txq->queue_id = tx_queue_id; @@ -1588,9 +1633,12 @@ tap_tx_queue_setup(struct rte_eth_dev *dev, RTE_ETH_TX_OFFLOAD_UDP_CKSUM | RTE_ETH_TX_OFFLOAD_TCP_CKSUM)); - ret = tap_setup_queue(dev, internals, tx_queue_id, 0); - if (ret == -1) + ret = tap_setup_queue(dev, tx_queue_id, 0); + if (ret == -1) { + rte_free(txq); + dev->data->tx_queues[tx_queue_id] = NULL; return -1; + } TAP_LOG(DEBUG, " TX TUNTAP device name %s, qid %d on fd %d csum %s", internals->name, tx_queue_id, diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index 7be8f4d01b..365d5a5fe1 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -88,8 +88,7 @@ struct pmd_internals { LIST_HEAD(tap_implicit_flows, rte_flow) implicit_flows; #endif - struct rx_queue rxq[RTE_PMD_TAP_MAX_QUEUES]; /* List of RX queues */ - struct tx_queue txq[RTE_PMD_TAP_MAX_QUEUES]; /* List of TX queues */ + struct rte_intr_handle *intr_handle; /* LSC interrupt handle. */ int ka_fd; /* keep-alive file descriptor */ struct rte_mempool *gso_ctx_mp; /* Mempool for GSO packets */ -- 2.51.0

