Cmdq ops are currently allocated dynamically, so when the driver is loaded
with both a primary and a secondary process the copies overwrite each other
and cause a core dump. Convert them to const global tables so every process
references the same static structures.

Signed-off-by: Jiacheng Ye <[email protected]>
---
 drivers/net/hinic3/base/hinic3_nic_cfg.c      |  7 ++--
 drivers/net/hinic3/hinic3_ethdev.c            | 34 ++++++++++---------
 drivers/net/hinic3/hinic3_ethdev.h            |  1 -
 drivers/net/hinic3/hinic3_nic_io.c            | 11 +++---
 drivers/net/hinic3/hinic3_nic_io.h            | 14 ++++++++
 .../net/hinic3/htn_adapt/hinic3_htn_cmdq.c    | 21 +++++-------
 .../net/hinic3/htn_adapt/hinic3_htn_cmdq.h    |  6 ++--
 .../net/hinic3/stn_adapt/hinic3_stn_cmdq.c    | 23 +++++--------
 .../net/hinic3/stn_adapt/hinic3_stn_cmdq.h    |  6 ++--
 9 files changed, 65 insertions(+), 58 deletions(-)

diff --git a/drivers/net/hinic3/base/hinic3_nic_cfg.c 
b/drivers/net/hinic3/base/hinic3_nic_cfg.c
index 2241908004..235b36dcce 100644
--- a/drivers/net/hinic3/base/hinic3_nic_cfg.c
+++ b/drivers/net/hinic3/base/hinic3_nic_cfg.c
@@ -1212,7 +1212,7 @@ hinic3_rss_get_indir_tbl(struct hinic3_hwdev *hwdev, 
uint32_t *indir_table)
        cmd_buf->size = sizeof(struct nic_rss_indirect_tbl);
        nic_dev = (struct hinic3_nic_dev *)hwdev->dev_handle;
 
-       cmd = nic_dev->cmdq_ops->prepare_cmd_buf_get_rss_indir_table(nic_dev, 
cmd_buf);
+       cmd = 
hinic3_cmdq_get_ops(nic_dev)->prepare_cmd_buf_get_rss_indir_table(nic_dev, 
cmd_buf);
        err = hinic3_cmdq_detail_resp(hwdev, HINIC3_MOD_L2NIC, cmd, cmd_buf, 
cmd_buf, 0);
        if (err) {
                PMD_DRV_LOG(ERR, "Get rss indir table failed");
@@ -1220,7 +1220,7 @@ hinic3_rss_get_indir_tbl(struct hinic3_hwdev *hwdev, 
uint32_t *indir_table)
                return err;
        }
 
-       nic_dev->cmdq_ops->cmd_buf_to_rss_indir_table(cmd_buf, indir_table);
+       hinic3_cmdq_get_ops(nic_dev)->cmd_buf_to_rss_indir_table(cmd_buf, 
indir_table);
 
        hinic3_free_cmd_buf(cmd_buf);
        return 0;
@@ -1245,7 +1245,8 @@ hinic3_rss_set_indir_tbl(struct hinic3_hwdev *hwdev, 
const uint32_t *indir_table
        }
 
        nic_dev = (struct hinic3_nic_dev *)hwdev->dev_handle;
-       cmd = nic_dev->cmdq_ops->prepare_cmd_buf_set_rss_indir_table(nic_dev, 
indir_table, cmd_buf);
+       cmd = 
hinic3_cmdq_get_ops(nic_dev)->prepare_cmd_buf_set_rss_indir_table(nic_dev,
+               indir_table, cmd_buf);
        err = hinic3_cmdq_direct_resp(hwdev, HINIC3_MOD_L2NIC, cmd, cmd_buf, 
&out_param, 0);
        if (err || out_param != 0) {
                PMD_DRV_LOG(ERR, "Set rss indir table failed");
diff --git a/drivers/net/hinic3/hinic3_ethdev.c 
b/drivers/net/hinic3/hinic3_ethdev.c
index f4be6cdc06..d7dbd945bc 100644
--- a/drivers/net/hinic3/hinic3_ethdev.c
+++ b/drivers/net/hinic3/hinic3_ethdev.c
@@ -539,6 +539,24 @@ hinic3_init_default_cos(struct hinic3_nic_dev *nic_dev)
        return 0;
 }
 
