From patchwork Tue Nov 2 01:38:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 103375 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org 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 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); From patchwork Tue Nov 2 01:38:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 103376 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F11D8A0C4D; Tue, 2 Nov 2021 02:40:37 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 61E68410FF; Tue, 2 Nov 2021 02:40:32 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id D45434069F for ; Tue, 2 Nov 2021 02:40:29 +0100 (CET) Received: from dggeme756-chm.china.huawei.com (unknown [172.30.72.57]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Hjst83Fp8zcb4K; Tue, 2 Nov 2021 09:35:44 +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:27 +0800 Message-ID: <20211102013829.42345-3-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 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 2/4] net/hns3: fix MP action register and unregister 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 multi-process has the following problems: 1) After a port in primary process is closed, the mp action of the process is unregistered. which will cause that other device in the primary process cannot respond to requests from secondary processes. 2) Because variable "hns3_inited" is set to true without returning an initial value, the mp action cannot be registered again after it is unregistered. 3) The mp action of primary and secondary process need to be registered only once regardless of port numbers in the process. That's what variable "hns3_inited" does. But the variable is difficult to understand. This patch adds a hns3_process_local_data structure to resolve above problems. Fixes: 9570b1fdbdad ("net/hns3: check multi-process action register result") Fixes: 23d4b61fee5d ("net/hns3: support multiple process") Signed-off-by: Huisong Li Signed-off-by: Min Hu (Connor) --- drivers/net/hns3/hns3_ethdev.c | 2 ++ drivers/net/hns3/hns3_ethdev_vf.c | 2 ++ drivers/net/hns3/hns3_mp.c | 37 ++++++++++++++++++------------- drivers/net/hns3/hns3_mp.h | 7 ++++++ 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 2dd9881040..658baf9ec3 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -7379,6 +7379,7 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) goto err_mp_init_secondary; } __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + process_data.eth_dev_cnt++; hns3_tx_push_init(eth_dev); return 0; } @@ -7390,6 +7391,7 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) ret); goto err_mp_init_primary; } + process_data.eth_dev_cnt++; hw->adapter_state = HNS3_NIC_UNINITIALIZED; hns->is_vf = false; diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 0f7eeb1d7e..7286a858a9 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -2687,6 +2687,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) goto err_mp_init_secondary; } __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + process_data.eth_dev_cnt++; hns3_tx_push_init(eth_dev); return 0; } @@ -2698,6 +2699,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) ret); goto err_mp_init_primary; } + process_data.eth_dev_cnt++; hw->adapter_state = HNS3_NIC_UNINITIALIZED; hns->is_vf = true; diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c index c28598a53a..1a79d249b8 100644 --- a/drivers/net/hns3/hns3_mp.c +++ b/drivers/net/hns3/hns3_mp.c @@ -12,7 +12,8 @@ #include "hns3_rxtx.h" #include "hns3_mp.h" -static bool hns3_inited; +/* local data for primary or secondary process. */ +struct hns3_process_local_data process_data; /* * Initialize IPC message. @@ -230,14 +231,15 @@ int hns3_mp_init_primary(void) { 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; + if (process_data.init_done) + return 0; - hns3_inited = true; - } + /* 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; + + process_data.init_done = true; return 0; } @@ -247,8 +249,12 @@ int hns3_mp_init_primary(void) */ void hns3_mp_uninit_primary(void) { - if (hns3_inited) + process_data.eth_dev_cnt--; + + if (process_data.eth_dev_cnt == 0) { rte_mp_action_unregister(HNS3_MP_NAME); + process_data.init_done = false; + } } /* @@ -258,13 +264,14 @@ int hns3_mp_init_secondary(void) { int ret; - if (!hns3_inited) { - ret = rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle); - if (ret) - return ret; + if (process_data.init_done) + return 0; - hns3_inited = true; - } + ret = rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle); + if (ret) + return ret; + + process_data.init_done = true; return 0; } diff --git a/drivers/net/hns3/hns3_mp.h b/drivers/net/hns3/hns3_mp.h index e0e4aeaf6c..b49532f985 100644 --- a/drivers/net/hns3/hns3_mp.h +++ b/drivers/net/hns3/hns3_mp.h @@ -5,6 +5,13 @@ #ifndef _HNS3_MP_H_ #define _HNS3_MP_H_ +/* Local data for primary or secondary process. */ +struct hns3_process_local_data { + bool init_done; /* Process action register completed flag. */ + int eth_dev_cnt; /* Ethdev count under the current process. */ +}; +extern struct hns3_process_local_data process_data; + 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_req_start_tx(struct rte_eth_dev *dev); From patchwork Tue Nov 2 01:38:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 103378 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4F8C7A0C4D; Tue, 2 Nov 2021 02:40:48 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6DA8C4111F; Tue, 2 Nov 2021 02:40:34 +0100 (CET) Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by mails.dpdk.org (Postfix) with ESMTP id E964D410E5 for ; Tue, 2 Nov 2021 02:40:29 +0100 (CET) Received: from dggeme756-chm.china.huawei.com (unknown [172.30.72.56]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4HjsxD6dldz1DJ5t; 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:28 +0800 Message-ID: <20211102013829.42345-4-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 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 3/4] net/hns3: fix lack of unregistering MP action for secondary 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 This patch fixes lack of unregistering MP action for secondary process when PMD is closed. Fixes: 9570b1fdbdad ("net/hns3: check multi-process action register result") Fixes: 23d4b61fee5d ("net/hns3: support multiple process") Signed-off-by: Huisong Li Signed-off-by: Min Hu (Connor) --- drivers/net/hns3/hns3_ethdev.c | 6 ++++-- drivers/net/hns3/hns3_ethdev_vf.c | 6 ++++-- drivers/net/hns3/hns3_mp.c | 5 +---- drivers/net/hns3/hns3_mp.h | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 658baf9ec3..96ab0c4f6c 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -5851,6 +5851,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) { __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + hns3_mp_uninit(); return 0; } @@ -5867,7 +5868,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev) hns3_uninit_pf(eth_dev); hns3_free_all_queues(eth_dev); rte_free(hw->reset.wait_data); - hns3_mp_uninit_primary(); + hns3_mp_uninit(); hns3_warn(hw, "Close port %u finished", hw->data->port_id); return ret; @@ -7462,7 +7463,7 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) rte_free(hw->reset.wait_data); err_init_reset: - hns3_mp_uninit_primary(); + hns3_mp_uninit(); err_mp_init_primary: err_mp_init_secondary: @@ -7485,6 +7486,7 @@ hns3_dev_uninit(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) { __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + hns3_mp_uninit(); return 0; } diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 7286a858a9..633201a2c2 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1894,6 +1894,7 @@ hns3vf_dev_close(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) { __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + hns3_mp_uninit(); return 0; } @@ -1909,7 +1910,7 @@ hns3vf_dev_close(struct rte_eth_dev *eth_dev) hns3vf_uninit_vf(eth_dev); hns3_free_all_queues(eth_dev); rte_free(hw->reset.wait_data); - hns3_mp_uninit_primary(); + hns3_mp_uninit(); hns3_warn(hw, "Close port %u finished", hw->data->port_id); return ret; @@ -2768,7 +2769,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) rte_free(hw->reset.wait_data); err_init_reset: - hns3_mp_uninit_primary(); + hns3_mp_uninit(); err_mp_init_primary: err_mp_init_secondary: @@ -2792,6 +2793,7 @@ hns3vf_dev_uninit(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) { __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + hns3_mp_uninit(); return 0; } diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c index 1a79d249b8..6d33bf49cd 100644 --- a/drivers/net/hns3/hns3_mp.c +++ b/drivers/net/hns3/hns3_mp.c @@ -244,10 +244,7 @@ int hns3_mp_init_primary(void) return 0; } -/* - * Un-initialize by primary process. - */ -void hns3_mp_uninit_primary(void) +void hns3_mp_uninit(void) { process_data.eth_dev_cnt--; diff --git a/drivers/net/hns3/hns3_mp.h b/drivers/net/hns3/hns3_mp.h index b49532f985..5738ab74a5 100644 --- a/drivers/net/hns3/hns3_mp.h +++ b/drivers/net/hns3/hns3_mp.h @@ -18,7 +18,7 @@ void hns3_mp_req_start_tx(struct rte_eth_dev *dev); void hns3_mp_req_stop_tx(struct rte_eth_dev *dev); int hns3_mp_init_primary(void); -void hns3_mp_uninit_primary(void); +void hns3_mp_uninit(void); int hns3_mp_init_secondary(void); #endif /* _HNS3_MP_H_ */ From patchwork Tue Nov 2 01:38:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "humin (Q)" X-Patchwork-Id: 103377 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9AC28A0C4D; Tue, 2 Nov 2021 02:40:42 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5FE9641109; Tue, 2 Nov 2021 02:40:33 +0100 (CET) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id E4FD440DF6 for ; Tue, 2 Nov 2021 02:40:29 +0100 (CET) Received: from dggeme756-chm.china.huawei.com (unknown [172.30.72.56]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4Hjst84NY1zbhM8; Tue, 2 Nov 2021 09:35:44 +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:29 +0800 Message-ID: <20211102013829.42345-5-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 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 4/4] net/hns3: refactor multi-process initialization 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 Currently, the logic of the PF and VF initialization codes for multiple process is the same. A common function can be extracted to initialize and unload multiple process. Signed-off-by: Huisong Li Signed-off-by: Min Hu (Connor) --- drivers/net/hns3/hns3_ethdev.c | 34 +++++------------ drivers/net/hns3/hns3_ethdev_vf.c | 33 +++++----------- drivers/net/hns3/hns3_mp.c | 62 ++++++++++++++++++++++++------- drivers/net/hns3/hns3_mp.h | 6 +-- 4 files changed, 68 insertions(+), 67 deletions(-) diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c index 96ab0c4f6c..ccae75baa0 100644 --- a/drivers/net/hns3/hns3_ethdev.c +++ b/drivers/net/hns3/hns3_ethdev.c @@ -5850,8 +5850,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev) int ret = 0; if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); return 0; } @@ -5868,7 +5867,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev) hns3_uninit_pf(eth_dev); hns3_free_all_queues(eth_dev); rte_free(hw->reset.wait_data); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); hns3_warn(hw, "Close port %u finished", hw->data->port_id); return ret; @@ -7372,28 +7371,15 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) hns3_set_rxtx_function(eth_dev); eth_dev->dev_ops = &hns3_eth_dev_ops; eth_dev->rx_queue_count = hns3_rx_queue_count; + ret = hns3_mp_init(eth_dev); + if (ret) + goto err_mp_init; + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - 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; - } - __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - process_data.eth_dev_cnt++; hns3_tx_push_init(eth_dev); return 0; } - 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; - } - process_data.eth_dev_cnt++; - hw->adapter_state = HNS3_NIC_UNINITIALIZED; hns->is_vf = false; hw->data = eth_dev->data; @@ -7463,10 +7449,9 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) rte_free(hw->reset.wait_data); err_init_reset: - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); -err_mp_init_primary: -err_mp_init_secondary: +err_mp_init: eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->rx_descriptor_status = NULL; @@ -7485,8 +7470,7 @@ hns3_dev_uninit(struct rte_eth_dev *eth_dev) PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); return 0; } diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c index 633201a2c2..27701a919e 100644 --- a/drivers/net/hns3/hns3_ethdev_vf.c +++ b/drivers/net/hns3/hns3_ethdev_vf.c @@ -1893,8 +1893,7 @@ hns3vf_dev_close(struct rte_eth_dev *eth_dev) int ret = 0; if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); return 0; } @@ -1910,7 +1909,7 @@ hns3vf_dev_close(struct rte_eth_dev *eth_dev) hns3vf_uninit_vf(eth_dev); hns3_free_all_queues(eth_dev); rte_free(hw->reset.wait_data); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); hns3_warn(hw, "Close port %u finished", hw->data->port_id); return ret; @@ -2680,28 +2679,15 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) hns3_set_rxtx_function(eth_dev); eth_dev->dev_ops = &hns3vf_eth_dev_ops; eth_dev->rx_queue_count = hns3_rx_queue_count; + ret = hns3_mp_init(eth_dev); + if (ret) + goto err_mp_init; + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { - 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; - } - __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - process_data.eth_dev_cnt++; hns3_tx_push_init(eth_dev); return 0; } - 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; - } - process_data.eth_dev_cnt++; - hw->adapter_state = HNS3_NIC_UNINITIALIZED; hns->is_vf = true; hw->data = eth_dev->data; @@ -2769,10 +2755,9 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) rte_free(hw->reset.wait_data); err_init_reset: - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); -err_mp_init_primary: -err_mp_init_secondary: +err_mp_init: eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->rx_descriptor_status = NULL; @@ -2793,7 +2778,7 @@ hns3vf_dev_uninit(struct rte_eth_dev *eth_dev) if (rte_eal_process_type() != RTE_PROC_PRIMARY) { __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - hns3_mp_uninit(); + hns3_mp_uninit(eth_dev); return 0; } diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c index 6d33bf49cd..999b407f7d 100644 --- a/drivers/net/hns3/hns3_mp.c +++ b/drivers/net/hns3/hns3_mp.c @@ -13,7 +13,7 @@ #include "hns3_mp.h" /* local data for primary or secondary process. */ -struct hns3_process_local_data process_data; +static struct hns3_process_local_data process_data; /* * Initialize IPC message. @@ -227,7 +227,8 @@ hns3_mp_req_start_tx(struct rte_eth_dev *dev) /* * Initialize by primary process. */ -int hns3_mp_init_primary(void) +static int +hns3_mp_init_primary(void) { int ret; @@ -244,20 +245,11 @@ int hns3_mp_init_primary(void) return 0; } -void hns3_mp_uninit(void) -{ - process_data.eth_dev_cnt--; - - if (process_data.eth_dev_cnt == 0) { - rte_mp_action_unregister(HNS3_MP_NAME); - process_data.init_done = false; - } -} - /* * Initialize by secondary process. */ -int hns3_mp_init_secondary(void) +static int +hns3_mp_init_secondary(void) { int ret; @@ -265,10 +257,52 @@ int hns3_mp_init_secondary(void) return 0; ret = rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle); - if (ret) + if (ret && rte_errno != ENOTSUP) return ret; process_data.init_done = true; return 0; } + +int +hns3_mp_init(struct rte_eth_dev *dev) +{ + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + int ret; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + ret = hns3_mp_init_secondary(); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to init for secondary process, ret = %d", + ret); + return ret; + } + __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + } else { + ret = hns3_mp_init_primary(); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to init for primary process, ret = %d", + ret); + return ret; + } + } + + process_data.eth_dev_cnt++; + + return 0; +} + +void hns3_mp_uninit(struct rte_eth_dev *dev) +{ + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + + process_data.eth_dev_cnt--; + if (process_data.eth_dev_cnt == 0) { + rte_mp_action_unregister(HNS3_MP_NAME); + process_data.init_done = false; + } +} diff --git a/drivers/net/hns3/hns3_mp.h b/drivers/net/hns3/hns3_mp.h index 5738ab74a5..a74221d086 100644 --- a/drivers/net/hns3/hns3_mp.h +++ b/drivers/net/hns3/hns3_mp.h @@ -10,15 +10,13 @@ struct hns3_process_local_data { bool init_done; /* Process action register completed flag. */ int eth_dev_cnt; /* Ethdev count under the current process. */ }; -extern struct hns3_process_local_data process_data; 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_req_start_tx(struct rte_eth_dev *dev); void hns3_mp_req_stop_tx(struct rte_eth_dev *dev); -int hns3_mp_init_primary(void); -void hns3_mp_uninit(void); -int hns3_mp_init_secondary(void); +int hns3_mp_init(struct rte_eth_dev *dev); +void hns3_mp_uninit(struct rte_eth_dev *dev); #endif /* _HNS3_MP_H_ */