net/mlx5: refactor multi-process communication
authorOphir Munk <ophirmu@mellanox.com>
Sun, 19 Jul 2020 10:18:15 +0000 (10:18 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Jul 2020 13:46:30 +0000 (15:46 +0200)
1. The shared data communication between the primary and the secondary
processes is implemented using Linux API. Move the Linux API code under
linux directory (file linux/mlx5_os.c).

2. File net/mlx5/mlx5_mp.c handles requests to the primary and secondary
processes (e.g. start_rxtx, stop_rxtx). It is Linux based so it is moved
under linux (new file linux/mlx5_mp_os.c).

Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
drivers/net/mlx5/Makefile
drivers/net/mlx5/linux/meson.build
drivers/net/mlx5/linux/mlx5_mp_os.c [new file with mode: 0644]
drivers/net/mlx5/linux/mlx5_os.c
drivers/net/mlx5/meson.build
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_mp.c [deleted file]
drivers/net/mlx5/mlx5_trigger.c

index 9eaac6b..253faf9 100644 (file)
@@ -30,12 +30,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_meter.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_dv.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_verbs.c
-SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_mp.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_utils.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_socket.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_os.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_ethdev_os.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_verbs.c
+SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_mp_os.c
 
 # Basic CFLAGS.
 CFLAGS += -O3
index 14eed03..2def8e3 100644 (file)
@@ -7,5 +7,6 @@ sources += files(
        'mlx5_os.c',
        'mlx5_ethdev_os.c',
        'mlx5_verbs.c',
+       'mlx5_mp_os.c',
 )
 
diff --git a/drivers/net/mlx5/linux/mlx5_mp_os.c b/drivers/net/mlx5/linux/mlx5_mp_os.c
new file mode 100644 (file)
index 0000000..dd9a2c2
--- /dev/null
@@ -0,0 +1,212 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019 6WIND S.A.
+ * Copyright 2019 Mellanox Technologies, Ltd
+ */
+
+#include <stdio.h>
+#include <time.h>
+
+#include <rte_eal.h>
+#include <rte_ethdev_driver.h>
+#include <rte_string_fns.h>
+
+#include <mlx5_common_mp.h>
+#include <mlx5_common_mr.h>
+#include <mlx5_malloc.h>
+
+#include "mlx5.h"
+#include "mlx5_rxtx.h"
+#include "mlx5_utils.h"
+
+int
+mlx5_mp_os_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+       struct rte_mp_msg mp_res;
+       struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
+       const struct mlx5_mp_param *param =
+               (const struct mlx5_mp_param *)mp_msg->param;
+       struct rte_eth_dev *dev;
+       struct mlx5_priv *priv;
+       struct mr_cache_entry entry;
+       uint32_t lkey;
+       int ret;
+
+       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
+       if (!rte_eth_dev_is_valid_port(param->port_id)) {
+               rte_errno = ENODEV;
+               DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
+               return -rte_errno;
+       }
+       dev = &rte_eth_devices[param->port_id];
+       priv = dev->data->dev_private;
+       switch (param->type) {
+       case MLX5_MP_REQ_CREATE_MR:
+               mp_init_msg(&priv->mp_id, &mp_res, param->type);
+               lkey = mlx5_mr_create_primary(priv->sh->pd,
+                                             &priv->sh->share_cache,
+                                             &entry, param->args.addr,
+                                             priv->config.mr_ext_memseg_en);
+               if (lkey == UINT32_MAX)
+                       res->result = -rte_errno;
+               ret = rte_mp_reply(&mp_res, peer);
+               break;
+       case MLX5_MP_REQ_VERBS_CMD_FD:
+               mp_init_msg(&priv->mp_id, &mp_res, param->type);
+               mp_res.num_fds = 1;
+               mp_res.fds[0] = ((struct ibv_context *)priv->sh->ctx)->cmd_fd;
+               res->result = 0;
+               ret = rte_mp_reply(&mp_res, peer);
+               break;
+       case MLX5_MP_REQ_QUEUE_STATE_MODIFY:
+               mp_init_msg(&priv->mp_id, &mp_res, param->type);
+               res->result = mlx5_queue_state_modify_primary
+                                       (dev, &param->args.state_modify);
+               ret = rte_mp_reply(&mp_res, peer);
+               break;
+       default:
+               rte_errno = EINVAL;
+               DRV_LOG(ERR, "port %u invalid mp request type",
+                       dev->data->port_id);
+               return -rte_errno;
+       }
+       return ret;
+}
+
+/**
+ * IPC message handler of a secondary process.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ * @param[in] peer
+ *   Pointer to the peer socket path.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_mp_os_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+       struct rte_mp_msg mp_res;
+       struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
+       const struct mlx5_mp_param *param =
+               (const struct mlx5_mp_param *)mp_msg->param;
+       struct rte_eth_dev *dev;
+       struct mlx5_priv *priv;
+       int ret;
+
+       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
+       if (!rte_eth_dev_is_valid_port(param->port_id)) {
+               rte_errno = ENODEV;
+               DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
+               return -rte_errno;
+       }
+       dev = &rte_eth_devices[param->port_id];
+       priv = dev->data->dev_private;
+       switch (param->type) {
+       case MLX5_MP_REQ_START_RXTX:
+               DRV_LOG(INFO, "port %u starting datapath", dev->data->port_id);
+               rte_mb();
+               dev->rx_pkt_burst = mlx5_select_rx_function(dev);
+               dev->tx_pkt_burst = mlx5_select_tx_function(dev);
+               mp_init_msg(&priv->mp_id, &mp_res, param->type);
+               res->result = 0;
+               ret = rte_mp_reply(&mp_res, peer);
+               break;
+       case MLX5_MP_REQ_STOP_RXTX:
+               DRV_LOG(INFO, "port %u stopping datapath", dev->data->port_id);
+               dev->rx_pkt_burst = removed_rx_burst;
+               dev->tx_pkt_burst = removed_tx_burst;
+               rte_mb();
+               mp_init_msg(&priv->mp_id, &mp_res, param->type);
+               res->result = 0;
+               ret = rte_mp_reply(&mp_res, peer);
+               break;
+       default:
+               rte_errno = EINVAL;
+               DRV_LOG(ERR, "port %u invalid mp request type",
+                       dev->data->port_id);
+               return -rte_errno;
+       }
+       return ret;
+}
+
+/**
+ * Broadcast request of stopping/starting data-path to secondary processes.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ * @param[in] type
+ *   Request type.
+ */
+static void
+mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
+{
+       struct rte_mp_msg mp_req;
+       struct rte_mp_msg *mp_res;
+       struct rte_mp_reply mp_rep;
+       struct mlx5_mp_param *res;
+       struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
+       struct mlx5_priv *priv = dev->data->dev_private;
+       int ret;
+       int i;
+
+       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
+       if (!mlx5_shared_data->secondary_cnt)
+               return;
+       if (type != MLX5_MP_REQ_START_RXTX && type != MLX5_MP_REQ_STOP_RXTX) {
+               DRV_LOG(ERR, "port %u unknown request (req_type %d)",
+                       dev->data->port_id, type);
+               return;
+       }
+       mp_init_msg(&priv->mp_id, &mp_req, type);
+       ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
+       if (ret) {
+               if (rte_errno != ENOTSUP)
+                       DRV_LOG(ERR, "port %u failed to request stop/start Rx/Tx (%d)",
+                               dev->data->port_id, type);
+               goto exit;
+       }
+       if (mp_rep.nb_sent != mp_rep.nb_received) {
+               DRV_LOG(ERR,
+                       "port %u not all secondaries responded (req_type %d)",
+                       dev->data->port_id, type);
+               goto exit;
+       }
+       for (i = 0; i < mp_rep.nb_received; i++) {
+               mp_res = &mp_rep.msgs[i];
+               res = (struct mlx5_mp_param *)mp_res->param;
+               if (res->result) {
+                       DRV_LOG(ERR, "port %u request failed on secondary #%d",
+                               dev->data->port_id, i);
+                       goto exit;
+               }
+       }
+exit:
+       mlx5_free(mp_rep.msgs);
+}
+
+/**
+ * Broadcast request of starting data-path to secondary processes. The request
+ * is synchronous.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ */
+void
+mlx5_mp_os_req_start_rxtx(struct rte_eth_dev *dev)
+{
+       mp_req_on_rxtx(dev, MLX5_MP_REQ_START_RXTX);
+}
+
+/**
+ * Broadcast request of stopping data-path to secondary processes. The request
+ * is synchronous.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ */
+void
+mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev *dev)
+{
+       mp_req_on_rxtx(dev, MLX5_MP_REQ_STOP_RXTX);
+}
index 266913d..b875ba5 100644 (file)
 #define MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP (1 << 4)
 #endif
 
