All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xueming Li <xuemingl@nvidia.com>
To: Thomas Monjalon <thomas@monjalon.net>, Gaetan Rivet <gaetanr@nvidia.com>
Cc: dev@dpdk.org, xuemingl@nvidia.com, Asaf Penso <asafp@nvidia.com>,
	Wenzhuo Lu <wenzhuo.lu@intel.com>,
	Beilei Xing <beilei.xing@intel.com>,
	Bernard Iremonger <bernard.iremonger@intel.com>,
	Gaetan Rivet <grive@u256.net>,
	Anatoly Burakov <anatoly.burakov@intel.com>,
	Ray Kinsella <mdr@ashroe.eu>, Neil Horman <nhorman@tuxdriver.com>,
	Ferruh Yigit <ferruh.yigit@intel.com>,
	Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Subject: [dpdk-dev] [PATCH v5 1/5] devargs: unify scratch buffer storage
Date: Tue, 13 Apr 2021 03:14:08 +0000	[thread overview]
Message-ID: <1618283653-16510-2-git-send-email-xuemingl@nvidia.com> (raw)
In-Reply-To: <1618283653-16510-1-git-send-email-xuemingl@nvidia.com>
In-Reply-To: <1608304614-13908-2-git-send-email-xuemingl@nvidia.com>

In current design, legacy parser rte_devargs_parse() saved scratch
buffer to devargs.args while new parser rte_devargs_layers_parse() saved
to devargs.data. Code using devargs had to know the difference and
cleaned up memory accordingly - error prone.

This patch unifies scratch buffer to data field, introduces
rte_devargs_reset() function to wrap the memory clean up logic.

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Acked-by: Ray Kinsella <mdr@ashroe.eu>
Reviewed-by: Gaetan Rivet <grive@u256.net>
---
 app/test-pmd/config.c                        |  3 +-
 app/test-pmd/testpmd.c                       |  5 +--
 drivers/bus/vdev/vdev.c                      |  9 +++---
 drivers/net/failsafe/failsafe_args.c         |  3 +-
 drivers/net/failsafe/failsafe_eal.c          |  2 +-
 examples/multi_process/hotplug_mp/commands.c |  6 ++--
 lib/librte_eal/common/eal_common_dev.c       |  9 +++---
 lib/librte_eal/common/eal_common_devargs.c   | 34 +++++++++++---------
 lib/librte_eal/common/hotplug_mp.c           |  6 ++--
 lib/librte_eal/include/rte_devargs.h         | 18 ++++++++---
 lib/librte_eal/version.map                   |  1 +
 lib/librte_ethdev/rte_ethdev.c               |  8 ++---
 12 files changed, 58 insertions(+), 46 deletions(-)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index a5e82b7a97..a8bd664097 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -510,8 +510,6 @@ device_infos_display(const char *identifier)
 
 	if (rte_devargs_parsef(&da, "%s", identifier)) {
 		printf("cannot parse identifier\n");
-		if (da.args)
-			free(da.args);
 		return;
 	}
 
@@ -559,6 +557,7 @@ device_infos_display(const char *identifier)
 			}
 		}
 	};
+	rte_devargs_reset(&da);
 }
 
 void
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 96d2e0fcec..d4be23f8f8 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -3015,8 +3015,6 @@ detach_devargs(char *identifier)
 	memset(&da, 0, sizeof(da));
 	if (rte_devargs_parsef(&da, "%s", identifier)) {
 		printf("cannot parse identifier\n");
-		if (da.args)
-			free(da.args);
 		return;
 	}
 
@@ -3025,6 +3023,7 @@ detach_devargs(char *identifier)
 			if (ports[port_id].port_status != RTE_PORT_STOPPED) {
 				printf("Port %u not stopped\n", port_id);
 				rte_eth_iterator_cleanup(&iterator);
+				rte_devargs_reset(&da);
 				return;
 			}
 			port_flow_flush(port_id);
@@ -3034,6 +3033,7 @@ detach_devargs(char *identifier)
 	if (rte_eal_hotplug_remove(da.bus->name, da.name) != 0) {
 		TESTPMD_LOG(ERR, "Failed to detach device %s(%s)\n",
 			    da.name, da.bus->name);
+		rte_devargs_reset(&da);
 		return;
 	}
 
@@ -3042,6 +3042,7 @@ detach_devargs(char *identifier)
 	printf("Device %s is detached\n", identifier);
 	printf("Now total ports is %d\n", nb_ports);
 	printf("Done\n");
