From: Martin Spinler <[email protected]>

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.

Signed-off-by: Martin Spinler <[email protected]>
---
 drivers/net/nfb/nfb.h        |  2 +
 drivers/net/nfb/nfb_ethdev.c | 99 +++++++++++++++++++++---------------
 drivers/net/nfb/nfb_rx.c     |  2 +-
 drivers/net/nfb/nfb_rxmode.c | 12 ++---
 drivers/net/nfb/nfb_tx.c     |  2 +-
 5 files changed, 67 insertions(+), 50 deletions(-)

diff --git a/drivers/net/nfb/nfb.h b/drivers/net/nfb/nfb.h
index 8f8577860a..d85c5fba62 100644
--- a/drivers/net/nfb/nfb.h
+++ b/drivers/net/nfb/nfb.h
@@ -48,7 +48,9 @@ struct pmd_internals {
        struct nc_rxmac *rxmac[RTE_MAX_NC_RXMAC];
        struct nc_txmac *txmac[RTE_MAX_NC_TXMAC];
        struct nfb_device *nfb;
+};
 
+struct pmd_priv {
        int max_rx_queues;
        int max_tx_queues;
 };
diff --git a/drivers/net/nfb/nfb_ethdev.c b/drivers/net/nfb/nfb_ethdev.c
index 7a472a5f1e..d7fa1444dd 100644
--- a/drivers/net/nfb/nfb_ethdev.c
+++ b/drivers/net/nfb/nfb_ethdev.c
@@ -145,7 +145,7 @@ nfb_eth_dev_start(struct rte_eth_dev *dev)
        return ret;
 }
 
-/**
+/* *
  * DPDK callback to stop the device.
  *
  * Stop device by stopping all configured queues.
@@ -184,7 +184,7 @@ static int
 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;
 
        if (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) {
@@ -207,7 +207,7 @@ nfb_eth_get_max_mac_address_count(struct rte_eth_dev *dev)
        uint16_t i;
        uint32_t c;
        uint32_t ret = (uint32_t)-1;
-       struct pmd_internals *internals = dev->data->dev_private;
+       struct pmd_internals *internals = dev->process_private;
 
        /*
         * Go through all RX MAC components in firmware and find
@@ -237,13 +237,13 @@ static int
 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 =
                RTE_ETH_RX_OFFLOAD_TIMESTAMP;
@@ -262,20 +262,20 @@ nfb_eth_dev_info(struct rte_eth_dev *dev,
 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;
        uint16_t nb_tx = dev->data->nb_tx_queues;
        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;
 
        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);
                dev->data->rx_queues[i] = NULL;
@@ -310,7 +310,7 @@ nfb_eth_link_update(struct rte_eth_dev *dev,
        struct rte_eth_link link;
        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;
 
@@ -365,7 +365,7 @@ static int
 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;
        for (i = 0; i < internals->max_rxmac; ++i)
@@ -390,7 +390,7 @@ static int
 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;
        for (i = 0; i < internals->max_rxmac; ++i)
@@ -431,9 +431,8 @@ 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);
        /* Until no real multi-port support, configure all RX MACs the same */
@@ -449,9 +448,8 @@ 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);
        for (i = 0; i < internals->max_rxmac; ++i)
@@ -464,9 +462,8 @@ static void
 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)
                nc_rxmac_set_mac(internals->rxmac[i], index, 0, 0);
@@ -512,10 +509,11 @@ static const struct eth_dev_ops ops = {
 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;
@@ -525,6 +523,16 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
                pci_addr->domain, pci_addr->bus, pci_addr->devid,
                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,
                pci_addr->domain, pci_addr->bus, pci_addr->devid,
@@ -538,10 +546,11 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
        internals->nfb = nfb_open(nfb_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);
+       priv->max_rx_queues = ndp_get_rx_queue_available_count(internals->nfb);
+       priv->max_tx_queues = ndp_get_tx_queue_available_count(internals->nfb);
 
        NFB_LOG(INFO, "Available NDP queues RX: %u TX: %u",
                data->nb_rx_queues, data->nb_tx_queues);
@@ -563,28 +572,31 @@ nfb_eth_dev_init(struct rte_eth_dev *dev)
        /* Get link state */
        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) {
+               /* 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];
+               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, &eth_addr_init);
-       rte_ether_addr_copy(&eth_addr_init, &dev->data->mac_addrs[0]);
+               nfb_eth_mac_addr_set(dev, &eth_addr_init);
+               rte_ether_addr_copy(&eth_addr_init, &data->mac_addrs[0]);
 
-       data->promiscuous = nfb_eth_promiscuous_get(dev);
-       data->all_multicast = nfb_eth_allmulticast_get(dev);
+               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;
+               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,
@@ -607,9 +619,12 @@ 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,
                pci_addr->function);
@@ -644,7 +659,7 @@ nfb_eth_pci_probe(struct rte_pci_driver *pci_drv 
__rte_unused,
                struct rte_pci_device *pci_dev)
 {
        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
@@ -60,7 +60,7 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev,
                const struct rte_eth_rxconf *rx_conf __rte_unused,
                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;
        int ret;
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
@@ -11,7 +11,7 @@ int
 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;
 
        for (i = 0; i < internals->max_rxmac; ++i) {
@@ -26,7 +26,7 @@ int
 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;
 
@@ -44,7 +44,7 @@ int
 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;
        status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
@@ -59,7 +59,7 @@ int
 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;
        if (dev->data->promiscuous)
@@ -76,7 +76,7 @@ int
 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;
 
@@ -95,7 +95,7 @@ int
 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;
        status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
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
@@ -53,7 +53,7 @@ nfb_eth_tx_queue_setup(struct rte_eth_dev *dev,
        unsigned int socket_id,
        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.52.0

Reply via email to