Skip to content

Commit

Permalink
net/hns3: check multi-process action register result
Browse files Browse the repository at this point in the history
Currently, there is a coverity defect warning about hns3 PMD driver, the
detail information as blow:
CID 289969 (#1 of 1): Unchecked return value (CHECKED_RETURN)
1. check_return: Calling rte_mp_action_register without checking return
   value (as is done elsewhere 11 out of 13 times).

The problem is that missing checking the return value of calling the API
rte_mp_action_register during initialization. If registering an action
function for primary and secondary communication failed, the secondary
process can't work properly.

This patch fixes it by adding check return value of the API function
named rte_mp_action_register in the '.dev_init' implementation function
of hns3 PMD driver.

Coverity issue: 289969
Fixes: 23d4b61 ("net/hns3: support multiple process")
Cc: stable@dpdk.org

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
  • Loading branch information
xavierhw authored and Ferruh Yigit committed Jul 7, 2020
1 parent 7569b8c commit 9570b1f
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 11 deletions.
22 changes: 20 additions & 2 deletions drivers/net/hns3/hns3_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -5448,12 +5448,25 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
hns3_set_rxtx_function(eth_dev);
eth_dev->dev_ops = &hns3_eth_dev_ops;
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
hns3_mp_init_secondary();
ret = hns3_mp_init_secondary();
if (ret) {
PMD_INIT_LOG(ERR, "Failed to init for secondary "
"process, ret = %d", ret);
goto err_mp_init_secondary;
}

hw->secondary_cnt++;
return 0;
}

hns3_mp_init_primary();
ret = hns3_mp_init_primary();
if (ret) {
PMD_INIT_LOG(ERR,
"Failed to init for primary process, ret = %d",
ret);
goto err_mp_init_primary;
}

hw->adapter_state = HNS3_NIC_UNINITIALIZED;
hns->is_vf = false;
hw->data = eth_dev->data;
Expand Down Expand Up @@ -5514,7 +5527,12 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)

err_init_pf:
rte_free(hw->reset.wait_data);

err_init_reset:
hns3_mp_uninit_primary();

err_mp_init_primary:
err_mp_init_secondary:
eth_dev->dev_ops = NULL;
eth_dev->rx_pkt_burst = NULL;
eth_dev->tx_pkt_burst = NULL;
Expand Down
20 changes: 18 additions & 2 deletions drivers/net/hns3/hns3_ethdev_vf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2524,12 +2524,24 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
hns3_set_rxtx_function(eth_dev);
eth_dev->dev_ops = &hns3vf_eth_dev_ops;
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
hns3_mp_init_secondary();
ret = hns3_mp_init_secondary();
if (ret) {
PMD_INIT_LOG(ERR, "Failed to init for secondary "
"process, ret = %d", ret);
goto err_mp_init_secondary;
}

hw->secondary_cnt++;
return 0;
}

hns3_mp_init_primary();
ret = hns3_mp_init_primary();
if (ret) {
PMD_INIT_LOG(ERR,
"Failed to init for primary process, ret = %d",
ret);
goto err_mp_init_primary;
}

hw->adapter_state = HNS3_NIC_UNINITIALIZED;
hns->is_vf = true;
Expand Down Expand Up @@ -2586,6 +2598,10 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
rte_free(hw->reset.wait_data);

err_init_reset:
hns3_mp_uninit_primary();

err_mp_init_primary:
err_mp_init_secondary:
eth_dev->dev_ops = NULL;
eth_dev->rx_pkt_burst = NULL;
eth_dev->tx_pkt_burst = NULL;
Expand Down
34 changes: 29 additions & 5 deletions drivers/net/hns3/hns3_mp.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "hns3_rxtx.h"
#include "hns3_mp.h"

static bool hns3_inited;

/*
* Initialize IPC message.
*
Expand Down Expand Up @@ -192,23 +194,45 @@ void hns3_mp_req_stop_rxtx(struct rte_eth_dev *dev)
/*
* Initialize by primary process.
*/
void hns3_mp_init_primary(void)
int hns3_mp_init_primary(void)
{
rte_mp_action_register(HNS3_MP_NAME, mp_primary_handle);
int ret;

if (!hns3_inited) {
/* primary is allowed to not support IPC */
ret = rte_mp_action_register(HNS3_MP_NAME, mp_primary_handle);
if (ret && rte_errno != ENOTSUP)
return ret;

hns3_inited = true;
}

return 0;
}

/*
* Un-initialize by primary process.
*/
void hns3_mp_uninit_primary(void)
{
rte_mp_action_unregister(HNS3_MP_NAME);
if (hns3_inited)
rte_mp_action_unregister(HNS3_MP_NAME);
}

/*
* Initialize by secondary process.
*/
void hns3_mp_init_secondary(void)
int hns3_mp_init_secondary(void)
{
rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle);
int ret;

if (!hns3_inited) {
ret = rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle);
if (ret)
return ret;

hns3_inited = true;
}

return 0;
}
4 changes: 2 additions & 2 deletions drivers/net/hns3/hns3_mp.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

void hns3_mp_req_start_rxtx(struct rte_eth_dev *dev);
void hns3_mp_req_stop_rxtx(struct rte_eth_dev *dev);
void hns3_mp_init_primary(void);
int hns3_mp_init_primary(void);
void hns3_mp_uninit_primary(void);
void hns3_mp_init_secondary(void);
int hns3_mp_init_secondary(void);

#endif /* _HNS3_MP_H_ */

0 comments on commit 9570b1f

Please sign in to comment.