From: Dengdui Huang <huangdeng...@huawei.com> The Pointers to some resources on the Rx/Tx queue need to be set to NULL after free inside the hns3_rx/tx_queue_release(), as this function is called from multiple threads (reset thread, device config thread, etc), leading to double memory free error.
Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations") Cc: sta...@dpdk.org Signed-off-by: Dengdui Huang <huangdeng...@huawei.com> Signed-off-by: Jie Hai <haij...@huawei.com> --- drivers/net/hns3/hns3_rxtx.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c index 54bf724a0e6c..fbc5ef3225c5 100644 --- a/drivers/net/hns3/hns3_rxtx.c +++ b/drivers/net/hns3/hns3_rxtx.c @@ -86,9 +86,14 @@ hns3_rx_queue_release(void *queue) struct hns3_rx_queue *rxq = queue; if (rxq) { hns3_rx_queue_release_mbufs(rxq); - if (rxq->mz) + if (rxq->mz) { rte_memzone_free(rxq->mz); - rte_free(rxq->sw_ring); + rxq->mz = NULL; + } + if (rxq->sw_ring) { + rte_free(rxq->sw_ring); + rxq->sw_ring = NULL; + } rte_free(rxq); } } @@ -99,10 +104,18 @@ hns3_tx_queue_release(void *queue) struct hns3_tx_queue *txq = queue; if (txq) { hns3_tx_queue_release_mbufs(txq); - if (txq->mz) + if (txq->mz) { rte_memzone_free(txq->mz); - rte_free(txq->sw_ring); - rte_free(txq->free); + txq->mz = NULL; + } + if (txq->sw_ring) { + rte_free(txq->sw_ring); + txq->sw_ring = NULL; + } + if (txq->free) { + rte_free(txq->free); + txq->free = NULL; + } rte_free(txq); } } -- 2.30.0