[PATCH v4 1/8] net/nfb: prepare for indirect queue mapping scheme

spinler
2026-01-22T07:27:36Z

This prepares queue mapping for port-aware driver implementation.

Signed-off-by: Martin Spinler <spinler@cesnet.cz>
---
drivers/net/nfb/nfb.h | 3 +++
drivers/net/nfb/nfb_ethdev.c | 21 +++++++++++++++++++++
drivers/net/nfb/nfb_rx.c | 30 +++++++++++++++---------------
drivers/net/nfb/nfb_rx.h | 9 ++++-----
drivers/net/nfb/nfb_tx.c | 27 +++++++++++++++------------
drivers/net/nfb/nfb_tx.h | 7 +++----
6 files changed, 61 insertions(+), 36 deletions(-)

diff --git a/drivers/net/nfb/nfb.h b/drivers/net/nfb/nfb.h
index 90b04c6151..3821732c37 100644
--- a/drivers/net/nfb/nfb.h
+++ b/drivers/net/nfb/nfb.h
@@ -60,6 +60,9 @@ struct pmd_internals {
struct pmd_priv {
uint16_t max_rx_queues;
uint16_t max_tx_queues;
+
+ int *queue_map_rx;
+ int *queue_map_tx;
};

#endif /* _NFB_H_ */
diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c
index 947ee9e21d..803815138c 100644
--- a/drivers/net/nfb/nfb_ethdev.c
+++ b/drivers/net/nfb/nfb_ethdev.c
@@ -509,6 +509,7 @@ static const struct eth_dev_ops ops = {
static int
nfb_eth_dev_init(struct rte_eth_dev *dev)
{
+ int i;
int ret;
uint32_t mac_count;
struct rte_eth_dev_data *data = dev->data;
@@ -577,6 +578,20 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
priv->max_rx_queues = max_rx_queues;
priv->max_tx_queues = max_tx_queues;

+ priv->queue_map_rx = rte_calloc("NFB queue map", (max_rx_queues + max_tx_queues),
+ sizeof(*priv->queue_map_rx), 0);
+ if (priv->queue_map_rx == NULL) {
+ ret = -ENOMEM;
+ goto err_alloc_queue_map;
+ }
+ priv->queue_map_tx = priv->queue_map_rx + max_rx_queues;
+
+ /* default queue mapping is 1:1 */
+ for (i = 0; i < max_rx_queues; i++)
+ priv->queue_map_rx[i] = i;
+ for (i = 0; i < max_tx_queues; i++)
+ priv->queue_map_tx[i] = i;
+
/* Allocate space for MAC addresses */
mac_count = nfb_eth_get_max_mac_address_count(dev);
data->mac_addrs = rte_zmalloc(data->name,
@@ -608,6 +623,8 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
return 0;

err_malloc_mac_addrs:
+ rte_free(priv->queue_map_rx);
+err_alloc_queue_map:
nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
nfb_close(internals->nfb);
@@ -633,6 +650,10 @@ nfb_eth_dev_uninit(struct rte_eth_dev *dev)
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
struct rte_pci_addr *pci_addr = &pci_dev->addr;
struct pmd_internals *internals = dev->process_private;
+ struct pmd_priv *priv = dev->data->dev_private;
+
+ if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+ rte_free(priv->queue_map_rx);

nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
diff --git a/drivers/net/nfb/nfb_rx.c b/drivers/net/nfb/nfb_rx.c
index 413d275853..ff630f32f4 100644
--- a/drivers/net/nfb/nfb_rx.c
+++ b/drivers/net/nfb/nfb_rx.c
@@ -61,12 +61,13 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
struct rte_mempool *mb_pool)
{
struct pmd_internals *internals = dev->process_private;
+ struct pmd_priv *priv = dev->data->dev_private;

- struct ndp_rx_queue *rxq;
int ret;
+ int qid;
+ struct ndp_rx_queue *rxq;

- rxq = rte_zmalloc_socket("ndp rx queue",
- sizeof(struct ndp_rx_queue),
+ rxq = rte_zmalloc_socket("ndp rx queue", sizeof(struct ndp_rx_queue),
RTE_CACHE_LINE_SIZE, socket_id);

if (rxq == NULL) {
@@ -77,23 +78,23 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,

rxq->flags = 0;

- ret = nfb_eth_rx_queue_init(internals->nfb,
- rx_queue_id,
- dev->data->port_id,
- mb_pool,
- rxq);
+ qid = priv->queue_map_rx[rx_queue_id];

- if (ret == 0)
- dev->data->rx_queues[rx_queue_id] = rxq;
- else
- rte_free(rxq);
+ ret = nfb_eth_rx_queue_init(internals->nfb, qid, dev->data->port_id, mb_pool, rxq);
+ if (ret)
+ goto err_queue_init;

+ dev->data->rx_queues[rx_queue_id] = rxq;
+ return 0;
+
+err_queue_init:
+ rte_free(rxq);
return ret;
}

int
nfb_eth_rx_queue_init(struct nfb_device *nfb,
- uint16_t rx_queue_id,
+ int qid,
uint16_t port_id,
struct rte_mempool *mb_pool,
struct ndp_rx_queue *rxq)
@@ -104,12 +105,11 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb,
if (nfb == NULL)
return -EINVAL;

- rxq->queue = ndp_open_rx_queue(nfb, rx_queue_id);
+ rxq->queue = ndp_open_rx_queue(nfb, qid);
if (rxq->queue == NULL)
return -EINVAL;

rxq->nfb = nfb;
- rxq->rx_queue_id = rx_queue_id;
rxq->in_port = port_id;
rxq->mb_pool = mb_pool;
rxq->buf_size = (uint16_t)(mbp_priv->mbuf_data_room_size -
diff --git a/drivers/net/nfb/nfb_rx.h b/drivers/net/nfb/nfb_rx.h
index 67b3b00e2a..831945c577 100644
--- a/drivers/net/nfb/nfb_rx.h
+++ b/drivers/net/nfb/nfb_rx.h
@@ -30,7 +30,6 @@ nfb_timestamp_dynfield(struct rte_mbuf *mbuf)
struct ndp_rx_queue {
struct nfb_device *nfb; /* nfb dev structure */
struct ndp_queue *queue; /* rx queue */
- uint16_t rx_queue_id; /* index */
uint8_t in_port; /* port */
uint8_t flags; /* setup flags */

@@ -47,8 +46,8 @@ struct ndp_rx_queue {
*
* @param nfb
* Pointer to nfb device structure.
- * @param rx_queue_id
- * RX queue index.
+ * @param qid
+ * RX queue ID.
* @param port_id
* Device [external] port identifier.
* @param mb_pool
@@ -60,7 +59,7 @@ struct ndp_rx_queue {
*/
int
nfb_eth_rx_queue_init(struct nfb_device *nfb,
- uint16_t rx_queue_id,
+ int qid,
uint16_t port_id,
struct rte_mempool *mb_pool,
struct ndp_rx_queue *rxq);
@@ -70,7 +69,7 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb,
*
* @param dev
* Pointer to Ethernet device structure.
- * @param idx
+ * @param rx_queue_id
* RX queue index.
* @param desc
* Number of descriptors to configure in queue.
diff --git a/drivers/net/nfb/nfb_tx.c b/drivers/net/nfb/nfb_tx.c
index 1f997ce22f..b5cbedeaf6 100644
--- a/drivers/net/nfb/nfb_tx.c
+++ b/drivers/net/nfb/nfb_tx.c
@@ -54,11 +54,13 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
const struct rte_eth_txconf *tx_conf __rte_unused)
{
struct pmd_internals *internals = dev->process_private;
+ struct pmd_priv *priv = dev->data->dev_private;
+
int ret;
+ int qid;
struct ndp_tx_queue *txq;

- txq = rte_zmalloc_socket("ndp tx queue",
- sizeof(struct ndp_tx_queue),
+ txq = rte_zmalloc_socket("ndp tx queue", sizeof(struct ndp_tx_queue),
RTE_CACHE_LINE_SIZE, socket_id);

if (txq == NULL) {
@@ -67,32 +69,33 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
return -ENOMEM;
}

- ret = nfb_eth_tx_queue_init(internals->nfb,
- tx_queue_id,
- txq);
+ qid = priv->queue_map_tx[tx_queue_id];

- if (ret == 0)
- dev->data->tx_queues[tx_queue_id] = txq;
- else
- rte_free(txq);
+ ret = nfb_eth_tx_queue_init(internals->nfb, qid, txq);
+ if (ret)
+ goto err_queue_init;

+ dev->data->tx_queues[tx_queue_id] = txq;
+ return 0;
+
+err_queue_init:
+ rte_free(txq);
return ret;
}

int
nfb_eth_tx_queue_init(struct nfb_device *nfb,
- uint16_t tx_queue_id,
+ int qid,
struct ndp_tx_queue *txq)
{
if (nfb == NULL)
return -EINVAL;

- txq->queue = ndp_open_tx_queue(nfb, tx_queue_id);
+ txq->queue = ndp_open_tx_queue(nfb, qid);
if (txq->queue == NULL)
return -EINVAL;

txq->nfb = nfb;
- txq->tx_queue_id = tx_queue_id;

txq->tx_pkts = 0;
txq->tx_bytes = 0;
diff --git a/drivers/net/nfb/nfb_tx.h b/drivers/net/nfb/nfb_tx.h
index f107cf914b..c253af1a86 100644
--- a/drivers/net/nfb/nfb_tx.h
+++ b/drivers/net/nfb/nfb_tx.h
@@ -17,7 +17,6 @@
struct ndp_tx_queue {
struct nfb_device *nfb; /* nfb dev structure */
struct ndp_queue *queue; /* tx queue */
- uint16_t tx_queue_id; /* index */
volatile uint64_t tx_pkts; /* packets transmitted */
volatile uint64_t tx_bytes; /* bytes transmitted */
volatile uint64_t err_pkts; /* erroneous packets */
@@ -54,8 +53,8 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
*
* @param nfb
* Pointer to nfb device structure.
- * @param tx_queue_id
- * TX queue index.
+ * @param qid
+ * TX queue ID.
* @param[out] txq
* Pointer to ndp_tx_queue output structure
*
@@ -64,7 +63,7 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
*/
int
nfb_eth_tx_queue_init(struct nfb_device *nfb,
- uint16_t tx_queue_id,
+ int qid,
struct ndp_tx_queue *txq);

/**
--
2.52.0