net/hns3: fix secondary process reference count
authorHuisong Li <lihuisong@huawei.com>
Tue, 2 Nov 2021 01:38:26 +0000 (09:38 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 4 Nov 2021 14:11:32 +0000 (15:11 +0100)
The "secondary_cnt" will be increased when a secondary process
initialized. But the value of this variable is not decreased when the
secondary process exits, which causes the primary process senses that
the secondary process still exists. As a result, the primary process
fails to send messages to the secondary process after the secondary
process exits.

Fixes: 23d4b61fee5d ("net/hns3: support multiple process")
Cc: stable@dpdk.org
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
drivers/net/hns3/hns3_ethdev.c
drivers/net/hns3/hns3_ethdev_vf.c
drivers/net/hns3/hns3_mp.c

index 03447c8..dafaf31 100644 (file)
@@ -5850,8 +5850,10 @@ hns3_dev_close(struct rte_eth_dev *eth_dev)
        struct hns3_hw *hw = &hns->hw;
        int ret = 0;
 
-       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+               __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                return 0;
+       }
 
        if (hw->adapter_state == HNS3_NIC_STARTED)
                ret = hns3_dev_stop(eth_dev);
@@ -7377,7 +7379,7 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
                                     "process, ret = %d", ret);
                        goto err_mp_init_secondary;
                }
-               hw->secondary_cnt++;
+               __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                hns3_tx_push_init(eth_dev);
                return 0;
        }
@@ -7480,8 +7482,10 @@ hns3_dev_uninit(struct rte_eth_dev *eth_dev)
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+               __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                return 0;
+       }
 
        if (hw->adapter_state < HNS3_NIC_CLOSING)
                hns3_dev_close(eth_dev);
index 4a0d73f..41d61a8 100644 (file)
@@ -1893,8 +1893,10 @@ hns3vf_dev_close(struct rte_eth_dev *eth_dev)
        struct hns3_hw *hw = &hns->hw;
        int ret = 0;
 
-       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+               __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                return 0;
+       }
 
        if (hw->adapter_state == HNS3_NIC_STARTED)
                ret = hns3vf_dev_stop(eth_dev);
@@ -2685,7 +2687,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
                                          "process, ret = %d", ret);
                        goto err_mp_init_secondary;
                }
-               hw->secondary_cnt++;
+               __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                hns3_tx_push_init(eth_dev);
                return 0;
        }
@@ -2787,8 +2789,10 @@ hns3vf_dev_uninit(struct rte_eth_dev *eth_dev)
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
+               __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED);
                return 0;
+       }
 
        if (hw->adapter_state < HNS3_NIC_CLOSING)
                hns3vf_dev_close(eth_dev);
index cd514ac..c28598a 100644 (file)
@@ -150,8 +150,10 @@ mp_req_on_rxtx(struct rte_eth_dev *dev, enum hns3_mp_req_type type)
        int ret;
        int i;
 
-       if (rte_eal_process_type() == RTE_PROC_SECONDARY || !hw->secondary_cnt)
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY ||
+               __atomic_load_n(&hw->secondary_cnt, __ATOMIC_RELAXED) == 0)
                return;
+
        if (!mp_req_type_is_valid(type)) {
                hns3_err(hw, "port %u unknown request (req_type %d)",
                         dev->data->port_id, type);