rte_eth_from_rings() takes a numa node (socket) but used unsigned where int should have been used to allow for SOCKET_ID_ANY. The only usage is in call rte_malloc routines with socket and those functions expect int.
Change the parameter to int socket_id and carry that through the two internal create functions. The devargs path keeps working as before: "nodeaction=name:-1:CREATE" was already accepted, since strtol() returned -1 into an unsigned int which became SOCKET_ID_ANY again at the allocation. Signed-off-by: Stephen Hemminger <[email protected]> --- doc/guides/rel_notes/release_26_11.rst | 6 ++++ drivers/net/ring/rte_eth_ring.c | 38 +++++++++++++------------- drivers/net/ring/rte_eth_ring.h | 11 ++++---- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst index e027c7a27f..58b0e588ce 100644 --- a/doc/guides/rel_notes/release_26_11.rst +++ b/doc/guides/rel_notes/release_26_11.rst @@ -206,6 +206,12 @@ API Changes Also, make sure to start the actual text at the margin. ======================================================= +* net/ring: The last parameter of ``rte_eth_from_rings`` changed from + ``const unsigned numa_node`` to ``int socket_id``, so that + ``SOCKET_ID_ANY`` can be passed as it can everywhere else a socket is + given. The value was already used as a signed socket id by the memory + and ring allocations underneath. + * ethdev: Updated VMDq related API. * At port configuration time, the number of VMDq pools advertised by a driver diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c index 4cbdbe3085..533a4c1b6b 100644 --- a/drivers/net/ring/rte_eth_ring.c +++ b/drivers/net/ring/rte_eth_ring.c @@ -32,7 +32,7 @@ struct ring_internal_args { const unsigned int nb_rx_queues; struct rte_ring * const *tx_queues; const unsigned int nb_tx_queues; - const unsigned int numa_node; + int socket_id; }; /* rte_eth_from_rings() stashes a pointer to its on-stack args here */ @@ -361,7 +361,7 @@ do_eth_dev_ring_create(const char *name, const unsigned int nb_rx_queues, struct rte_ring *const tx_queues[], const unsigned int nb_tx_queues, - const unsigned int numa_node, enum dev_action action, + int socket_id, enum dev_action action, struct rte_eth_dev **eth_dev_p) { struct rte_eth_dev_data *data = NULL; @@ -371,24 +371,24 @@ do_eth_dev_ring_create(const char *name, void **tx_queues_local = NULL; unsigned int i; - PMD_LOG(INFO, "Creating rings-backed ethdev on numa socket %u", - numa_node); + PMD_LOG(INFO, "Creating rings-backed ethdev on numa socket %d", + socket_id); rx_queues_local = rte_calloc_socket(name, nb_rx_queues, - sizeof(void *), 0, numa_node); + sizeof(void *), 0, socket_id); if (rx_queues_local == NULL) { rte_errno = ENOMEM; goto error; } tx_queues_local = rte_calloc_socket(name, nb_tx_queues, - sizeof(void *), 0, numa_node); + sizeof(void *), 0, socket_id); if (tx_queues_local == NULL) { rte_errno = ENOMEM; goto error; } - internals = rte_zmalloc_socket(name, sizeof(*internals), 0, numa_node); + internals = rte_zmalloc_socket(name, sizeof(*internals), 0, socket_id); if (internals == NULL) { rte_errno = ENOMEM; goto error; @@ -404,7 +404,7 @@ do_eth_dev_ring_create(const char *name, /* now put it all together * - store EAL device in eth_dev, * - store queue data in internals, - * - store numa_node info in eth_dev_data + * - store socket id info in eth_dev_data * - point eth_dev_data to internals * - and point eth_dev structure to new eth_dev_data structure */ @@ -439,7 +439,7 @@ do_eth_dev_ring_create(const char *name, data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; eth_dev->dev_ops = &ops; - data->numa_node = numa_node; + data->numa_node = socket_id; /* finally assign rx and tx ops */ eth_dev->rx_pkt_burst = eth_ring_rx; @@ -464,14 +464,14 @@ rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[], const unsigned int nb_rx_queues, struct rte_ring *const tx_queues[], const unsigned int nb_tx_queues, - const unsigned int numa_node) + int socket_id) { struct ring_internal_args args = { .rx_queues = rx_queues, .nb_rx_queues = nb_rx_queues, .tx_queues = tx_queues, .nb_tx_queues = nb_tx_queues, - .numa_node = numa_node, + .socket_id = socket_id, }; char ring_name[RTE_RING_NAMESIZE]; uint16_t port_id = RTE_MAX_ETHPORTS; @@ -526,7 +526,7 @@ rte_eth_from_ring(struct rte_ring *r) static int eth_dev_ring_create(const char *name, struct rte_vdev_device *vdev, - const unsigned int numa_node, + int socket_id, enum dev_action action, struct rte_eth_dev **eth_dev) { /* rx and tx are so-called from point of view of first port. @@ -549,7 +549,7 @@ eth_dev_ring_create(const char *name, } rxtx[i] = (action == DEV_CREATE) ? - rte_ring_create(rng_name, 1024, numa_node, + rte_ring_create(rng_name, 1024, socket_id, RING_F_SP_ENQ|RING_F_SC_DEQ) : rte_ring_lookup(rng_name); if (rxtx[i] == NULL) @@ -557,7 +557,7 @@ eth_dev_ring_create(const char *name, } if (do_eth_dev_ring_create(name, vdev, rxtx, num_rings, rxtx, num_rings, - numa_node, action, eth_dev) < 0) + socket_id, action, eth_dev) < 0) return -1; return 0; @@ -565,7 +565,7 @@ eth_dev_ring_create(const char *name, struct node_action_pair { char name[ETH_RING_ACTION_MAX_LEN]; - unsigned int node; + int socket_id; enum dev_action action; }; @@ -626,7 +626,7 @@ static int parse_kvlist(const char *key __rte_unused, goto out; errno = 0; - info->list[info->count].node = strtol(node, &end, 10); + info->list[info->count].socket_id = strtol(node, &end, 10); if ((errno != 0) || (*end != '\0')) { PMD_LOG(WARNING, @@ -686,7 +686,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) internal_args->nb_rx_queues, internal_args->tx_queues, internal_args->nb_tx_queues, - internal_args->numa_node, + internal_args->socket_id, DEV_ATTACH, ð_dev); return ret >= 0 ? 0 : ret; @@ -740,7 +740,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) for (info->count = 0; info->count < info->total; info->count++) { ret = eth_dev_ring_create(info->list[info->count].name, dev, - info->list[info->count].node, + info->list[info->count].socket_id, info->list[info->count].action, ð_dev); if (ret == -1 && info->list[info->count].action == DEV_CREATE) { @@ -748,7 +748,7 @@ rte_pmd_ring_probe(struct rte_vdev_device *dev) "Attach to pmd_ring for %s", name); ret = eth_dev_ring_create(name, dev, - info->list[info->count].node, + info->list[info->count].socket_id, DEV_ATTACH, ð_dev); } diff --git a/drivers/net/ring/rte_eth_ring.h b/drivers/net/ring/rte_eth_ring.h index 98292c7b33..dfbfce9f2f 100644 --- a/drivers/net/ring/rte_eth_ring.h +++ b/drivers/net/ring/rte_eth_ring.h @@ -24,17 +24,18 @@ extern "C" { * pointer to array of rte_rings to be used as TX queues * @param nb_tx_queues * number of elements in the tx_queues array - * @param numa_node - * the numa node on which the memory for this port is to be allocated + * @param socket_id + * the NUMA socket on which the memory for this port is to be allocated, + * or SOCKET_ID_ANY * @return * the port number of the newly created the ethdev or -1 on error. */ int rte_eth_from_rings(const char *name, struct rte_ring * const rx_queues[], - const unsigned nb_rx_queues, + const unsigned int nb_rx_queues, struct rte_ring *const tx_queues[], - const unsigned nb_tx_queues, - const unsigned numa_node); + const unsigned int nb_tx_queues, + int socket_id); /** * Create a new ethdev port from a ring -- 2.53.0