+	rte_devargs_reset(&da);
 }
 
 void
diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c
index 9a673347ae..d075409942 100644
--- a/drivers/bus/vdev/vdev.c
+++ b/drivers/bus/vdev/vdev.c
@@ -245,13 +245,14 @@ alloc_devargs(const char *name, const char *args)
 
 	devargs->bus = &rte_vdev_bus;
 	if (args)
-		devargs->args = strdup(args);
+		devargs->data = strdup(args);
 	else
-		devargs->args = strdup("");
+		devargs->data = strdup("");
+	devargs->args = devargs->data;
 
 	ret = strlcpy(devargs->name, name, sizeof(devargs->name));
 	if (ret < 0 || ret >= (int)sizeof(devargs->name)) {
-		free(devargs->args);
+		rte_devargs_reset(devargs);
 		free(devargs);
 		return NULL;
 	}
@@ -305,7 +306,7 @@ insert_vdev(const char *name, const char *args,
 
 	return 0;
 fail:
-	free(devargs->args);
+	rte_devargs_reset(devargs);
 	free(devargs);
 	free(dev);
 	return ret;
diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c
index 707490b94c..b203e02d9a 100644
--- a/drivers/net/failsafe/failsafe_args.c
+++ b/drivers/net/failsafe/failsafe_args.c
@@ -451,8 +451,7 @@ failsafe_args_free(struct rte_eth_dev *dev)
 		sdev->cmdline = NULL;
 		free(sdev->fd_str);
 		sdev->fd_str = NULL;
-		free(sdev->devargs.args);
-		sdev->devargs.args = NULL;
+		rte_devargs_reset(&sdev->devargs);
 	}
 }
 
diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c
index b9fc508673..cb4a2abc02 100644
--- a/drivers/net/failsafe/failsafe_eal.c
+++ b/drivers/net/failsafe/failsafe_eal.c
@@ -79,7 +79,7 @@ fs_bus_init(struct rte_eth_dev *dev)
 					rte_eth_devices[pid].device->devargs;
 
 			/* Take control of probed device. */
