[v3,1/4] net/failsafe: replace local device with shared data
Checks
Commit Message
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 <rasland@mellanox.com>
Signed-off-by: Thomas Monjalon <thomas@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(-)
@@ -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;
@@ -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;
@@ -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 &&
@@ -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
@@ -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]);