+static const char *MZ_MLX5_PMD_SHARED_DATA = "mlx5_pmd_shared_data";
+
+/* Spinlock for mlx5_shared_data allocation. */
+static rte_spinlock_t mlx5_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
+
+/* Process local data for secondary processes. */
+static struct mlx5_local_data mlx5_local_data;
+
 /**
  * Get mlx5 device attributes. The glue function query_device_ex() is called
  * with out parameter of type 'struct ibv_device_attr_ex *'. Then fill in mlx5
@@ -356,6 +364,109 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv)
        mlx5_free_table_hash_list(priv);
 }
 
+/**
+ * Initialize shared data between primary and secondary process.
+ *
+ * A memzone is reserved by primary process and secondary processes attach to
+ * the memzone.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx5_init_shared_data(void)
+{
+       const struct rte_memzone *mz;
+       int ret = 0;
+
+       rte_spinlock_lock(&mlx5_shared_data_lock);
+       if (mlx5_shared_data == NULL) {
+               if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+                       /* Allocate shared memory. */
+                       mz = rte_memzone_reserve(MZ_MLX5_PMD_SHARED_DATA,
+                                                sizeof(*mlx5_shared_data),
+                                                SOCKET_ID_ANY, 0);
+                       if (mz == NULL) {
+                               DRV_LOG(ERR,
+                                       "Cannot allocate mlx5 shared data");
+                               ret = -rte_errno;
+                               goto error;
+                       }
+                       mlx5_shared_data = mz->addr;
+                       memset(mlx5_shared_data, 0, sizeof(*mlx5_shared_data));
+                       rte_spinlock_init(&mlx5_shared_data->lock);
+               } else {
+                       /* Lookup allocated shared memory. */
+                       mz = rte_memzone_lookup(MZ_MLX5_PMD_SHARED_DATA);
+                       if (mz == NULL) {
+                               DRV_LOG(ERR,
+                                       "Cannot attach mlx5 shared data");
+                               ret = -rte_errno;
+                               goto error;
+                       }
+                       mlx5_shared_data = mz->addr;
+                       memset(&mlx5_local_data, 0, sizeof(mlx5_local_data));
+               }
+       }
+error:
+       rte_spinlock_unlock(&mlx5_shared_data_lock);
+       return ret;
+}
+
+/**
+ * PMD global initialization.
+ *
+ * Independent from individual device, this function initializes global
+ * per-PMD data structures distinguishing primary and secondary processes.
+ * Hence, each initialization is called once per a process.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx5_init_once(void)
+{
+       struct mlx5_shared_data *sd;
+       struct mlx5_local_data *ld = &mlx5_local_data;
+       int ret = 0;
+
+       if (mlx5_init_shared_data())
+               return -rte_errno;
+       sd = mlx5_shared_data;
+       MLX5_ASSERT(sd);
+       rte_spinlock_lock(&sd->lock);
+       switch (rte_eal_process_type()) {
+       case RTE_PROC_PRIMARY:
+               if (sd->init_done)
+                       break;
+               LIST_INIT(&sd->mem_event_cb_list);
+               rte_rwlock_init(&sd->mem_event_rwlock);
+               rte_mem_event_callback_register("MLX5_MEM_EVENT_CB",
+                                               mlx5_mr_mem_event_cb, NULL);
+               ret = mlx5_mp_init_primary(MLX5_MP_NAME,
+                                          mlx5_mp_os_primary_handle);
+               if (ret)
+                       goto out;
+               sd->init_done = true;
+               break;
+       case RTE_PROC_SECONDARY:
+               if (ld->init_done)
+                       break;
+               ret = mlx5_mp_init_secondary(MLX5_MP_NAME,
+                                            mlx5_mp_os_secondary_handle);
+               if (ret)
+                       goto out;
+               ++sd->secondary_cnt;
+               ld->init_done = true;
+               break;
+       default:
+               break;
+       }
+out:
+       rte_spinlock_unlock(&sd->lock);
+       return ret;
+}
+
 /**
  * Spawn an Ethernet device from Verbs information.
  *
index c06b153..23462d1 100644 (file)
@@ -22,7 +22,6 @@ sources = files(
        'mlx5_rxmode.c',
        'mlx5_rxq.c',
        'mlx5_rxtx.c',
-       'mlx5_mp.c',
        'mlx5_stats.c',
        'mlx5_trigger.c',
        'mlx5_txq.c',
index 3af7c1c..6dd211e 100644 (file)
 /* Decap will be used or not. */
 #define MLX5_DECAP_EN "decap_en"
 
