patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Kevin Traynor <ktraynor@redhat.com>
To: Wei Huang <wei.huang@intel.com>
Cc: Tianfei Zhang <tianfei.zhang@intel.com>,
	Rosen Xu <rosen.xu@intel.com>, dpdk stable <stable@dpdk.org>
Subject: patch 'raw/ifpga: remove virtual devices on close' has been queued to stable release 21.11.2
Date: Mon, 20 Jun 2022 10:47:34 +0100	[thread overview]
Message-ID: <20220620094752.1027299-1-ktraynor@redhat.com> (raw)

Hi,

FYI, your patch has been queued to stable release 21.11.2

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 06/23/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/56e6acc152ee763d61ca3b018c46bc23a542710a

Thanks.

Kevin

---
From 56e6acc152ee763d61ca3b018c46bc23a542710a Mon Sep 17 00:00:00 2001
From: Wei Huang <wei.huang@intel.com>
Date: Tue, 7 Jun 2022 05:07:21 -0400
Subject: [PATCH] raw/ifpga: remove virtual devices on close

[ upstream commit ae835aba40349ee9631ef6b52e68a2893febe7e0 ]

Virtual devices created on ifpga raw device will not be removed
when ifpga device has closed. To avoid resource leak problem,
this patch introduces an ifpga virtual device remove function,
virtual devices will be destroyed after the ifpga raw device closed.

Fixes: ef1e8ede3da5 ("raw/ifpga: add Intel FPGA bus rawdev driver")

Signed-off-by: Wei Huang <wei.huang@intel.com>
Acked-by: Tianfei Zhang <tianfei.zhang@intel.com>
Reviewed-by: Rosen Xu <rosen.xu@intel.com>
---
 drivers/raw/ifpga/ifpga_rawdev.c | 176 +++++++++++++++++++++++--------
 drivers/raw/ifpga/ifpga_rawdev.h |   8 ++
 2 files changed, 142 insertions(+), 42 deletions(-)

diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c
index 75800aed3a..b456feac9a 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.c
+++ b/drivers/raw/ifpga/ifpga_rawdev.c
@@ -135,4 +135,6 @@ ifpga_rawdev_allocate(struct rte_rawdev *rawdev)
 		dev->intr_handle[i] = NULL;
 	dev->poll_enabled = 0;
+	for (i = 0; i < IFPGA_MAX_VDEV; i++)
+		dev->vdev_name[i] = NULL;
 
 	return dev;
