]> git.droids-corp.org - dpdk.git/commitdiff
net/hns3: check multi-process action register result
authorWei Hu (Xavier) <xavier.huwei@huawei.com>
Sat, 4 Jul 2020 10:09:48 +0000 (18:09 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 7 Jul 2020 21:38:28 +0000 (23:38 +0200)
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: 23d4b61fee5d ("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>
drivers/net/hns3/hns3_ethdev.c
drivers/net/hns3/hns3_ethdev_vf.c
drivers/net/hns3/hns3_mp.c
drivers/net/hns3/hns3_mp.h

index 13ce3243270fba18f52f717b8775a64e70dd22a2..9575a05ae668716a59da57025f6373893d186e32 100644 (file)
@@ -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;
@@ -5514,7 +5527,12 @@ err_rte_zmalloc:
 
 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;
index 3c5998abea86910311adf7129c35f28b4c740d1b..54e5dac52abaa297f3795fdb83a989afeeb2c4e3 100644 (file)
@@ -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;
@@ -2586,6 +2598,10 @@ err_init_vf:
        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;
index 596c31064af9508675807d9f4c7b288db22a154d..639f46ced87c6823bbd03edd23f392e212ecb5fe 100644 (file)
@@ -14,6 +14,8 @@
 #include "hns3_rxtx.h"
 #include "hns3_mp.h"
 
+static bool hns3_inited;
+
 /*
  * Initialize IPC message.
  *
@@ -192,9 +194,20 @@ 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;
 }
 
 /*
@@ -202,13 +215,24 @@ void hns3_mp_init_primary(void)
  */
 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;
 }
index aefbeb140e2f9a0aaa5b9ae35086e5b4f6aef9df..036546ae1157ca66d21e1e9f57ae16d7ed345e0b 100644 (file)
@@ -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_ */