-static const char *MZ_MLX5_PMD_SHARED_DATA = "mlx5_pmd_shared_data";
-
 /* Shared memory between primary and secondary processes. */
 struct mlx5_shared_data *mlx5_shared_data;
 
-/* Spinlock for mlx5_shared_data allocation. */
-static rte_spinlock_t mlx5_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* Process local data for secondary processes. */
-static struct mlx5_local_data mlx5_local_data;
+/** Driver-specific log messages type. */
+int mlx5_logtype;
 
 static LIST_HEAD(, mlx5_dev_ctx_shared) mlx5_dev_ctx_list =
                                                LIST_HEAD_INITIALIZER();
@@ -1116,55 +1111,6 @@ error:
        return err;
 }
 
-/**
- * Initialize shared data between primary and secondary process.
- *
- * A memzone is reserved by primary process and secondary processes attach to
- * the memzone.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx5_init_shared_data(void)
-{
-       const struct rte_memzone *mz;
-       int ret = 0;
-
-       rte_spinlock_lock(&mlx5_shared_data_lock);
-       if (mlx5_shared_data == NULL) {
-               if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-                       /* Allocate shared memory. */
-                       mz = rte_memzone_reserve(MZ_MLX5_PMD_SHARED_DATA,
-                                                sizeof(*mlx5_shared_data),
-                                                SOCKET_ID_ANY, 0);
-                       if (mz == NULL) {
-                               DRV_LOG(ERR,
-                                       "Cannot allocate mlx5 shared data");
-                               ret = -rte_errno;
-                               goto error;
-                       }
-                       mlx5_shared_data = mz->addr;
-                       memset(mlx5_shared_data, 0, sizeof(*mlx5_shared_data));
-                       rte_spinlock_init(&mlx5_shared_data->lock);
-               } else {
-                       /* Lookup allocated shared memory. */
-                       mz = rte_memzone_lookup(MZ_MLX5_PMD_SHARED_DATA);
-                       if (mz == NULL) {
-                               DRV_LOG(ERR,
-                                       "Cannot attach mlx5 shared data");
-                               ret = -rte_errno;
-                               goto error;
-                       }
-                       mlx5_shared_data = mz->addr;
-                       memset(&mlx5_local_data, 0, sizeof(mlx5_local_data));
-               }
-       }
-error:
-       rte_spinlock_unlock(&mlx5_shared_data_lock);
-       return ret;
-}
-
 /**
  * Retrieve integer value from environment variable.
  *
@@ -1306,7 +1252,7 @@ mlx5_dev_close(struct rte_eth_dev *dev)
        dev->tx_pkt_burst = removed_tx_burst;
        rte_wmb();
        /* Disable datapath on secondary process. */