+/**
+ * Get cmdq ops for the given NIC device.
+ *
+ * @param[in] nic_dev
+ * Pointer to NIC device structure.
+ *
+ * @return
+ * Pointer to cmdq ops structure.
+ */
+const struct hinic3_nic_cmdq_ops *
+hinic3_cmdq_get_ops(struct hinic3_nic_dev *nic_dev)
+{
+       if (nic_dev->feature_cap & NIC_F_HTN_CMDQ)
+               return &hinic3_htn_cmdq_ops;
+       else
+               return &hinic3_stn_cmdq_ops;
+}
+
 /**
  * Initialize Class of Service (CoS). For PF devices, it also sync the link
  * status with the physical port.
@@ -3670,13 +3688,6 @@ hinic3_func_init(struct rte_eth_dev *eth_dev)
                goto alloc_eth_addr_fail;
        }
 
-       nic_dev->cmdq_ops = rte_zmalloc("cmdq_ops", sizeof(struct 
hinic3_nic_cmdq_ops), 0);
-       if (!nic_dev->cmdq_ops) {
-               PMD_DRV_LOG(ERR, "Allocate cmdq_ops memory failed");
-               err = -ENOMEM;
-               goto alloc_cmdq_ops_fail;
-       }
-
        nic_dev->rx_ops = rte_zmalloc("rx_ops", sizeof(struct 
hinic3_nic_rx_ops), 0);
        if (!nic_dev->rx_ops) {
                PMD_DRV_LOG(ERR, "Allocate rx_ops memory failed");
@@ -3744,11 +3755,6 @@ hinic3_func_init(struct rte_eth_dev *eth_dev)
                goto get_cap_fail;
        }
 
-       if (!(nic_dev->feature_cap & NIC_F_HTN_CMDQ))
-               nic_dev->cmdq_ops = hinic3_nic_cmdq_get_stn_ops();
-       else
-               nic_dev->cmdq_ops = hinic3_nic_cmdq_get_htn_ops();
-
        hinic3_nic_tx_rx_ops_init(nic_dev);
 
        err = hinic3_init_sw_rxtxqs(nic_dev);
@@ -3847,10 +3853,6 @@ hinic3_func_init(struct rte_eth_dev *eth_dev)
        nic_dev->rx_ops = NULL;
 
 alloc_rx_ops_fail:
-       rte_free(nic_dev->cmdq_ops);
-       nic_dev->cmdq_ops = NULL;
-
-alloc_cmdq_ops_fail:
        rte_free(eth_dev->data->mac_addrs);
        eth_dev->data->mac_addrs = NULL;
 
diff --git a/drivers/net/hinic3/hinic3_ethdev.h 
b/drivers/net/hinic3/hinic3_ethdev.h
index 73f47731bf..57f46aa850 100644
--- a/drivers/net/hinic3/hinic3_ethdev.h
+++ b/drivers/net/hinic3/hinic3_ethdev.h
@@ -151,7 +151,6 @@ struct hinic3_nic_dev {
        struct hinic3_ethertype_filter_list filter_ethertype_list;
        struct hinic3_fdir_rule_filter_list filter_fdir_rule_list;
        uint8_t cos_map[HINIC3_COS_NUM_MAX];
-       struct hinic3_nic_cmdq_ops *cmdq_ops;
        struct hinic3_nic_rx_ops *rx_ops;
        struct hinic3_nic_tx_ops *tx_ops;
        uint32_t fec_mode;  /**< Current FEC mode for ethdev. */
diff --git a/drivers/net/hinic3/hinic3_nic_io.c 
b/drivers/net/hinic3/hinic3_nic_io.c
index 9203dcce40..361586868e 100644
--- a/drivers/net/hinic3/hinic3_nic_io.c
+++ b/drivers/net/hinic3/hinic3_nic_io.c
@@ -391,8 +391,8 @@ init_sq_ctxts(struct hinic3_nic_dev *nic_dev)
                max_ctxts = (nic_dev->num_sqs - q_id) > HINIC3_Q_CTXT_MAX
                                    ? HINIC3_Q_CTXT_MAX
                                    : (nic_dev->num_sqs - q_id);
-               cmd = 
nic_dev->cmdq_ops->prepare_cmd_buf_qp_context_multi_store(nic_dev, cmd_buf,
-                       HINIC3_QP_CTXT_TYPE_SQ, q_id, max_ctxts);
+               cmd = 
hinic3_cmdq_get_ops(nic_dev)->prepare_cmd_buf_qp_context_multi_store(nic_dev,
+                       cmd_buf, HINIC3_QP_CTXT_TYPE_SQ, q_id, max_ctxts);
                rte_atomic_thread_fence(rte_memory_order_seq_cst);
                err = hinic3_cmdq_direct_resp(nic_dev->hwdev, HINIC3_MOD_L2NIC,
                                              cmd, cmd_buf, &out_param, 0);
