In multiprocess context, the private structure is shared between
processes. The back reference from private to generic data was using
a pointer to a per process eth_dev. It's now changed to a reference of
the shared data.

Signed-off-by: Raslan Darawsheh <rasl...@mellanox.com>
Signed-off-by: Thomas Monjalon <tho...@monjalon.net>
---
 drivers/net/failsafe/failsafe.c         |  2 +-
 drivers/net/failsafe/failsafe_intr.c    | 10 +++++-----
 drivers/net/failsafe/failsafe_ops.c     |  4 ++--
 drivers/net/failsafe/failsafe_private.h |  6 +++++-
 drivers/net/failsafe/failsafe_rxtx.c    |  4 ++--
 5 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
index 06e859e..68926ca 100644
--- a/drivers/net/failsafe/failsafe.c
+++ b/drivers/net/failsafe/failsafe.c
@@ -181,7 +181,7 @@ fs_eth_dev_create(struct rte_vdev_device *vdev)
                return -1;
        }
        priv = PRIV(dev);
-       priv->dev = dev;
+       priv->data = dev->data;
        dev->dev_ops = &failsafe_ops;
        dev->data->mac_addrs = &PRIV(dev)->mac_addrs[0];
        dev->data->dev_link = eth_link;
diff --git a/drivers/net/failsafe/failsafe_intr.c 
b/drivers/net/failsafe/failsafe_intr.c
index 1c2cb71..09aa3c6 100644
--- a/drivers/net/failsafe/failsafe_intr.c
+++ b/drivers/net/failsafe/failsafe_intr.c
@@ -133,8 +133,8 @@ fs_rx_event_proxy_service_install(struct fs_priv *priv)
        /* prepare service info */
        memset(&service, 0, sizeof(struct rte_service_spec));
        snprintf(service.name, sizeof(service.name), "%s_Rx_service",
-                priv->dev->data->name);
-       service.socket_id = priv->dev->data->numa_node;
+                priv->data->name);
+       service.socket_id = priv->data->numa_node;
        service.callback = fs_rx_event_proxy_routine;
        service.callback_userdata = priv;
 
@@ -437,7 +437,7 @@ fs_rx_intr_vec_install(struct fs_priv *priv)
        unsigned int count;
        struct rte_intr_handle *intr_handle;
 
-       rxqs_n = priv->dev->data->nb_rx_queues;
+       rxqs_n = priv->data->nb_rx_queues;
        n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID);
        count = 0;
        intr_handle = &priv->intr_handle;
@@ -452,7 +452,7 @@ fs_rx_intr_vec_install(struct fs_priv *priv)
                return -rte_errno;
        }
        for (i = 0; i < n; i++) {
-               struct rxq *rxq = priv->dev->data->rx_queues[i];
+               struct rxq *rxq = priv->data->rx_queues[i];
 
                /* Skip queues that cannot request interrupts. */
                if (rxq == NULL || rxq->event_fd < 0) {
@@ -521,7 +521,7 @@ failsafe_rx_intr_install(struct rte_eth_dev *dev)
 {
        struct fs_priv *priv = PRIV(dev);
        const struct rte_intr_conf *const intr_conf =
-                       &priv->dev->data->dev_conf.intr_conf;
+                       &priv->data->dev_conf.intr_conf;
 
        if (intr_conf->rxq == 0 || dev->intr_handle != NULL)
                return 0;
diff --git a/drivers/net/failsafe/failsafe_ops.c 
b/drivers/net/failsafe/failsafe_ops.c
index e3add40..65957a2 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -452,7 +452,7 @@ fs_rx_queue_release(void *queue)
        if (queue == NULL)
                return;
        rxq = queue;
-       dev = rxq->priv->dev;
+       dev = &rte_eth_devices[rxq->priv->data->port_id];
        fs_lock(dev, 0);
        if (rxq->event_fd > 0)
                close(rxq->event_fd);
@@ -636,7 +636,7 @@ fs_tx_queue_release(void *queue)
        if (queue == NULL)
                return;
        txq = queue;
-       dev = txq->priv->dev;
+       dev = &rte_eth_devices[txq->priv->data->port_id];
        fs_lock(dev, 0);
        FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
                if (ETH(sdev)->data->tx_queues != NULL &&
diff --git a/drivers/net/failsafe/failsafe_private.h 
b/drivers/net/failsafe/failsafe_private.h
index 0dfea65..29dfd40 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -128,8 +128,12 @@ struct sub_device {
        unsigned int lsc_callback:1;
 };
 
+/*
+ * This is referenced by eth_dev->data->dev_private
+ * This is shared between processes.
+ */
 struct fs_priv {
-       struct rte_eth_dev *dev;
+       struct rte_eth_dev_data *data; /* backreference to shared data. */
        /*
         * Set of sub_devices.
         * subs[0] is the preferred device
diff --git a/drivers/net/failsafe/failsafe_rxtx.c 
b/drivers/net/failsafe/failsafe_rxtx.c
index 034f47b..231c832 100644
--- a/drivers/net/failsafe/failsafe_rxtx.c
+++ b/drivers/net/failsafe/failsafe_rxtx.c
@@ -126,7 +126,7 @@ failsafe_tx_burst(void *queue,
        uint16_t nb_tx;
 
        txq = queue;
-       sdev = TX_SUBDEV(txq->priv->dev);
+       sdev = TX_SUBDEV(&rte_eth_devices[txq->priv->data->port_id]);
        if (unlikely(fs_tx_unsafe(sdev)))
                return 0;
        sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
@@ -147,7 +147,7 @@ failsafe_tx_burst_fast(void *queue,
        uint16_t nb_tx;
 
        txq = queue;
-       sdev = TX_SUBDEV(txq->priv->dev);
+       sdev = TX_SUBDEV(&rte_eth_devices[txq->priv->data->port_id]);
        RTE_ASSERT(!fs_tx_unsafe(sdev));
        sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
        FS_ATOMIC_P(txq->refcnt[sdev->sid]);
-- 
2.7.4

Reply via email to