@@ -737,8 +739,20 @@ static int
 ifpga_rawdev_close(struct rte_rawdev *dev)
 {
+	struct ifpga_rawdev *ifpga_rdev = NULL;
 	struct opae_adapter *adapter;
+	char *vdev_name = NULL;
+	int i = 0;
 
 	if (dev) {
-		ifpga_monitor_stop_func(ifpga_rawdev_get(dev));
+		ifpga_rdev = ifpga_rawdev_get(dev);
+		if (ifpga_rdev) {
+			for (i = 0; i < IFPGA_MAX_VDEV; i++) {
+				vdev_name = ifpga_rdev->vdev_name[i];
+				if (vdev_name)
+					rte_vdev_uninit(vdev_name);
+			}
+			ifpga_monitor_stop_func(ifpga_rdev);
+			ifpga_rdev->rawdev = NULL;
+		}
 		adapter = ifpga_rawdev_get_priv(dev);
 		if (adapter) {
@@ -1640,6 +1654,4 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev)
 	}
 	dev = ifpga_rawdev_get(rawdev);
-	if (dev)
-		dev->rawdev = NULL;
 
 	adapter = ifpga_rawdev_get_priv(rawdev);
@@ -1716,73 +1728,116 @@ static int ifpga_rawdev_get_string_arg(const char *key __rte_unused,
 	return 0;
 }
+
 static int
-ifpga_cfg_probe(struct rte_vdev_device *dev)
+ifpga_vdev_parse_devargs(struct rte_devargs *devargs,
+	struct ifpga_vdev_args *args)
 {
-	struct rte_devargs *devargs;
-	struct rte_kvargs *kvlist = NULL;
-	struct rte_rawdev *rawdev = NULL;
-	struct ifpga_rawdev *ifpga_dev;
-	int port;
+	struct rte_kvargs *kvlist;
 	char *name = NULL;
-	char dev_name[RTE_RAWDEV_NAME_MAX_LEN];
-	int ret = -1;
+	int port = 0;
+	int ret = -EINVAL;
 
-	devargs = dev->device.devargs;
+	if (!devargs || !args)
+		return ret;
 
 	kvlist = rte_kvargs_parse(devargs->args, valid_args);
 	if (!kvlist) {
-		IFPGA_RAWDEV_PMD_LOG(ERR, "error when parsing param");
-		goto end;
+		IFPGA_RAWDEV_PMD_ERR("error when parsing devargs");
+		return ret;
 	}
 
 	if (rte_kvargs_count(kvlist, IFPGA_ARG_NAME) == 1) {
 		if (rte_kvargs_process(kvlist, IFPGA_ARG_NAME,
-				       &ifpga_rawdev_get_string_arg,
-				       &name) < 0) {
+			&ifpga_rawdev_get_string_arg, &name) < 0) {
 			IFPGA_RAWDEV_PMD_ERR("error to parse %s",
-				     IFPGA_ARG_NAME);
+				IFPGA_ARG_NAME);
 			goto end;
+		} else {
+			strlcpy(args->bdf, name, sizeof(args->bdf));
+			rte_free(name);
 		}
 	} else {
 		IFPGA_RAWDEV_PMD_ERR("arg %s is mandatory for ifpga bus",
-			  IFPGA_ARG_NAME);
+			IFPGA_ARG_NAME);
 		goto end;
 	}
 
 	if (rte_kvargs_count(kvlist, IFPGA_ARG_PORT) == 1) {
-		if (rte_kvargs_process(kvlist,
-			IFPGA_ARG_PORT,
-			&rte_ifpga_get_integer32_arg,
-			&port) < 0) {
+		if (rte_kvargs_process(kvlist, IFPGA_ARG_PORT,
+			&rte_ifpga_get_integer32_arg, &port) < 0) {
 			IFPGA_RAWDEV_PMD_ERR("error to parse %s",
 				IFPGA_ARG_PORT);
 			goto end;
+		} else {
+			args->port = port;
 		}
 	} else {
 		IFPGA_RAWDEV_PMD_ERR("arg %s is mandatory for ifpga bus",
-			  IFPGA_ARG_PORT);
+			IFPGA_ARG_PORT);
 		goto end;
 	}
 
-	memset(dev_name, 0, sizeof(dev_name));
-	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", name);
-	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
-	if (!rawdev)
-		goto end;
-	ifpga_dev = ifpga_rawdev_get(rawdev);
-	if (!ifpga_dev)
-		goto end;
+	ret = 0;
 
-	memset(dev_name, 0, sizeof(dev_name));
-	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
-	port, name);
-
-	ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME),
-			dev_name, devargs->args);
 end:
 	if (kvlist)
 		rte_kvargs_free(kvlist);
-	if (name)
-		free(name);
+
+	return ret;
+}
+
+static int
+ifpga_cfg_probe(struct rte_vdev_device *vdev)
+{
+	struct rte_rawdev *rawdev = NULL;
+	struct ifpga_rawdev *ifpga_dev;
+	struct ifpga_vdev_args args;
+	char dev_name[RTE_RAWDEV_NAME_MAX_LEN];
+	const char *vdev_name = NULL;
+	int i, n, ret = 0;
+
+	vdev_name = rte_vdev_device_name(vdev);
+	if (!vdev_name)
+		return -EINVAL;
+
+	IFPGA_RAWDEV_PMD_INFO("probe ifpga virtual device %s", vdev_name);
+
+	ret = ifpga_vdev_parse_devargs(vdev->device.devargs, &args);
+	if (ret)
+		return ret;
+
+	memset(dev_name, 0, sizeof(dev_name));
+	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", args.bdf);
+	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
+	if (!rawdev)
+		return -ENODEV;
+	ifpga_dev = ifpga_rawdev_get(rawdev);
+	if (!ifpga_dev)
+		return -ENODEV;
+
+	for (i = 0; i < IFPGA_MAX_VDEV; i++) {
+		if (ifpga_dev->vdev_name[i] == NULL) {
+			n = strlen(vdev_name) + 1;
+			ifpga_dev->vdev_name[i] = rte_malloc(NULL, n, 0);
+			if (ifpga_dev->vdev_name[i] == NULL)
+				return -ENOMEM;
+			strlcpy(ifpga_dev->vdev_name[i], vdev_name, n);
+			break;
+		}
+	}
+
+	if (i >= IFPGA_MAX_VDEV) {
+		IFPGA_RAWDEV_PMD_ERR("Can't create more virtual device!");
+		return -ENOENT;
+	}
+
+	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
+		args.port, args.bdf);
+	ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME),
+			dev_name, vdev->device.devargs->args);
+	if (ret) {
+		rte_free(ifpga_dev->vdev_name[i]);
+		ifpga_dev->vdev_name[i] = NULL;
+	}
 
 	return ret;
