From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F0AF1A0C4D; Tue, 2 Nov 2021 02:40:31 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 71AC04069F; Tue, 2 Nov 2021 02:40:31 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id D04944068F for ; Tue, 2 Nov 2021 02:40:29 +0100 (CET) Received: from dggeme756-chm.china.huawei.com (unknown [172.30.72.55]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4HjsxD2l8zzZcXh; Tue, 2 Nov 2021 09:38:24 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by dggeme756-chm.china.huawei.com (10.3.19.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.15; Tue, 2 Nov 2021 09:40:27 +0800 From: "Min Hu (Connor)" To: CC: , Date: Tue, 2 Nov 2021 09:38:26 +0800 Message-ID: <20211102013829.42345-2-humin29@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211102013829.42345-1-humin29@huawei.com> References: <20211102013829.42345-1-humin29@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.69.192.56] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggeme756-chm.china.huawei.com (10.3.19.102) X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH 1/4] net/hns3: decrease the count when secondary process exits X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Huisong Li 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 Signed-off-by: Min Hu (Connor) --- drivers/net/hns3/hns3_ethdev.c | 10 +++++++--- drivers/net/hns3/hns3_ethdev_vf.c | 10 +++++++--- drivers/net/hns3/hns3_mp.c | 4 +++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 56eca03833..2dd9881040 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -5849,8 +5849,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); @@ -7376,7 +7378,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; } @@ -7479,8 +7481,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); diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 675db44e85..0f7eeb1d7e 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1892,8 +1892,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); @@ -2684,7 +2686,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; } @@ -2786,8 +2788,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); diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c index cd514ac29c..c28598a53a 100644 --- a/drivers/net/hns3/hns3_mp.c +++ b/drivers/net/hns3/hns3_mp.c @@ -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); -- 2.33.0