@@ -443,8 +443,8 @@ init_rq_ctxts(struct hinic3_nic_dev *nic_dev)
                max_ctxts = (nic_dev->num_rqs - q_id) > HINIC3_Q_CTXT_MAX
                                    ? HINIC3_Q_CTXT_MAX
                                    : (nic_dev->num_rqs - q_id);
-               cmd = 
nic_dev->cmdq_ops->prepare_cmd_buf_qp_context_multi_store(nic_dev, cmd_buf,
-                       HINIC3_QP_CTXT_TYPE_RQ, q_id, max_ctxts);
+               cmd = 
hinic3_cmdq_get_ops(nic_dev)->prepare_cmd_buf_qp_context_multi_store(nic_dev,
+                       cmd_buf, HINIC3_QP_CTXT_TYPE_RQ, q_id, max_ctxts);
                rte_atomic_thread_fence(rte_memory_order_seq_cst);
                err = hinic3_cmdq_direct_resp(nic_dev->hwdev, HINIC3_MOD_L2NIC,
                                              cmd, cmd_buf, &out_param, 0);
@@ -491,7 +491,8 @@ clean_queue_offload_ctxt(struct hinic3_nic_dev *nic_dev,
                return -ENOMEM;
        }
 
-       cmd = nic_dev->cmdq_ops->prepare_cmd_buf_clean_tso_lro_space(nic_dev, 
cmd_buf, ctxt_type);
+       cmd = 
hinic3_cmdq_get_ops(nic_dev)->prepare_cmd_buf_clean_tso_lro_space(nic_dev,
+               cmd_buf, ctxt_type);
 
        /* Send a command to hardware to clean up queue offload context. */
        err = hinic3_cmdq_direct_resp(nic_dev->hwdev, HINIC3_MOD_L2NIC,
diff --git a/drivers/net/hinic3/hinic3_nic_io.h 
b/drivers/net/hinic3/hinic3_nic_io.h
index e1741d1156..c8b33e985d 100644
--- a/drivers/net/hinic3/hinic3_nic_io.h
+++ b/drivers/net/hinic3/hinic3_nic_io.h
@@ -79,6 +79,20 @@ struct hinic3_nic_cmdq_ops {
        cmd_buf_to_rss_indir_table_t                    
cmd_buf_to_rss_indir_table;
 };
 
+/* Forward declaration */
+struct hinic3_nic_dev;
+
+/**
+ * Get cmdq ops for the given NIC device.
+ *
+ * @param[in] nic_dev
+ * Pointer to NIC device structure.
+ *
+ * @return
+ * Pointer to cmdq ops structure.
+ */
+const struct hinic3_nic_cmdq_ops *hinic3_cmdq_get_ops(struct hinic3_nic_dev 
*nic_dev);
+
 /* Doorbell info. */
 struct hinic3_db {
        uint32_t db_info;
diff --git a/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.c 
b/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.c
index 634dfe7239..607fe2d0fe 100644
--- a/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.c
+++ b/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.c
@@ -152,16 +152,11 @@ static void cmd_buf_to_rss_indir_table(const struct 
hinic3_cmd_buf *cmd_buf, uin
                indir_table[i] = *(indir_tbl + i);
 }
 
-struct hinic3_nic_cmdq_ops *hinic3_nic_cmdq_get_htn_ops(void)
-{
-       static struct hinic3_nic_cmdq_ops cmdq_ops = {
-               .prepare_cmd_buf_clean_tso_lro_space =    
prepare_cmd_buf_clean_tso_lro_space,
-               .prepare_cmd_buf_qp_context_multi_store = 
prepare_cmd_buf_qp_context_multi_store,
-               .prepare_cmd_buf_modify_svlan =           
prepare_cmd_buf_modify_svlan,
-               .prepare_cmd_buf_set_rss_indir_table =    
prepare_cmd_buf_set_rss_indir_table,
-               .prepare_cmd_buf_get_rss_indir_table =    
prepare_cmd_buf_get_rss_indir_table,
-               .cmd_buf_to_rss_indir_table =             
cmd_buf_to_rss_indir_table,
-       };
-
-       return &cmdq_ops;
-}
+const struct hinic3_nic_cmdq_ops hinic3_htn_cmdq_ops = {
+       .prepare_cmd_buf_clean_tso_lro_space =    
prepare_cmd_buf_clean_tso_lro_space,
+       .prepare_cmd_buf_qp_context_multi_store = 
prepare_cmd_buf_qp_context_multi_store,
+       .prepare_cmd_buf_modify_svlan =           prepare_cmd_buf_modify_svlan,
+       .prepare_cmd_buf_set_rss_indir_table =    
prepare_cmd_buf_set_rss_indir_table,
+       .prepare_cmd_buf_get_rss_indir_table =    
prepare_cmd_buf_get_rss_indir_table,
+       .cmd_buf_to_rss_indir_table =             cmd_buf_to_rss_indir_table,
+};
diff --git a/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.h 
b/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.h
index 73f4922734..158cbc5f8e 100644
--- a/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.h
+++ b/drivers/net/hinic3/htn_adapt/hinic3_htn_cmdq.h
@@ -53,11 +53,11 @@ struct hinic3_htn_vlan_ctx {
 };
 
 /**
- * Get cmdq ops hardware tile NIC(htn) supported.
+ * Cmdq ops hardware tile NIC(htn) supported.
  *
  * @return
- * Pointer to ops.
+ * Ops.
  */
-struct hinic3_nic_cmdq_ops *hinic3_nic_cmdq_get_htn_ops(void);
+extern const struct hinic3_nic_cmdq_ops hinic3_htn_cmdq_ops;
 
 #endif /* _HINIC3_HTN_CMDQ_H_ */
diff --git a/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.c 
b/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.c
index f41f060d17..23adbc79f4 100644
--- a/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.c
+++ b/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.c
@@ -108,7 +108,7 @@ static uint8_t prepare_cmd_buf_set_rss_indir_table(struct 
hinic3_nic_dev *nic_de
 
        for (i = 0; i < HINIC3_RSS_INDIR_SIZE; i++)
                indir_tbl->entry[i] = (uint16_t)(*(indir_table + i));
-       size = sizeof(indir_tbl->entry) / 4;
+       size = (size_t)sizeof(indir_tbl->entry) / sizeof(uint32_t);
        temp = (uint32_t *)indir_tbl->entry;
        for (i = 0; i < size; i++) {
                rte_atomic_thread_fence(rte_memory_order_seq_cst);
@@ -136,16 +136,11 @@ static void cmd_buf_to_rss_indir_table(const struct 
hinic3_cmd_buf *cmd_buf, uin
                indir_table[i] = *(indir_tbl + i);
 }
 
-struct hinic3_nic_cmdq_ops *hinic3_nic_cmdq_get_stn_ops(void)
-{
-       static struct hinic3_nic_cmdq_ops cmdq_ops = {
-               .prepare_cmd_buf_clean_tso_lro_space =    
prepare_cmd_buf_clean_tso_lro_space,
-               .prepare_cmd_buf_qp_context_multi_store = 
prepare_cmd_buf_qp_context_multi_store,
-               .prepare_cmd_buf_modify_svlan =           
prepare_cmd_buf_modify_svlan,
-               .prepare_cmd_buf_set_rss_indir_table =    
prepare_cmd_buf_set_rss_indir_table,
-               .prepare_cmd_buf_get_rss_indir_table =    
prepare_cmd_buf_get_rss_indir_table,
-               .cmd_buf_to_rss_indir_table =             
cmd_buf_to_rss_indir_table,
-       };
-
-       return &cmdq_ops;
-}
+const struct hinic3_nic_cmdq_ops hinic3_stn_cmdq_ops = {
+       .prepare_cmd_buf_clean_tso_lro_space =    
prepare_cmd_buf_clean_tso_lro_space,
+       .prepare_cmd_buf_qp_context_multi_store = 
prepare_cmd_buf_qp_context_multi_store,
+       .prepare_cmd_buf_modify_svlan =           prepare_cmd_buf_modify_svlan,
+       .prepare_cmd_buf_set_rss_indir_table =    
prepare_cmd_buf_set_rss_indir_table,
+       .prepare_cmd_buf_get_rss_indir_table =    
prepare_cmd_buf_get_rss_indir_table,
+       .cmd_buf_to_rss_indir_table =             cmd_buf_to_rss_indir_table,
+};
diff --git a/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.h 
b/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.h
index f1720c29c7..ab1c73a977 100644
--- a/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.h
+++ b/drivers/net/hinic3/stn_adapt/hinic3_stn_cmdq.h
@@ -36,11 +36,11 @@ struct hinic3_stn_vlan_ctx {
 };
 
 /**
- * Get cmdq ops software tile NIC(stn) supported.
+ * Cmdq ops software tile NIC(stn) supported.
  *
  * @return
- * Pointer to ops.
+ * Ops.
  */
-struct hinic3_nic_cmdq_ops *hinic3_nic_cmdq_get_stn_ops(void);
+extern const struct hinic3_nic_cmdq_ops hinic3_stn_cmdq_ops;
 
 #endif /* _HINIC3_STN_CMDQ_H_ */
-- 
2.33.0


Reply via email to