On 11.07.2018 06:08, Qi Zhang wrote:
Add driver API rte_eth_release_port_private to support the
case when an ethdev need to be detached on a secondary process.
Local state is set to unused and shared data will not be reset
so the primary process can still use it.

Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
Reviewed-by: Andrew Rybchenko <arybche...@solarflare.com>
Acked-by: Remy Horton <remy.hor...@intel.com>
---
  lib/librte_ethdev/rte_ethdev.c        | 12 ++++++++++++
  lib/librte_ethdev/rte_ethdev_driver.h | 16 +++++++++++++++-
  lib/librte_ethdev/rte_ethdev_pci.h    |  8 ++++++++
  3 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index a9977df97..52a97694c 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -359,6 +359,18 @@ rte_eth_dev_attach_secondary(const char *name)
  }
int
+rte_eth_dev_release_port_private(struct rte_eth_dev *eth_dev)
+{
+       if (eth_dev == NULL)
+               return -EINVAL;
+
+       _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_DESTROY, NULL);
+       eth_dev->state = RTE_ETH_DEV_UNUSED;
+
+       return 0;
+}
+
+int
  rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
  {
        if (eth_dev == NULL)
diff --git a/lib/librte_ethdev/rte_ethdev_driver.h 
b/lib/librte_ethdev/rte_ethdev_driver.h
index c9c825e3f..269586d88 100644
--- a/lib/librte_ethdev/rte_ethdev_driver.h
+++ b/lib/librte_ethdev/rte_ethdev_driver.h
@@ -62,7 +62,7 @@ struct rte_eth_dev *rte_eth_dev_attach_secondary(const char 
*name);
   * Release the specified ethdev port.
   *
   * @param eth_dev
- * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
+ * Device to be detached.
   * @return
   *   - 0 on success, negative on error
   */
@@ -70,6 +70,20 @@ int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
/**
   * @internal
+ * Release the specified ethdev port in the local process.
+ * Only set ethdev state to unused, but not reset shared data since
+ * it assume other processes is still using it. typically it is
+ * called by a secondary process.
+ *
+ * @param eth_dev
+ * Device to be detached.
+ * @return
+ *   - 0 on success, negative on error
+ */
+int rte_eth_dev_release_port_private(struct rte_eth_dev *eth_dev);
+
+/**
+ * @internal
   * Release device queues and clear its configuration to force the user
   * application to reconfigure it. It is for internal use only.
   *
diff --git a/lib/librte_ethdev/rte_ethdev_pci.h 
b/lib/librte_ethdev/rte_ethdev_pci.h
index 2cfd37274..a46d9e182 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -197,6 +197,14 @@ rte_eth_dev_pci_generic_remove(struct rte_pci_device 
*pci_dev,
        if (!eth_dev)
                return -ENODEV;
+ /**
+        * PCI device can only be globally detached directly by a
+        * primary process. In secondary process, we only need to
+        * release port.
+        */
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return rte_eth_dev_release_port_private(eth_dev);

I've realized that some uninit functions which will not be called anymore
in secondary processes have check for process type and handling of
secondary process case. It makes code inconsistent and should be fixed.

+
        if (dev_uninit) {
                ret = dev_uninit(eth_dev);
                if (ret)

Reply via email to