-			free(da->args);
+			rte_devargs_reset(da);
 			memset(da, 0, sizeof(*da));
 			if (probed_da != NULL)
 				snprintf(devstr, sizeof(devstr), "%s,%s",
diff --git a/examples/multi_process/hotplug_mp/commands.c b/examples/multi_process/hotplug_mp/commands.c
index a8a39d07f7..48fd329583 100644
--- a/examples/multi_process/hotplug_mp/commands.c
+++ b/examples/multi_process/hotplug_mp/commands.c
@@ -121,8 +121,6 @@ static void cmd_dev_attach_parsed(void *parsed_result,
 
 	if (rte_devargs_parsef(&da, "%s", res->devargs)) {
 		cmdline_printf(cl, "cannot parse devargs\n");
-		if (da.args)
-			free(da.args);
 		return;
 	}
 
@@ -131,6 +129,7 @@ static void cmd_dev_attach_parsed(void *parsed_result,
 	else
 		cmdline_printf(cl, "failed to attached device %s\n",
 				da.name);
+	rte_devargs_reset(&da);
 }
 
 cmdline_parse_token_string_t cmd_dev_attach_attach =
@@ -168,8 +167,6 @@ static void cmd_dev_detach_parsed(void *parsed_result,
 
 	if (rte_devargs_parsef(&da, "%s", res->devargs)) {
 		cmdline_printf(cl, "cannot parse devargs\n");
-		if (da.args)
-			free(da.args);
 		return;
 	}
 
@@ -180,6 +177,7 @@ static void cmd_dev_detach_parsed(void *parsed_result,
 	else
 		cmdline_printf(cl, "failed to dettach device %s\n",
 			da.name);
+	rte_devargs_reset(&da);
 }
 
 cmdline_parse_token_string_t cmd_dev_detach_detach =
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
index 8a3bd3100a..148a23830a 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -185,10 +185,8 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev)
 	return ret;
 
 err_devarg:
-	if (rte_devargs_remove(da) != 0) {
-		free(da->args);
-		free(da);
-	}
+	if (rte_devargs_remove(da) != 0)
+		rte_devargs_reset(da);
 	return ret;
 }
 
@@ -586,7 +584,8 @@ rte_dev_iterator_init(struct rte_dev_iterator *it,
 	it->bus_str = NULL;
 	it->cls_str = NULL;
 
-	devargs.data = dev_str;
+	/* Setting data field implies no malloc in parsing. */
+	devargs.data = (void *)(intptr_t)dev_str;
 	if (rte_devargs_layers_parse(&devargs, dev_str))
 		goto get_out;
 
diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c
index fcf3d9a3cc..48f85ee9c0 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -150,7 +150,7 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
 	 * their parsing afterward.
 	 */
 	if (devargs->data != devstr) {
-		char *s = (void *)(intptr_t)(devargs->data);
+		char *s = devargs->data;
 
 		while ((s = strchr(s, '/'))) {
 			*s = '\0';
@@ -219,13 +219,14 @@ rte_devargs_parse(struct rte_devargs *da, const char *dev)
 	da->bus = bus;
 	/* Parse eventual device arguments */
 	if (devname[i] == ',')
-		da->args = strdup(&devname[i + 1]);
+		da->data = strdup(&devname[i + 1]);
 	else
-		da->args = strdup("");
-	if (da->args == NULL) {
+		da->data = strdup("");
+	if (da->data == NULL) {
 		RTE_LOG(ERR, EAL, "not enough memory to parse arguments\n");
 		return -ENOMEM;
 	}
+	da->drv_str = da->data;
 	return 0;
 }
 
@@ -260,6 +261,16 @@ rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
 	return ret;
 }
 
+void
+rte_devargs_reset(struct rte_devargs *da)
+{
+	if (da == NULL)
+		return;
+	if (da->data)
+		free(da->data);
+	da->data = NULL;
+}
+
 int
 rte_devargs_insert(struct rte_devargs **da)
 {
@@ -276,15 +287,8 @@ rte_devargs_insert(struct rte_devargs **da)
 		if (strcmp(listed_da->bus->name, (*da)->bus->name) == 0 &&
 				strcmp(listed_da->name, (*da)->name) == 0) {
 			/* device already in devargs list, must be updated */
-			listed_da->type = (*da)->type;
-			listed_da->policy = (*da)->policy;
-			free(listed_da->args);
-			listed_da->args = (*da)->args;
-			listed_da->bus = (*da)->bus;
-			listed_da->cls = (*da)->cls;
-			listed_da->bus_str = (*da)->bus_str;
-			listed_da->cls_str = (*da)->cls_str;
-			listed_da->data = (*da)->data;
+			rte_devargs_reset(listed_da);
+			*listed_da = **da;
 			/* replace provided devargs with found one */
 			free(*da);
 			*da = listed_da;
@@ -326,7 +330,7 @@ rte_devargs_add(enum rte_devtype devtype, const char *devargs_str)
 
 fail:
 	if (devargs) {
-		free(devargs->args);
+		rte_devargs_reset(devargs);
 		free(devargs);
 	}
 
@@ -346,7 +350,7 @@ rte_devargs_remove(struct rte_devargs *devargs)
 		if (strcmp(d->bus->name, devargs->bus->name) == 0 &&
 		    strcmp(d->name, devargs->name) == 0) {
 			TAILQ_REMOVE(&devargs_list, d, next);
-			free(d->args);
+			rte_devargs_reset(d);
 			free(d);
 			return 0;
 		}
diff --git a/lib/librte_eal/common/hotplug_mp.c b/lib/librte_eal/common/hotplug_mp.c
index ee791903b3..ae6010e8f8 100644
--- a/lib/librte_eal/common/hotplug_mp.c
+++ b/lib/librte_eal/common/hotplug_mp.c
@@ -95,6 +95,7 @@ __handle_secondary_request(void *param)
 
 	tmp_req = *req;
 
+	memset(&da, 0, sizeof(da));
 	if (req->t == EAL_DEV_REQ_TYPE_ATTACH) {
 		ret = local_dev_probe(req->devargs, &dev);
 		if (ret != 0) {
@@ -118,8 +119,6 @@ __handle_secondary_request(void *param)
 		ret = rte_devargs_parse(&da, req->devargs);
 		if (ret != 0)
 			goto finish;
-		free(da.args); /* we don't need those */
-		da.args = NULL;
 
 		ret = eal_dev_hotplug_request_to_secondary(&tmp_req);
 		if (ret != 0) {
@@ -176,6 +175,7 @@ __handle_secondary_request(void *param)
 	if (ret)
 		RTE_LOG(ERR, EAL, "failed to send response to secondary\n");
 
+	rte_devargs_reset(&da);
 	free(bundle->peer);
 	free(bundle);
 }
@@ -283,7 +283,7 @@ static void __handle_primary_request(void *param)
 
 		ret = local_dev_remove(dev);
 quit:
-		free(da->args);
+		rte_devargs_reset(da);
 		free(da);
 		break;
 	default:
diff --git a/lib/librte_eal/include/rte_devargs.h b/lib/librte_eal/include/rte_devargs.h
index 296f19324f..134b44a887 100644
--- a/lib/librte_eal/include/rte_devargs.h
+++ b/lib/librte_eal/include/rte_devargs.h
@@ -60,16 +60,16 @@ struct rte_devargs {
 	/** Name of the device. */
 	char name[RTE_DEV_NAME_MAX_LEN];
 	RTE_STD_C11
-	union {
-	/** Arguments string as given by user or "" for no argument. */
-		char *args;
+	union { /**< driver-related part of device string. */
+		const char *args; /**< legacy name. */
 		const char *drv_str;
 	};
 	struct rte_bus *bus; /**< bus handle. */
 	struct rte_class *cls; /**< class handle. */
 	const char *bus_str; /**< bus-related part of device string. */
 	const char *cls_str; /**< class-related part of device string. */
-	const char *data; /**< Device string storage. */
+	char *data;
+	/**< Raw string including bus, class and driver arguments. */
 };
 
 /**
@@ -145,6 +145,16 @@ rte_devargs_parsef(struct rte_devargs *da,
 		   const char *format, ...)
 __rte_format_printf(2, 0);
 
+/**
+ * Free resources in devargs.
+ *
+ * @param da
+ *   The devargs structure holding the device information.
+ */
+__rte_experimental
+void
+rte_devargs_reset(struct rte_devargs *da);
+
 /**
  * Insert an rte_devargs in the global list.
  *
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index e7217ae288..fe5c3dac98 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -410,6 +410,7 @@ EXPERIMENTAL {
 	rte_power_pause; # WINDOWS_NO_EXPORT
 
 	# added in 21.05
+	rte_devargs_reset;
 	rte_intr_callback_unregister_sync;
 	rte_log_list_types;
 	rte_thread_key_create;
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 6b5cfd696d..0419500fc3 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -193,13 +193,14 @@ int
 rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 {
 	int ret;
-	struct rte_devargs devargs = {.args = NULL};
+	struct rte_devargs devargs;
 	const char *bus_param_key;
 	char *bus_str = NULL;
 	char *cls_str = NULL;
 	int str_size;
 
 	memset(iter, 0, sizeof(*iter));
+	memset(&devargs, 0, sizeof(devargs));
 
 	/*
 	 * The devargs string may use various syntaxes:
@@ -244,8 +245,6 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 		goto error;
 	}
 	iter->cls_str = cls_str;
-	free(devargs.args); /* allocated by rte_devargs_parse() */
-	devargs.args = NULL;
 
 	iter->bus = devargs.bus;
 	if (iter->bus->dev_iterate == NULL) {
@@ -278,13 +277,14 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
 
 end:
 	iter->cls = rte_class_find_by_name("eth");
+	rte_devargs_reset(&devargs);
 	return 0;
 
 error:
 	if (ret == -ENOTSUP)
 		RTE_ETHDEV_LOG(ERR, "Bus %s does not support iterating.\n",
 				iter->bus->name);
-	free(devargs.args);
+	rte_devargs_reset(&devargs);
 	free(bus_str);
 	free(cls_str);
 	return ret;
-- 
2.25.1


  parent reply	other threads:[~2021-04-13  3:14 UTC|newest]

Thread overview: 126+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-18 15:16 [dpdk-dev] [RFC 0/9] support global syntax Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 1/9] devargs: fix data buffer storage type Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 0/7] eal: support global syntax Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 1/7] devargs: fix data buffer storage type Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 2/7] devargs: fix memory leak on parsing error Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 3/7] devargs: fix memory leak in legacy parser Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 4/7] devargs: fix buffer data memory leak Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 5/7] kvargs: add get by key function Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 6/7] devargs: support new global device syntax Xueming Li
2021-01-08 14:54   ` [dpdk-dev] [PATCH v1 7/7] bus/pci: add new global device syntax support Xueming Li
2021-01-08 15:14   ` [dpdk-dev] [PATCH v1 0/2] mlx5: support global syntax Xueming Li
2021-01-08 15:14   ` [dpdk-dev] [PATCH v1 1/2] common/mlx5: support device " Xueming Li
2021-01-08 15:15   ` [dpdk-dev] [PATCH v1 2/2] net/mlx5: support new " Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 0/9] net/mlx5: support SubFunction representor Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 1/9] common/mlx5: update representor name parsing Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 2/9] net/mlx5: support representor of sub function Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 3/9] net/mlx5: revert setting bonding representor to first PF Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 4/9] net/mlx5: refactor bonding representor probe Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 5/9] net/mlx5: support representor from multiple PFs Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 6/9] net/mlx5: save bonding member ports information Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 7/9] " Xueming Li
2021-01-18 16:17     ` Slava Ovsiienko
2021-01-18 23:05       ` Xueming(Steven) Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 8/9] net/mlx5: fix setting VF default MAC through representor Xueming Li
2021-01-18 11:29   ` [dpdk-dev] [PATCH v3 9/9] net/mlx5: improve bonding xstats Xueming Li
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 0/5] eal: enable global device syntax Xueming Li
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 1/5] devargs: fix memory leak on parsing error Xueming Li
2021-03-18  9:12     ` Thomas Monjalon
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 2/5] devargs: refactor scratch buffer storage Xueming Li
2021-03-18  9:14     ` Thomas Monjalon
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 3/5] kvargs: add get by key function Xueming Li
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 4/5] devargs: parse name from global device syntax Xueming Li
2021-01-18 15:16   ` [dpdk-dev] [PATCH v2 5/5] devargs: enable global device syntax devargs Xueming Li
2021-01-18 15:26   ` [dpdk-dev] [PATCH v2 0/2] mlx5: support global device syntax Xueming Li
2021-09-20  8:07     ` Thomas Monjalon
2021-09-23  6:47       ` Xueming(Steven) Li
2021-09-23  6:45     ` [dpdk-dev] [PATCH v3] net/mlx5: support new " Xueming Li
2021-09-29 19:37       ` Thomas Monjalon
2021-01-18 15:26   ` [dpdk-dev] [PATCH v2 1/2] common/mlx5: support device global syntax Xueming Li
2021-04-05 10:54     ` Slava Ovsiienko
2021-04-08 12:24       ` Raslan Darawsheh
2021-04-08 14:04         ` Raslan Darawsheh
2021-04-08 14:08           ` Xueming(Steven) Li
2021-04-08 14:13             ` Raslan Darawsheh
2021-04-19  9:29               ` Raslan Darawsheh
2021-04-19 10:36                 ` Raslan Darawsheh
2021-01-18 15:26   ` [dpdk-dev] [PATCH v2 2/2] net/mlx5: support new global device syntax Xueming Li
2021-04-05 10:56     ` Slava Ovsiienko
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 0/8] net/mlx5: support SubFunction representor Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 1/8] common/mlx5: update representor name parsing Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 2/8] net/mlx5: support representor of sub function Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 3/8] net/mlx5: revert setting bonding representor to first PF Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 4/8] net/mlx5: refactor bonding representor probe Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 5/8] net/mlx5: support representor from multiple PFs Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 6/8] net/mlx5: save bonding member ports information Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 7/8] net/mlx5: fix setting VF default MAC through representor Xueming Li
2021-01-19  7:28   ` [dpdk-dev] [PATCH v4 8/8] net/mlx5: improve bonding xstats Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 0/9] net/mlx5: support SubFunction representor Xueming Li
2021-03-31  7:20     ` Raslan Darawsheh
2021-03-31  7:27       ` Xueming(Steven) Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 1/9] common/mlx5: sub-function representor port name parsing Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 2/9] net/mlx5: support representor of sub function Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 3/9] net/mlx5: revert setting bonding representor to first PF Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 4/9] net/mlx5: refactor bonding representor probe Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 5/9] net/mlx5: support list value of representor PF Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 6/9] net/mlx5: save bonding member ports information Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 7/9] net/mlx5: fix setting VF default MAC through representor Xueming Li
2021-03-31  7:46     ` Raslan Darawsheh
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 8/9] net/mlx5: improve xstats of bonding port Xueming Li
2021-03-28 13:48   ` [dpdk-dev] [PATCH v5 9/9] net/mlx5: probe host PF representor with SubFunction Xueming Li
2021-03-30  7:37     ` Slava Ovsiienko
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 0/5] eal: enable global device syntax by default Xueming Li
2021-03-31  8:23     ` Gaëtan Rivet
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 1/5] devargs: unify scratch buffer storage Xueming Li
2021-04-01  9:04     ` Kinsella, Ray
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 2/5] devargs: fix memory leak on parsing error Xueming Li
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 3/5] kvargs: add get by key function Xueming Li
2021-04-01  9:06     ` Kinsella, Ray
2021-04-01  9:10       ` Xueming(Steven) Li
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 4/5] bus: add device arguments name parsing API Xueming Li
2021-03-31 10:19     ` Thomas Monjalon
2021-04-01 15:13       ` Xueming(Steven) Li
2021-04-08 23:49         ` Thomas Monjalon
2021-03-30 12:15   ` [dpdk-dev] [PATCH v3 5/5] devargs: parse global device syntax Xueming Li
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 0/5] eal: enable global device syntax by default Xueming Li
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 1/5] devargs: unify scratch buffer storage Xueming Li
2021-04-10 19:59     ` Tal Shnaiderman
2021-04-12 12:07       ` Xueming(Steven) Li
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 2/5] devargs: fix memory leak on parsing error Xueming Li
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 3/5] kvargs: add get by key function Xueming Li
2021-04-12  6:52     ` Olivier Matz
2021-04-12 12:07       ` Xueming(Steven) Li
2021-04-12 21:18         ` Thomas Monjalon
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 4/5] bus: add device arguments name parsing API Xueming Li
2021-04-12 21:16     ` Thomas Monjalon
2021-04-12 23:37       ` Xueming(Steven) Li
2021-04-10 14:23   ` [dpdk-dev] [PATCH v4 5/5] devargs: parse global device syntax Xueming Li
2021-04-12 21:24     ` Thomas Monjalon
2021-04-12 23:47       ` Xueming(Steven) Li
2021-04-13  3:14   ` [dpdk-dev] [PATCH v5 0/5] eal: enable global device syntax by default Xueming Li
2021-04-14 19:49     ` Thomas Monjalon
2021-04-23 11:06       ` Kinsella, Ray
2021-04-23 11:39         ` Gaëtan Rivet
2021-04-23 12:35           ` Kinsella, Ray
2021-09-02 14:46       ` Thomas Monjalon
2021-04-13  3:14   ` Xueming Li [this message]
2021-04-16  7:00     ` [dpdk-dev] [PATCH v5 1/5] devargs: unify scratch buffer storage David Marchand
2021-04-16 12:32       ` Aaron Conole
2021-04-16 12:43         ` [dpdk-dev] [dpdklab] " Lincoln Lavoie
2021-04-16 12:58           ` Thomas Monjalon
2021-04-16 13:14             ` Lincoln Lavoie
2021-04-13  3:14   ` [dpdk-dev] [PATCH v5 2/5] devargs: fix memory leak on parsing error Xueming Li
2021-04-13  3:14   ` [dpdk-dev] [PATCH v5 3/5] kvargs: add get by key function Xueming Li
2021-04-13  3:14   ` [dpdk-dev] [PATCH v5 4/5] bus: add device arguments name parsing API Xueming Li
2021-04-13  3:14   ` [dpdk-dev] [PATCH v5 5/5] devargs: parse global device syntax Xueming Li
2021-09-28  8:29     ` David Marchand
2021-09-28  9:04       ` Thomas Monjalon
2021-10-03 10:51         ` Xueming(Steven) Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 2/9] devargs: fix memory leak on parsing error Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 3/9] devargs: fix memory leak in legacy parser Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 4/9] devargs: fix buffer data memory leak Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 5/9] kvargs: add get by key function Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 6/9] devargs: support new global device syntax Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 7/9] bus/pci: add new global device syntax support Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 8/9] common/mlx5: support device global syntax Xueming Li
2020-12-18 15:16 ` [dpdk-dev] [RFC 9/9] net/mlx5: support new " Xueming Li

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=1618283653-16510-2-git-send-email-xuemingl@nvidia.com \
    --to=xuemingl@nvidia.com \
    --cc=anatoly.burakov@intel.com \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=asafp@nvidia.com \
    --cc=beilei.xing@intel.com \
    --cc=bernard.iremonger@intel.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=gaetanr@nvidia.com \
    --cc=grive@u256.net \
    --cc=mdr@ashroe.eu \
    --cc=nhorman@tuxdriver.com \
    --cc=thomas@monjalon.net \
    --cc=wenzhuo.lu@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.