dpdk/0039-net-hns3-fix-double-free-for-Rx-Tx-queue.patch
Dengdui Huang dd30deb610 sync some patch from upstreaming
Sync some patchs from upstreaming for hns3 pmd and modifications
are as follow:
 - dma/hisilicon: remove support for HIP09 platform
 - net/hns3: disable SCTP verification tag for RSS hash input
 - net/hns3: fix variable overflow
 - net/hns3: fix double free for Rx/Tx queue
 - net/hns3: fix read Rx timestamp handle
 - net/hns3: fix offload flag of IEEE 1588
In addition, the following patch synchronizes the latest version
 - ethdev: fix strict aliasing lead to link cannot be up

Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
(cherry picked from commit 60fad33c2a49d948d5816889cb40f0184f826149)
2024-05-11 15:10:07 +08:00

68 lines
1.8 KiB
Diff

From 5f3efed4c06e8d68aa2089db660c4c23b21df291 Mon Sep 17 00:00:00 2001
From: Dengdui Huang <huangdengdui@huawei.com>
Date: Wed, 3 Apr 2024 18:16:21 +0800
Subject: [PATCH 39/42] net/hns3: fix double free for Rx/Tx queue
[ upstream commit 833a5beab5bfc16708ee9b53c83e2f221cd99f90 ]
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: stable@dpdk.org
Signed-off-by: Dengdui Huang <huangdengdui@huawei.com>
Signed-off-by: Jie Hai <haijie1@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 bba29a9..d43cc96 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.33.0