-       mlx5_mp_req_stop_rxtx(dev);
+       mlx5_mp_os_req_stop_rxtx(dev);
        /* Free the eCPRI flex parser resource. */
        mlx5_flex_parser_ecpri_release(dev);
        if (priv->rxqs != NULL) {
@@ -1638,60 +1584,6 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
        return 0;
 }
 
-/**
- * PMD global initialization.
- *
- * Independent from individual device, this function initializes global
- * per-PMD data structures distinguishing primary and secondary processes.
- * Hence, each initialization is called once per a process.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-mlx5_init_once(void)
-{
-       struct mlx5_shared_data *sd;
-       struct mlx5_local_data *ld = &mlx5_local_data;
-       int ret = 0;
-
-       if (mlx5_init_shared_data())
-               return -rte_errno;
-       sd = mlx5_shared_data;
-       MLX5_ASSERT(sd);
-       rte_spinlock_lock(&sd->lock);
-       switch (rte_eal_process_type()) {
-       case RTE_PROC_PRIMARY:
-               if (sd->init_done)
-                       break;
-               LIST_INIT(&sd->mem_event_cb_list);
-               rte_rwlock_init(&sd->mem_event_rwlock);
-               rte_mem_event_callback_register("MLX5_MEM_EVENT_CB",
-                                               mlx5_mr_mem_event_cb, NULL);
-               ret = mlx5_mp_init_primary(MLX5_MP_NAME,
-                                          mlx5_mp_primary_handle);
-               if (ret)
-                       goto out;
-               sd->init_done = true;
-               break;
-       case RTE_PROC_SECONDARY:
-               if (ld->init_done)
-                       break;
-               ret = mlx5_mp_init_secondary(MLX5_MP_NAME,
-                                            mlx5_mp_secondary_handle);
-               if (ret)
-                       goto out;
-               ++sd->secondary_cnt;
-               ld->init_done = true;
-               break;
-       default:
-               break;
-       }
-out:
-       rte_spinlock_unlock(&sd->lock);
-       return ret;
-}
-
 /**
  * Configures the minimal amount of data to inline into WQE
  * while sending packets.
index 8086158..c3269e7 100644 (file)
@@ -794,7 +794,6 @@ void mlx5_set_min_inline(struct mlx5_dev_spawn_data *spawn,
 void mlx5_set_metadata_mask(struct rte_eth_dev *dev);
 int mlx5_dev_check_sibling_config(struct mlx5_priv *priv,
                                  struct mlx5_dev_config *config);
-int mlx5_init_once(void);
 int mlx5_dev_configure(struct rte_eth_dev *dev);
 int mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info);
 int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);
@@ -979,11 +978,13 @@ void mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev);
 int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts,
                        uint32_t nb_contexts, struct rte_flow_error *error);
 
-/* mlx5_mp.c */
-int mlx5_mp_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer);
-int mlx5_mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer);
-void mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev);
-void mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev);
+/* mlx5_mp_os.c */
+int mlx5_mp_os_primary_handle(const struct rte_mp_msg *mp_msg,
+                             const void *peer);
+int mlx5_mp_os_secondary_handle(const struct rte_mp_msg *mp_msg,
+                               const void *peer);
+void mlx5_mp_os_req_start_rxtx(struct rte_eth_dev *dev);
+void mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev *dev);
 
 /* mlx5_socket.c */
 
