net/failsafe: support secondary process

Add implementation for probe in secondary.

Failsafe will attempt to attach all the sub-devices in
secondary process.

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:
Raslan Darawsheh 2019-03-18 16:05:27 +00:00 committed by Ferruh Yigit
parent 2f4b99831c
commit 4937790874

View File

@ -3,6 +3,8 @@
* Copyright 2017 Mellanox Technologies, Ltd
*/
#include <stdbool.h>
#include <rte_alarm.h>
#include <rte_malloc.h>
#include <rte_ethdev_driver.h>
@ -318,11 +320,28 @@ fs_rte_eth_free(const char *name)
return ret;
}
static bool
devargs_already_listed(struct rte_devargs *devargs)
{
struct rte_devargs *list_da;
RTE_EAL_DEVARGS_FOREACH(devargs->bus->name, list_da) {
if (strcmp(list_da->name, devargs->name) == 0)
/* devargs already in the list */
return true;
}
return false;
}
static int
rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
{
const char *name;
struct rte_eth_dev *eth_dev;
struct sub_device *sdev;
struct rte_devargs devargs;
uint8_t i;
int ret;
name = rte_vdev_device_name(vdev);
INFO("Initializing " FAILSAFE_DRIVER_NAME " for %s",
@ -335,9 +354,33 @@ rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
ERROR("Failed to probe %s", name);
return -1;
}
/* TODO: request info from primary to set up Rx and Tx */
eth_dev->dev_ops = &failsafe_ops;
eth_dev->device = &vdev->device;
eth_dev->rx_pkt_burst = (eth_rx_burst_t)&failsafe_rx_burst;
eth_dev->tx_pkt_burst = (eth_tx_burst_t)&failsafe_tx_burst;
/*
* Failsafe will attempt to probe all of its sub-devices.
* Any failure in sub-devices is not a fatal error.
* A sub-device can be plugged later.
*/
FOREACH_SUBDEV(sdev, i, eth_dev) {
/* rebuild devargs to be able to get the bus name. */
ret = rte_devargs_parse(&devargs,
sdev->devargs.name);
if (ret != 0) {
ERROR("Failed to parse devargs %s",
devargs.name);
continue;
}
if (!devargs_already_listed(&devargs)) {
ret = rte_dev_probe(devargs.name);
if (ret != 0) {
ERROR("Failed to probe devargs %s",
devargs.name);
continue;
}
}
}
rte_eth_dev_probing_finish(eth_dev);
return 0;
}