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

