* [dpdk-dev] [PATCH 1/4] net/hns3: decrease the count when secondary process exits
2021-11-02 1:38 [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Min Hu (Connor)
@ 2021-11-02 1:38 ` Min Hu (Connor)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 2/4] net/hns3: fix MP action register and unregister Min Hu (Connor)
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Min Hu (Connor) @ 2021-11-02 1:38 UTC (permalink / raw)
To: dev; +Cc: ferruh.yigit, thomas
From: Huisong Li <lihuisong@huawei.com>
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 | 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
^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 2/4] net/hns3: fix MP action register and unregister
2021-11-02 1:38 [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Min Hu (Connor)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 1/4] net/hns3: decrease the count when secondary process exits Min Hu (Connor)
@ 2021-11-02 1:38 ` Min Hu (Connor)
2021-11-04 14:22 ` Ferruh Yigit
2021-11-02 1:38 ` [dpdk-dev] [PATCH 3/4] net/hns3: fix lack of unregistering MP action for secondary Min Hu (Connor)
` (2 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Min Hu (Connor) @ 2021-11-02 1:38 UTC (permalink / raw)
To: dev; +Cc: ferruh.yigit, thomas
From: Huisong Li <lihuisong@huawei.com>
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 <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
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);
--
2.33.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev] [PATCH 2/4] net/hns3: fix MP action register and unregister
2021-11-02 1:38 ` [dpdk-dev] [PATCH 2/4] net/hns3: fix MP action register and unregister Min Hu (Connor)
@ 2021-11-04 14:22 ` Ferruh Yigit
0 siblings, 0 replies; 7+ messages in thread
From: Ferruh Yigit @ 2021-11-04 14:22 UTC (permalink / raw)
To: Min Hu (Connor), dev; +Cc: thomas
On 11/2/2021 1:38 AM, Min Hu (Connor) wrote:
> From: Huisong Li <lihuisong@huawei.com>
>
> 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 <lihuisong@huawei.com>
> Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
<...>
> @@ -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;
>
I was here to complain about non-static global variable that doesn't have
driver namespace ('hns3_'), but I can see later patches are converting
this variable to a static global, so I guess it is OK to have it temporarily.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 3/4] net/hns3: fix lack of unregistering MP action for secondary
2021-11-02 1:38 [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Min Hu (Connor)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 1/4] net/hns3: decrease the count when secondary process exits Min Hu (Connor)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 2/4] net/hns3: fix MP action register and unregister Min Hu (Connor)
@ 2021-11-02 1:38 ` Min Hu (Connor)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 4/4] net/hns3: refactor multi-process initialization Min Hu (Connor)
2021-11-04 14:22 ` [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Ferruh Yigit
4 siblings, 0 replies; 7+ messages in thread
From: Min Hu (Connor) @ 2021-11-02 1:38 UTC (permalink / raw)
To: dev; +Cc: ferruh.yigit, thomas
From: Huisong Li <lihuisong@huawei.com>
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 <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
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_ */
--
2.33.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [dpdk-dev] [PATCH 4/4] net/hns3: refactor multi-process initialization
2021-11-02 1:38 [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Min Hu (Connor)
` (2 preceding siblings ...)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 3/4] net/hns3: fix lack of unregistering MP action for secondary Min Hu (Connor)
@ 2021-11-02 1:38 ` Min Hu (Connor)
2021-11-04 14:22 ` [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Ferruh Yigit
4 siblings, 0 replies; 7+ messages in thread
From: Min Hu (Connor) @ 2021-11-02 1:38 UTC (permalink / raw)
To: dev; +Cc: ferruh.yigit, thomas
From: Huisong Li <lihuisong@huawei.com>
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 <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
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_ */
--
2.33.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD
2021-11-02 1:38 [dpdk-dev] [PATCH 0/4] bugfix for multi process of hns3 PMD Min Hu (Connor)
` (3 preceding siblings ...)
2021-11-02 1:38 ` [dpdk-dev] [PATCH 4/4] net/hns3: refactor multi-process initialization Min Hu (Connor)
@ 2021-11-04 14:22 ` Ferruh Yigit
4 siblings, 0 replies; 7+ messages in thread
From: Ferruh Yigit @ 2021-11-04 14:22 UTC (permalink / raw)
To: Min Hu (Connor), dev; +Cc: thomas
On 11/2/2021 1:38 AM, Min Hu (Connor) wrote:
> This patch set contains bugfix and code optimization for multi
> process of hns3 PMD.
>
> Huisong Li (4):
> net/hns3: decrease the count when secondary process exits
> net/hns3: fix MP action register and unregister
> net/hns3: fix lack of unregistering MP action for secondary
> net/hns3: refactor multi-process initialization
>
Series applied to dpdk-next-net/main, thanks.
^ permalink raw reply [flat|nested] 7+ messages in thread