net/failsafe: replace local device with shared data
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> Acked-by: Gaetan Rivet <gaetan.rivet@6wind.com>
This commit is contained in:
parent
e3bcaf3a0f
commit
0864701245
@ -181,7 +181,7 @@ fs_eth_dev_create(struct rte_vdev_device *vdev)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
priv = PRIV(dev);
|
priv = PRIV(dev);
|
||||||
priv->dev = dev;
|
priv->data = dev->data;
|
||||||
dev->dev_ops = &failsafe_ops;
|
dev->dev_ops = &failsafe_ops;
|
||||||
dev->data->mac_addrs = &PRIV(dev)->mac_addrs[0];
|
dev->data->mac_addrs = &PRIV(dev)->mac_addrs[0];
|
||||||
dev->data->dev_link = eth_link;
|
dev->data->dev_link = eth_link;
|
||||||
|
@ -133,8 +133,8 @@ fs_rx_event_proxy_service_install(struct fs_priv *priv)
|
|||||||
/* prepare service info */
|
/* prepare service info */
|
||||||
memset(&service, 0, sizeof(struct rte_service_spec));
|
memset(&service, 0, sizeof(struct rte_service_spec));
|
||||||
snprintf(service.name, sizeof(service.name), "%s_Rx_service",
|
snprintf(service.name, sizeof(service.name), "%s_Rx_service",
|
||||||
priv->dev->data->name);
|
priv->data->name);
|
||||||
service.socket_id = priv->dev->data->numa_node;
|
service.socket_id = priv->data->numa_node;
|
||||||
service.callback = fs_rx_event_proxy_routine;
|
service.callback = fs_rx_event_proxy_routine;
|
||||||
service.callback_userdata = priv;
|
service.callback_userdata = priv;
|
||||||
|
|
||||||
@ -437,7 +437,7 @@ fs_rx_intr_vec_install(struct fs_priv *priv)
|
|||||||
unsigned int count;
|
unsigned int count;
|
||||||
struct rte_intr_handle *intr_handle;
|
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);
|
n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID);
|
||||||
count = 0;
|
count = 0;
|
||||||
intr_handle = &priv->intr_handle;
|
intr_handle = &priv->intr_handle;
|
||||||
@ -452,7 +452,7 @@ fs_rx_intr_vec_install(struct fs_priv *priv)
|
|||||||
return -rte_errno;
|
return -rte_errno;
|
||||||
}
|
}
|
||||||
for (i = 0; i < n; i++) {
|
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. */
|
/* Skip queues that cannot request interrupts. */
|
||||||
if (rxq == NULL || rxq->event_fd < 0) {
|
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);
|
struct fs_priv *priv = PRIV(dev);
|
||||||
const struct rte_intr_conf *const intr_conf =
|
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)
|
if (intr_conf->rxq == 0 || dev->intr_handle != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -452,7 +452,7 @@ fs_rx_queue_release(void *queue)
|
|||||||
if (queue == NULL)
|
if (queue == NULL)
|
||||||
return;
|
return;
|
||||||
rxq = queue;
|
rxq = queue;
|
||||||
dev = rxq->priv->dev;
|
dev = &rte_eth_devices[rxq->priv->data->port_id];
|
||||||
fs_lock(dev, 0);
|
fs_lock(dev, 0);
|
||||||
if (rxq->event_fd > 0)
|
if (rxq->event_fd > 0)
|
||||||
close(rxq->event_fd);
|
close(rxq->event_fd);
|
||||||
@ -636,7 +636,7 @@ fs_tx_queue_release(void *queue)
|
|||||||
if (queue == NULL)
|
if (queue == NULL)
|
||||||
return;
|
return;
|
||||||
txq = queue;
|
txq = queue;
|
||||||
dev = txq->priv->dev;
|
dev = &rte_eth_devices[txq->priv->data->port_id];
|
||||||
fs_lock(dev, 0);
|
fs_lock(dev, 0);
|
||||||
FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
|
FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) {
|
||||||
if (ETH(sdev)->data->tx_queues != NULL &&
|
if (ETH(sdev)->data->tx_queues != NULL &&
|
||||||
|
@ -128,8 +128,12 @@ struct sub_device {
|
|||||||
unsigned int lsc_callback:1;
|
unsigned int lsc_callback:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is referenced by eth_dev->data->dev_private
|
||||||
|
* This is shared between processes.
|
||||||
|
*/
|
||||||
struct fs_priv {
|
struct fs_priv {
|
||||||
struct rte_eth_dev *dev;
|
struct rte_eth_dev_data *data; /* backreference to shared data. */
|
||||||
/*
|
/*
|
||||||
* Set of sub_devices.
|
* Set of sub_devices.
|
||||||
* subs[0] is the preferred device
|
* subs[0] is the preferred device
|
||||||
|
@ -126,7 +126,7 @@ failsafe_tx_burst(void *queue,
|
|||||||
uint16_t nb_tx;
|
uint16_t nb_tx;
|
||||||
|
|
||||||
txq = queue;
|
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)))
|
if (unlikely(fs_tx_unsafe(sdev)))
|
||||||
return 0;
|
return 0;
|
||||||
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
|
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
|
||||||
@ -147,7 +147,7 @@ failsafe_tx_burst_fast(void *queue,
|
|||||||
uint16_t nb_tx;
|
uint16_t nb_tx;
|
||||||
|
|
||||||
txq = queue;
|
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));
|
RTE_ASSERT(!fs_tx_unsafe(sdev));
|
||||||
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
|
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
|
||||||
FS_ATOMIC_P(txq->refcnt[sdev->sid]);
|
FS_ATOMIC_P(txq->refcnt[sdev->sid]);
|
||||||
|
Loading…
Reference in New Issue
Block a user