Fail-safe PMD sub devices management is based on ethdev port mechanism.
So, the sub-devices management structures are exposed to other DPDK
entities which may use them in parallel to fail-safe PMD.

Use the new port ownership mechanism to avoid multiple managments of
fail-safe PMD sub-devices.

Signed-off-by: Matan Azrad <ma...@mellanox.com>
---
 drivers/net/failsafe/failsafe.c         |  7 +++++++
 drivers/net/failsafe/failsafe_eal.c     | 10 ++++++++++
 drivers/net/failsafe/failsafe_private.h |  2 ++
 3 files changed, 19 insertions(+)

diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
index 6bc5aba..d413c20 100644
--- a/drivers/net/failsafe/failsafe.c
+++ b/drivers/net/failsafe/failsafe.c
@@ -191,6 +191,13 @@
        ret = failsafe_args_parse(dev, params);
        if (ret)
                goto free_subs;
+       ret = rte_eth_dev_owner_new(&priv->my_owner.id);
+       if (ret) {
+               ERROR("Failed to get unique owner identifier");
+               goto free_args;
+       }
+       snprintf(priv->my_owner.name, sizeof(priv->my_owner.name),
+                FAILSAFE_OWNER_NAME);
        ret = failsafe_eal_init(dev);
        if (ret)
                goto free_args;
diff --git a/drivers/net/failsafe/failsafe_eal.c 
b/drivers/net/failsafe/failsafe_eal.c
index 19d26f5..b4628fb 100644
--- a/drivers/net/failsafe/failsafe_eal.c
+++ b/drivers/net/failsafe/failsafe_eal.c
@@ -69,6 +69,16 @@
                        ERROR("sub_device %d init went wrong", i);
                        return -ENODEV;
                }
+               ret = rte_eth_dev_owner_set(j, &PRIV(dev)->my_owner);
+               if (ret) {
+                       /*
+                        * It is unexpected for a fail-safe sub-device
+                        * to be owned by another DPDK entity.
+                        */
+                       ERROR("sub_device %d owner set failed (%s)", i,
+                             strerror(ret));
+                       return ret;
+               }
                SUB_ID(sdev) = i;
                sdev->fs_dev = dev;
                sdev->dev = ETH(sdev)->device;
diff --git a/drivers/net/failsafe/failsafe_private.h 
b/drivers/net/failsafe/failsafe_private.h
index d81cc3c..9936875 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -42,6 +42,7 @@
 #include <rte_devargs.h>
 
 #define FAILSAFE_DRIVER_NAME "Fail-safe PMD"
+#define FAILSAFE_OWNER_NAME "Fail-safe"
 
 #define PMD_FAILSAFE_MAC_KVARG "mac"
 #define PMD_FAILSAFE_HOTPLUG_POLL_KVARG "hotplug_poll"
@@ -139,6 +140,7 @@ struct fs_priv {
        uint32_t mac_addr_pool[FAILSAFE_MAX_ETHADDR];
        /* current capabilities */
        struct rte_eth_dev_info infos;
+       struct rte_eth_dev_owner my_owner; /* Unique owner. */
        /*
         * Fail-safe state machine.
         * This level will be tracking state of the EAL and eth
-- 
1.8.3.1

Reply via email to