[v2] net/pcap: solve pcap resource leakage when port probe

Message ID 20210830030108.3367-1-chenqiming_huawei@163.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series [v2] net/pcap: solve pcap resource leakage when port probe |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/github-robot: build success github build: passed
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-aarch64-unit-testing fail Testing issues
ci/iol-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS

Commit Message

Qiming Chen Aug. 30, 2021, 3:01 a.m. UTC
  When the port is probed, if the eth_from_pcaps function fails, the
previously opened pcap resources are not released, causing resource
leakage.

The patch solves the problem of resource leakage caused by abnormal
branch exit during the port probe process.

Signed-off-by: Qiming Chen <chenqiming_huawei@163.com>
---
v2:
  Clear coding style warning.
---
 drivers/net/pcap/pcap_ethdev.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
  

Comments

Ferruh Yigit Sept. 9, 2021, 1:02 p.m. UTC | #1
On 8/30/2021 4:01 AM, Qiming Chen wrote:
> When the port is probed, if the eth_from_pcaps function fails, the
> previously opened pcap resources are not released, causing resource
> leakage.
> 
> The patch solves the problem of resource leakage caused by abnormal
> branch exit during the port probe process.
> 
> Signed-off-by: Qiming Chen <chenqiming_huawei@163.com>

Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>

This seems missing from the begging of the PMD, need to following to commit log:
	Fixes: 4c173302c307 ("pcap: add new driver")
	Cc: stable@dpdk.org


Also we use 'fix' as almost like keyword, so please prefer 'fix' against 'solve'
next time, I will update while merging.

Applied to dpdk-next-net/main, thanks.
  

Patch

diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c
index fdc74313d5..4756eecda8 100644
--- a/drivers/net/pcap/pcap_ethdev.c
+++ b/drivers/net/pcap/pcap_ethdev.c
@@ -1410,6 +1410,33 @@  eth_from_pcaps(struct rte_vdev_device *vdev,
 	return 0;
 }
 
+static void
+eth_release_pcaps(struct pmd_devargs *pcaps,
+		struct pmd_devargs *dumpers,
+		int single_iface)
+{
+	unsigned int i;
+
+	if (single_iface) {
+		if (pcaps->queue[0].pcap)
+			pcap_close(pcaps->queue[0].pcap);
+		return;
+	}
+
+	for (i = 0; i < dumpers->num_of_queue; i++) {
+		if (dumpers->queue[i].dumper)
+			pcap_dump_close(dumpers->queue[i].dumper);
+
+		if (dumpers->queue[i].pcap)
+			pcap_close(dumpers->queue[i].pcap);
+	}
+
+	for (i = 0; i < pcaps->num_of_queue; i++) {
+		if (pcaps->queue[i].pcap)
+			pcap_close(pcaps->queue[i].pcap);
+	}
+}
+
 static int
 pmd_pcap_probe(struct rte_vdev_device *dev)
 {
@@ -1639,6 +1666,9 @@  pmd_pcap_probe(struct rte_vdev_device *dev)
 free_kvlist:
 	rte_kvargs_free(kvlist);
 
+	if (ret < 0)
+		eth_release_pcaps(&pcaps, &dumpers, devargs_all.single_iface);
+
 	return ret;
 }