@@ -1792,8 +1847,45 @@ static int
 ifpga_cfg_remove(struct rte_vdev_device *vdev)
 {
-	IFPGA_RAWDEV_PMD_INFO("Remove ifpga_cfg %p",
-		vdev);
+	struct rte_rawdev *rawdev = NULL;
+	struct ifpga_rawdev *ifpga_dev;
+	struct ifpga_vdev_args args;
+	char dev_name[RTE_RAWDEV_NAME_MAX_LEN];
+	const char *vdev_name = NULL;
+	char *tmp_vdev = NULL;
+	int i, ret = 0;
 
-	return 0;
+	vdev_name = rte_vdev_device_name(vdev);
+	if (!vdev_name)
+		return -EINVAL;
+
+	IFPGA_RAWDEV_PMD_INFO("remove ifpga virtual device %s", vdev_name);
+
+	ret = ifpga_vdev_parse_devargs(vdev->device.devargs, &args);
+	if (ret)
+		return ret;
+
+	memset(dev_name, 0, sizeof(dev_name));
+	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", args.bdf);
+	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
+	if (!rawdev)
+		return -ENODEV;
+	ifpga_dev = ifpga_rawdev_get(rawdev);
+	if (!ifpga_dev)
+		return -ENODEV;
+
+	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
+		args.port, args.bdf);
+	ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME), dev_name);
+
+	for (i = 0; i < IFPGA_MAX_VDEV; i++) {
+		tmp_vdev = ifpga_dev->vdev_name[i];
+		if (tmp_vdev && !strcmp(tmp_vdev, vdev_name)) {
+			free(tmp_vdev);
+			ifpga_dev->vdev_name[i] = NULL;
+			break;
+		}
+	}
+
+	return ret;
 }
 
diff --git a/drivers/raw/ifpga/ifpga_rawdev.h b/drivers/raw/ifpga/ifpga_rawdev.h
index 857b73463d..4c191190ca 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.h
+++ b/drivers/raw/ifpga/ifpga_rawdev.h
@@ -51,4 +51,5 @@ ifpga_rawdev_get_priv(const struct rte_rawdev *rawdev)
 #define IFPGA_RAWDEV_MSIX_IRQ_NUM 7
 #define IFPGA_RAWDEV_NUM 32
+#define IFPGA_MAX_VDEV 4
 #define IFPGA_MAX_IRQ 12
 
@@ -65,4 +66,11 @@ struct ifpga_rawdev {
 	/* enable monitor thread poll device's sensors or not */
 	int poll_enabled;
+	/* name of virtual devices created on raw device */
+	char *vdev_name[IFPGA_MAX_VDEV];
+};
+
+struct ifpga_vdev_args {
+	char bdf[PCI_PRI_STR_SIZE];
+	int port;
 };
 