diff --git a/drivers/net/mlx5/mlx5_mp.c b/drivers/net/mlx5/mlx5_mp.c
deleted file mode 100644 (file)
index cf6e33b..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2019 6WIND S.A.
- * Copyright 2019 Mellanox Technologies, Ltd
- */
-
-#include <stdio.h>
-#include <time.h>
-
-#include <rte_eal.h>
-#include <rte_ethdev_driver.h>
-#include <rte_string_fns.h>
-
-#include <mlx5_common_mp.h>
-#include <mlx5_common_mr.h>
-#include <mlx5_malloc.h>
-
-#include "mlx5.h"
-#include "mlx5_rxtx.h"
-#include "mlx5_utils.h"
-
-int
-mlx5_mp_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
-{
-       struct rte_mp_msg mp_res;
-       struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
-       const struct mlx5_mp_param *param =
-               (const struct mlx5_mp_param *)mp_msg->param;
-       struct rte_eth_dev *dev;
-       struct mlx5_priv *priv;
-       struct mr_cache_entry entry;
-       uint32_t lkey;
-       int ret;
-
-       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
-       if (!rte_eth_dev_is_valid_port(param->port_id)) {
-               rte_errno = ENODEV;
-               DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
-               return -rte_errno;
-       }
-       dev = &rte_eth_devices[param->port_id];
-       priv = dev->data->dev_private;
-       switch (param->type) {
-       case MLX5_MP_REQ_CREATE_MR:
-               mp_init_msg(&priv->mp_id, &mp_res, param->type);
-               lkey = mlx5_mr_create_primary(priv->sh->pd,
-                                             &priv->sh->share_cache,
-                                             &entry, param->args.addr,
-                                             priv->config.mr_ext_memseg_en);
-               if (lkey == UINT32_MAX)
-                       res->result = -rte_errno;
-               ret = rte_mp_reply(&mp_res, peer);
-               break;
-       case MLX5_MP_REQ_VERBS_CMD_FD:
-               mp_init_msg(&priv->mp_id, &mp_res, param->type);
-               mp_res.num_fds = 1;
-               mp_res.fds[0] = ((struct ibv_context *)priv->sh->ctx)->cmd_fd;
-               res->result = 0;
-               ret = rte_mp_reply(&mp_res, peer);
-               break;
-       case MLX5_MP_REQ_QUEUE_STATE_MODIFY:
-               mp_init_msg(&priv->mp_id, &mp_res, param->type);
-               res->result = mlx5_queue_state_modify_primary
-                                       (dev, &param->args.state_modify);
-               ret = rte_mp_reply(&mp_res, peer);
-               break;
-       default:
-               rte_errno = EINVAL;
-               DRV_LOG(ERR, "port %u invalid mp request type",
-                       dev->data->port_id);
-               return -rte_errno;
-       }
-       return ret;
-}
-
-/**
- * IPC message handler of a secondary process.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- * @param[in] peer
- *   Pointer to the peer socket path.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-mlx5_mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
-{
-       struct rte_mp_msg mp_res;
-       struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
-       const struct mlx5_mp_param *param =
-               (const struct mlx5_mp_param *)mp_msg->param;
-       struct rte_eth_dev *dev;
-       struct mlx5_priv *priv;
-       int ret;
-
-       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
-       if (!rte_eth_dev_is_valid_port(param->port_id)) {
-               rte_errno = ENODEV;
-               DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
-               return -rte_errno;
-       }
-       dev = &rte_eth_devices[param->port_id];
-       priv = dev->data->dev_private;
-       switch (param->type) {
-       case MLX5_MP_REQ_START_RXTX:
-               DRV_LOG(INFO, "port %u starting datapath", dev->data->port_id);
-               rte_mb();
-               dev->rx_pkt_burst = mlx5_select_rx_function(dev);
-               dev->tx_pkt_burst = mlx5_select_tx_function(dev);
-               mp_init_msg(&priv->mp_id, &mp_res, param->type);
-               res->result = 0;
-               ret = rte_mp_reply(&mp_res, peer);
-               break;
-       case MLX5_MP_REQ_STOP_RXTX:
-               DRV_LOG(INFO, "port %u stopping datapath", dev->data->port_id);
-               dev->rx_pkt_burst = removed_rx_burst;
-               dev->tx_pkt_burst = removed_tx_burst;
-               rte_mb();
-               mp_init_msg(&priv->mp_id, &mp_res, param->type);
-               res->result = 0;
-               ret = rte_mp_reply(&mp_res, peer);
-               break;
-       default:
-               rte_errno = EINVAL;
-               DRV_LOG(ERR, "port %u invalid mp request type",
-                       dev->data->port_id);
-               return -rte_errno;
-       }
-       return ret;
-}
-
-/**
- * Broadcast request of stopping/starting data-path to secondary processes.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- * @param[in] type
- *   Request type.
- */
-static void
-mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
-{
-       struct rte_mp_msg mp_req;
-       struct rte_mp_msg *mp_res;
-       struct rte_mp_reply mp_rep;
-       struct mlx5_mp_param *res;
-       struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
-       struct mlx5_priv *priv = dev->data->dev_private;
-       int ret;
-       int i;
-
-       MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
-       if (!mlx5_shared_data->secondary_cnt)
-               return;
-       if (type != MLX5_MP_REQ_START_RXTX && type != MLX5_MP_REQ_STOP_RXTX) {
-               DRV_LOG(ERR, "port %u unknown request (req_type %d)",
-                       dev->data->port_id, type);
-               return;
-       }
-       mp_init_msg(&priv->mp_id, &mp_req, type);
-       ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
-       if (ret) {
-               if (rte_errno != ENOTSUP)
-                       DRV_LOG(ERR, "port %u failed to request stop/start Rx/Tx (%d)",
-                               dev->data->port_id, type);
-               goto exit;
-       }
-       if (mp_rep.nb_sent != mp_rep.nb_received) {
-               DRV_LOG(ERR,
-                       "port %u not all secondaries responded (req_type %d)",
-                       dev->data->port_id, type);
-               goto exit;
-       }
-       for (i = 0; i < mp_rep.nb_received; i++) {
-               mp_res = &mp_rep.msgs[i];
-               res = (struct mlx5_mp_param *)mp_res->param;
-               if (res->result) {
-                       DRV_LOG(ERR, "port %u request failed on secondary #%d",
-                               dev->data->port_id, i);
-                       goto exit;
-               }
-       }
-exit:
-       mlx5_free(mp_rep.msgs);
-}
-
-/**
- * Broadcast request of starting data-path to secondary processes. The request
- * is synchronous.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- */
-void
-mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev)
-{
-       mp_req_on_rxtx(dev, MLX5_MP_REQ_START_RXTX);
-}
-
-/**
- * Broadcast request of stopping data-path to secondary processes. The request
- * is synchronous.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- */
-void
-mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev)
-{
-       mp_req_on_rxtx(dev, MLX5_MP_REQ_STOP_RXTX);
-}
index 6e5a730..6f1e6d4 100644 (file)
@@ -350,7 +350,7 @@ mlx5_dev_start(struct rte_eth_dev *dev)
        dev->tx_pkt_burst = mlx5_select_tx_function(dev);
        dev->rx_pkt_burst = mlx5_select_rx_function(dev);
        /* Enable datapath on secondary process. */
-       mlx5_mp_req_start_rxtx(dev);
+       mlx5_mp_os_req_start_rxtx(dev);
        if (priv->sh->intr_handle.fd >= 0) {
                priv->sh->port[priv->dev_port - 1].ih_port_id =
                                        (uint32_t)dev->data->port_id;
@@ -396,7 +396,7 @@ mlx5_dev_stop(struct rte_eth_dev *dev)
        dev->tx_pkt_burst = removed_tx_burst;
        rte_wmb();
        /* Disable datapath on secondary process. */
-       mlx5_mp_req_stop_rxtx(dev);
+       mlx5_mp_os_req_stop_rxtx(dev);
        usleep(1000 * priv->rxqs_n);
        DRV_LOG(DEBUG, "port %u stopping device", dev->data->port_id);
        mlx5_flow_stop_default(dev);