patch 'net/nfb: use process private variable for internal' has been queued to stable release 25.11.1
Kevin Traynor
ktraynor at redhat.com
Thu Feb 26 14:09:27 CET 2026
Hi,
FYI, your patch has been queued to stable release 25.11.1
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/02/26. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable
This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/3c54ea5071bd6eb60ade91f00e972fb32a3be343
Thanks.
Kevin
---
>From 3c54ea5071bd6eb60ade91f00e972fb32a3be343 Mon Sep 17 00:00:00 2001
From: Martin Spinler <spinler at cesnet.cz>
Date: Mon, 2 Feb 2026 17:45:03 -0800
Subject: [PATCH] net/nfb: use process private variable for internal
[ upstream commit e08f7ca34b300e0aa0c02df6cb56d9aea60b750c ]
Internal structures of libnfb can't be shared between processes.
Move these structures from dev_private to process_private, which allows
secondary process to correctly initialize and uninitialize the eth_dev.
Fixes: 6435f9a0ac22 ("net/nfb: add new netcope driver")
Signed-off-by: Martin Spinler <spinler at cesnet.cz>
---
drivers/net/nfb/nfb.h | 11 +++-
drivers/net/nfb/nfb_ethdev.c | 109 ++++++++++++++++++++---------------
drivers/net/nfb/nfb_rx.c | 2 +-
drivers/net/nfb/nfb_rxmode.c | 12 ++--
drivers/net/nfb/nfb_tx.c | 2 +-
5 files changed, 82 insertions(+), 54 deletions(-)
diff --git a/drivers/net/nfb/nfb.h b/drivers/net/nfb/nfb.h
index 917b830283..90b04c6151 100644
--- a/drivers/net/nfb/nfb.h
+++ b/drivers/net/nfb/nfb.h
@@ -42,5 +42,8 @@ extern int nfb_logtype;
#define RTE_NFB_DRIVER_NAME net_nfb
-
+/*
+ * Handles obtained from the libnfb: each process must use own instance.
+ * Stored inside dev->process_private.
+ */
struct pmd_internals {
uint16_t max_rxmac;
@@ -49,5 +52,11 @@ struct pmd_internals {
struct nc_txmac *txmac[RTE_MAX_NC_TXMAC];
struct nfb_device *nfb;
+};
+/*
+ * Common data, single instance usable in all processes.
+ * Inited in the RTE_PROC_PRIMARY, stored in dev->data->dev_private.
+ */
+struct pmd_priv {
uint16_t max_rx_queues;
uint16_t max_tx_queues;
diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c
index 5b1df83b7f..34949d6b1f 100644
--- a/drivers/net/nfb/nfb_ethdev.c
+++ b/drivers/net/nfb/nfb_ethdev.c
@@ -185,5 +185,5 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev __rte_unused)
{
int ret;
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
@@ -208,5 +208,5 @@ nfb_eth_get_max_mac_address_count(struct rte_eth_dev *dev)
uint32_t c;
uint32_t ret = (uint32_t)-1;
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
/*
@@ -238,11 +238,11 @@ nfb_eth_dev_info(struct rte_eth_dev *dev,
struct rte_eth_dev_info *dev_info)
{
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_priv *priv = dev->data->dev_private;
dev_info->max_mac_addrs = nfb_eth_get_max_mac_address_count(dev);
dev_info->max_rx_pktlen = (uint32_t)-1;
- dev_info->max_rx_queues = internals->max_rx_queues;
- dev_info->max_tx_queues = internals->max_tx_queues;
+ dev_info->max_rx_queues = priv->max_rx_queues;
+ dev_info->max_tx_queues = priv->max_tx_queues;
dev_info->speed_capa = RTE_ETH_LINK_SPEED_100G;
dev_info->rx_offload_capa =
@@ -263,5 +263,5 @@ static int
nfb_eth_dev_close(struct rte_eth_dev *dev)
{
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
uint16_t i;
uint16_t nb_rx = dev->data->nb_rx_queues;
@@ -269,4 +269,7 @@ nfb_eth_dev_close(struct rte_eth_dev *dev)
int ret;
+ nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
+ nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
+
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
@@ -274,7 +277,4 @@ nfb_eth_dev_close(struct rte_eth_dev *dev)
ret = nfb_eth_dev_stop(dev);
- nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
- nfb_nc_txmac_deinit(internals->txmac, internals->max_txmac);
-
for (i = 0; i < nb_rx; i++) {
nfb_eth_rx_queue_release(dev, i);
@@ -311,5 +311,5 @@ nfb_eth_link_update(struct rte_eth_dev *dev,
memset(&link, 0, sizeof(link));
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
status.speed = MAC_SPEED_UNKNOWN;
@@ -366,5 +366,5 @@ nfb_eth_dev_set_link_up(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
@@ -391,5 +391,5 @@ nfb_eth_dev_set_link_down(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
@@ -432,7 +432,6 @@ nfb_eth_mac_addr_set(struct rte_eth_dev *dev,
unsigned int i;
uint64_t mac;
- struct rte_eth_dev_data *data = dev->data;
struct pmd_internals *internals = (struct pmd_internals *)
- data->dev_private;
+ dev->process_private;
mac = nfb_eth_mac_addr_conv(mac_addr);
@@ -450,7 +449,6 @@ nfb_eth_mac_addr_add(struct rte_eth_dev *dev,
unsigned int i;
uint64_t mac;
- struct rte_eth_dev_data *data = dev->data;
struct pmd_internals *internals = (struct pmd_internals *)
- data->dev_private;
+ dev->process_private;
mac = nfb_eth_mac_addr_conv(mac_addr);
@@ -465,7 +463,6 @@ nfb_eth_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
{
unsigned int i;
- struct rte_eth_dev_data *data = dev->data;
struct pmd_internals *internals = (struct pmd_internals *)
- data->dev_private;
+ dev->process_private;
for (i = 0; i < internals->max_rxmac; ++i)
@@ -513,11 +510,13 @@ static int
nfb_eth_dev_init(struct rte_eth_dev *dev)
{
+ int ret;
uint32_t mac_count;
struct rte_eth_dev_data *data = dev->data;
- struct pmd_internals *internals = (struct pmd_internals *)
- data->dev_private;
+ struct pmd_internals *internals;
+ struct pmd_priv *priv = data->dev_private;
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
struct rte_pci_addr *pci_addr = &pci_dev->addr;
struct rte_ether_addr eth_addr_init;
+ uint16_t max_rx_queues, max_tx_queues;
char nfb_dev[PATH_MAX];
@@ -526,4 +525,14 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
pci_addr->function);
+ internals = rte_zmalloc_socket("nfb_internals",
+ sizeof(struct pmd_internals), RTE_CACHE_LINE_SIZE,
+ dev->device->numa_node);
+ if (internals == NULL) {
+ ret = -ENOMEM;
+ return ret;
+ }
+
+ dev->process_private = internals;
+
snprintf(nfb_dev, sizeof(nfb_dev),
"/dev/nfb/by-pci-slot/" PCI_PRI_FMT,
@@ -539,11 +548,12 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
if (internals->nfb == NULL) {
NFB_LOG(ERR, "nfb_open(): failed to open %s", nfb_dev);
+ rte_free(internals);
return -EINVAL;
}
- internals->max_rx_queues = ndp_get_rx_queue_available_count(internals->nfb);
- internals->max_tx_queues = ndp_get_tx_queue_available_count(internals->nfb);
+ max_rx_queues = ndp_get_rx_queue_available_count(internals->nfb);
+ max_tx_queues = ndp_get_tx_queue_available_count(internals->nfb);
NFB_LOG(INFO, "Available NDP queues RX: %u TX: %u",
- internals->max_rx_queues, internals->max_tx_queues);
+ max_rx_queues, max_tx_queues);
nfb_nc_rxmac_init(internals->nfb,
@@ -564,27 +574,33 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
nfb_eth_link_update(dev, 0);
- /* Allocate space for MAC addresses */
- mac_count = nfb_eth_get_max_mac_address_count(dev);
- data->mac_addrs = rte_zmalloc(data->name,
- sizeof(struct rte_ether_addr) * mac_count, RTE_CACHE_LINE_SIZE);
- if (data->mac_addrs == NULL) {
- NFB_LOG(ERR, "Could not alloc space for MAC address");
- nfb_close(internals->nfb);
- return -EINVAL;
+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+ priv->max_rx_queues = max_rx_queues;
+ priv->max_tx_queues = max_tx_queues;
+
+ /* Allocate space for MAC addresses */
+ mac_count = nfb_eth_get_max_mac_address_count(dev);
+ data->mac_addrs = rte_zmalloc(data->name,
+ sizeof(struct rte_ether_addr) * mac_count, RTE_CACHE_LINE_SIZE);
+ if (data->mac_addrs == NULL) {
+ NFB_LOG(ERR, "Could not alloc space for MAC address");
+ nfb_close(internals->nfb);
+ rte_free(internals);
+ return -EINVAL;
+ }
+
+ rte_eth_random_addr(eth_addr_init.addr_bytes);
+ eth_addr_init.addr_bytes[0] = eth_addr.addr_bytes[0];
+ eth_addr_init.addr_bytes[1] = eth_addr.addr_bytes[1];
+ eth_addr_init.addr_bytes[2] = eth_addr.addr_bytes[2];
+
+ nfb_eth_mac_addr_set(dev, ð_addr_init);
+ rte_ether_addr_copy(ð_addr_init, &data->mac_addrs[0]);
+
+ data->promiscuous = nfb_eth_promiscuous_get(dev);
+ data->all_multicast = nfb_eth_allmulticast_get(dev);
+
+ data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
}
- rte_eth_random_addr(eth_addr_init.addr_bytes);
- eth_addr_init.addr_bytes[0] = eth_addr.addr_bytes[0];
- eth_addr_init.addr_bytes[1] = eth_addr.addr_bytes[1];
- eth_addr_init.addr_bytes[2] = eth_addr.addr_bytes[2];
-
- nfb_eth_mac_addr_set(dev, ð_addr_init);
- rte_ether_addr_copy(ð_addr_init, &dev->data->mac_addrs[0]);
-
- data->promiscuous = nfb_eth_promiscuous_get(dev);
- data->all_multicast = nfb_eth_allmulticast_get(dev);
-
- dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
-
NFB_LOG(INFO, "NFB device (" PCI_PRI_FMT ") successfully initialized",
pci_addr->domain, pci_addr->bus, pci_addr->devid,
@@ -608,7 +624,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;
nfb_eth_dev_close(dev);
+ rte_free(internals);
+
NFB_LOG(INFO, "NFB device (" PCI_PRI_FMT ") successfully uninitialized",
pci_addr->domain, pci_addr->bus, pci_addr->devid,
@@ -645,5 +664,5 @@ nfb_eth_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
{
return rte_eth_dev_pci_generic_probe(pci_dev,
- sizeof(struct pmd_internals), nfb_eth_dev_init);
+ sizeof(struct pmd_priv), nfb_eth_dev_init);
}
diff --git a/drivers/net/nfb/nfb_rx.c b/drivers/net/nfb/nfb_rx.c
index 462bc3b50d..413d275853 100644
--- a/drivers/net/nfb/nfb_rx.c
+++ b/drivers/net/nfb/nfb_rx.c
@@ -61,5 +61,5 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
struct rte_mempool *mb_pool)
{
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
struct ndp_rx_queue *rxq;
diff --git a/drivers/net/nfb/nfb_rxmode.c b/drivers/net/nfb/nfb_rxmode.c
index ca6e4d5578..dc560d638b 100644
--- a/drivers/net/nfb/nfb_rxmode.c
+++ b/drivers/net/nfb/nfb_rxmode.c
@@ -12,5 +12,5 @@ nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
@@ -27,5 +27,5 @@ nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
enum nc_rxmac_mac_filter filter = RXMAC_MAC_FILTER_TABLE_BCAST;
@@ -45,5 +45,5 @@ nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
struct nc_rxmac_status status;
@@ -60,5 +60,5 @@ nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
@@ -77,5 +77,5 @@ nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
uint16_t i;
@@ -96,5 +96,5 @@ nfb_eth_allmulticast_get(struct rte_eth_dev *dev)
{
struct pmd_internals *internals = (struct pmd_internals *)
- dev->data->dev_private;
+ dev->process_private;
struct nc_rxmac_status status;
diff --git a/drivers/net/nfb/nfb_tx.c b/drivers/net/nfb/nfb_tx.c
index cf99268c43..1f997ce22f 100644
--- a/drivers/net/nfb/nfb_tx.c
+++ b/drivers/net/nfb/nfb_tx.c
@@ -54,5 +54,5 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
const struct rte_eth_txconf *tx_conf __rte_unused)
{
- struct pmd_internals *internals = dev->data->dev_private;
+ struct pmd_internals *internals = dev->process_private;
int ret;
struct ndp_tx_queue *txq;
--
2.53.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-02-26 10:16:50.441599551 +0000
+++ 0085-net-nfb-use-process-private-variable-for-internal.patch 2026-02-26 10:16:47.031459587 +0000
@@ -1 +1 @@
-From e08f7ca34b300e0aa0c02df6cb56d9aea60b750c Mon Sep 17 00:00:00 2001
+From 3c54ea5071bd6eb60ade91f00e972fb32a3be343 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit e08f7ca34b300e0aa0c02df6cb56d9aea60b750c ]
+
@@ -11 +12,0 @@
-Cc: stable at dpdk.org
@@ -49 +50 @@
-index feba06a291..7dbdde2715 100644
+index 5b1df83b7f..34949d6b1f 100644
@@ -52 +53 @@
-@@ -185,5 +185,5 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev)
+@@ -185,5 +185,5 @@ nfb_eth_dev_configure(struct rte_eth_dev *dev __rte_unused)
More information about the stable
mailing list