-- 
2.34.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-06-20 10:46:27.816736077 +0100
+++ 0001-raw-ifpga-remove-virtual-devices-on-close.patch	2022-06-20 10:46:27.760146785 +0100
@@ -1 +1 @@
-From ae835aba40349ee9631ef6b52e68a2893febe7e0 Mon Sep 17 00:00:00 2001
+From 56e6acc152ee763d61ca3b018c46bc23a542710a Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit ae835aba40349ee9631ef6b52e68a2893febe7e0 ]
+
@@ -12 +13,0 @@
-Cc: stable@dpdk.org
@@ -18 +19 @@
- drivers/raw/ifpga/ifpga_rawdev.c | 166 ++++++++++++++++++++++++-------
+ drivers/raw/ifpga/ifpga_rawdev.c | 176 +++++++++++++++++++++++--------
@@ -20 +21 @@
- 2 files changed, 138 insertions(+), 36 deletions(-)
+ 2 files changed, 142 insertions(+), 42 deletions(-)
@@ -23 +24 @@
-index 6d4117c5e8..fe3fc43abe 100644
+index 75800aed3a..b456feac9a 100644
@@ -55 +56 @@
-@@ -1639,6 +1653,4 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev)
+@@ -1640,6 +1654,4 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev)
@@ -62 +63 @@
-@@ -1715,71 +1727,116 @@ static int ifpga_rawdev_get_string_arg(const char *key __rte_unused,
+@@ -1716,73 +1728,116 @@ static int ifpga_rawdev_get_string_arg(const char *key __rte_unused,
@@ -134,0 +136,8 @@
+-	memset(dev_name, 0, sizeof(dev_name));
+-	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", name);
+-	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
+-	if (!rawdev)
+-		goto end;
+-	ifpga_dev = ifpga_rawdev_get(rawdev);
+-	if (!ifpga_dev)
+-		goto end;
@@ -136,4 +145,12 @@
-+
-+end:
-+	if (kvlist)
-+		rte_kvargs_free(kvlist);
+ 
+-	memset(dev_name, 0, sizeof(dev_name));
+-	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
+-	port, name);
+-
+-	ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME),
+-			dev_name, devargs->args);
+ end:
+ 	if (kvlist)
+ 		rte_kvargs_free(kvlist);
+-	if (name)
+-		free(name);
@@ -164,2 +181 @@
- 	memset(dev_name, 0, sizeof(dev_name));
--	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", name);
++	memset(dev_name, 0, sizeof(dev_name));
@@ -167,3 +183,2 @@
- 	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
- 	if (!rawdev)
--		goto end;
++	rawdev = rte_rawdev_pmd_get_named_dev(dev_name);
++	if (!rawdev)
@@ -171,3 +186,2 @@
- 	ifpga_dev = ifpga_rawdev_get(rawdev);
- 	if (!ifpga_dev)
--		goto end;
++	ifpga_dev = ifpga_rawdev_get(rawdev);
++	if (!ifpga_dev)
@@ -191,5 +205,2 @@
- 
--	memset(dev_name, 0, sizeof(dev_name));
- 	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
--	port, name);
--
++
++	snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s",
@@ -197,5 +208 @@
- 	ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME),
--			dev_name, devargs->args);
--end:
--	rte_kvargs_free(kvlist);
--	free(name);
++	ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME),
@@ -209 +216 @@
-@@ -1789,8 +1846,45 @@ static int
+@@ -1792,8 +1847,45 @@ static int


             reply	other threads:[~2022-06-20  9:48 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-20  9:47 Kevin Traynor [this message]
2022-06-20  9:47 ` patch 'raw/ifpga: unregister interrupt " Kevin Traynor
2022-06-20  9:47 ` patch 'bus/fslmc: fix VFIO setup' " Kevin Traynor
2022-06-20  9:47 ` patch 'doc: fix formatting and link in BPF library guide' " Kevin Traynor
2022-06-20  9:47 ` patch 'dma/idxd: fix error code for PCI device commands' " Kevin Traynor
2022-06-20  9:47 ` patch 'app/testpmd: fix packet segment allocation' " Kevin Traynor
2022-06-20  9:47 ` patch 'app/testpmd: fix multicast address pool leak' " Kevin Traynor
2022-06-20  9:47 ` patch 'net/failsafe: fix device freeing' " Kevin Traynor
2022-06-20  9:47 ` patch 'net/tap: " Kevin Traynor
2022-06-20  9:47 ` patch 'kni: use dedicated function to set random MAC address' " Kevin Traynor
2022-06-20  9:47 ` patch 'kni: use dedicated function to set " Kevin Traynor
2022-06-20  9:47 ` patch 'crypto/ipsec_mb: fix build with GCC 12' " Kevin Traynor
2022-06-20  9:47 ` patch 'net/ena: " Kevin Traynor
2022-06-20  9:47 ` patch 'net/enetfec: " Kevin Traynor
2022-06-20  9:47 ` patch 'net/ice: " Kevin Traynor
2022-06-20  9:47 ` patch 'vdpa/ifc: " Kevin Traynor
2022-06-20  9:47 ` patch 'app/flow-perf: " Kevin Traynor
2022-06-20  9:47 ` patch 'dma/skeleton: fix index returned when no memcpy completed' " Kevin Traynor
2022-06-20  9:47 ` patch 'dma/hisilicon: fix includes in header file' " Kevin Traynor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220620094752.1027299-1-ktraynor@redhat.com \
    --to=ktraynor@redhat.com \
    --cc=rosen.xu@intel.com \
    --cc=stable@dpdk.org \
    --cc=tianfei.zhang@intel.com \
    --cc=wei.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).