[v10,01/27] devargs: add non-variadic parsing function

Message ID 4dd95d07b484a671a2be5d65ad12a4212093ada8.1530791217.git.gaetan.rivet@6wind.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Device querying |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Gaëtan Rivet July 5, 2018, 11:48 a.m. UTC
  rte_devargs_parse becomes non-variadic,
rte_devargs_parsef becomes the variadic version, to be used to compose
device strings.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 drivers/net/failsafe/failsafe_args.c        |  2 +-
 drivers/net/failsafe/failsafe_eal.c         |  2 +-
 lib/librte_eal/common/eal_common_dev.c      |  4 +-
 lib/librte_eal/common/eal_common_devargs.c  | 42 ++++++++++++++++-----
 lib/librte_eal/common/include/rte_devargs.h | 40 +++++++++++++++++++-
 lib/librte_eal/rte_eal_version.map          |  1 +
 lib/librte_ethdev/rte_ethdev.c              |  2 +-
 7 files changed, 76 insertions(+), 17 deletions(-)
  

Comments

Thomas Monjalon July 5, 2018, 2:44 p.m. UTC | #1
05/07/2018 13:48, Gaetan Rivet:
> rte_devargs_parse becomes non-variadic,
> rte_devargs_parsef becomes the variadic version, to be used to compose
> device strings.
> 
> Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>

Acked-by: Thomas Monjalon <thomas@monjalon.net>
  
Shreyansh Jain July 11, 2018, 11:46 a.m. UTC | #2
On Thursday 05 July 2018 05:18 PM, Gaetan Rivet wrote:
> rte_devargs_parse becomes non-variadic,
> rte_devargs_parsef becomes the variadic version, to be used to compose
> device strings.
> 
> Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
> ---
>   drivers/net/failsafe/failsafe_args.c        |  2 +-
>   drivers/net/failsafe/failsafe_eal.c         |  2 +-
>   lib/librte_eal/common/eal_common_dev.c      |  4 +-
>   lib/librte_eal/common/eal_common_devargs.c  | 42 ++++++++++++++++-----
>   lib/librte_eal/common/include/rte_devargs.h | 40 +++++++++++++++++++-
>   lib/librte_eal/rte_eal_version.map          |  1 +
>   lib/librte_ethdev/rte_ethdev.c              |  2 +-
>   7 files changed, 76 insertions(+), 17 deletions(-)
> 

[...]

> +__rte_experimental
> +int
> +rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
> +{
> +	va_list ap;
> +	size_t len;
> +	char *dev;
> +
> +	if (da == NULL)
> +		return -EINVAL;
> +
> +	va_start(ap, format);
> +	len = vsnprintf(NULL, 0, format, ap);
> +	va_end(ap);
> +
> +	dev = calloc(1, len + 1);
> +	if (dev == NULL) {
> +		fprintf(stderr, "ERROR: not enough memory to parse device\n");

Should RTE_LOG be used here?

> +		return -ENOMEM;
> +	}
> +
> +	va_start(ap, format);
> +	vsnprintf(dev, len, format, ap);
> +	va_end(ap);
> +
> +	return rte_devargs_parse(da, dev);
> +}
> +
>   int __rte_experimental
>   rte_devargs_insert(struct rte_devargs *da)
>   {

[...]

Except the comment above:

Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
  
Gaëtan Rivet July 11, 2018, 12:01 p.m. UTC | #3
On Wed, Jul 11, 2018 at 05:16:15PM +0530, Shreyansh Jain wrote:
> On Thursday 05 July 2018 05:18 PM, Gaetan Rivet wrote:
> > rte_devargs_parse becomes non-variadic,
> > rte_devargs_parsef becomes the variadic version, to be used to compose
> > device strings.
> > 
> > Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
> > ---
> >   drivers/net/failsafe/failsafe_args.c        |  2 +-
> >   drivers/net/failsafe/failsafe_eal.c         |  2 +-
> >   lib/librte_eal/common/eal_common_dev.c      |  4 +-
> >   lib/librte_eal/common/eal_common_devargs.c  | 42 ++++++++++++++++-----
> >   lib/librte_eal/common/include/rte_devargs.h | 40 +++++++++++++++++++-
> >   lib/librte_eal/rte_eal_version.map          |  1 +
> >   lib/librte_ethdev/rte_ethdev.c              |  2 +-
> >   7 files changed, 76 insertions(+), 17 deletions(-)
> > 
> 
> [...]
> 
> > +__rte_experimental
> > +int
> > +rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
> > +{
> > +	va_list ap;
> > +	size_t len;
> > +	char *dev;
> > +
> > +	if (da == NULL)
> > +		return -EINVAL;
> > +
> > +	va_start(ap, format);
> > +	len = vsnprintf(NULL, 0, format, ap);
> > +	va_end(ap);
> > +
> > +	dev = calloc(1, len + 1);
> > +	if (dev == NULL) {
> > +		fprintf(stderr, "ERROR: not enough memory to parse device\n");
> 
> Should RTE_LOG be used here?
> 

Yes, actually, I think the whole rte_devargs should be changed to
RTE_LOG.

> > +		return -ENOMEM;
> > +	}
> > +
> > +	va_start(ap, format);
> > +	vsnprintf(dev, len, format, ap);
> > +	va_end(ap);
> > +
> > +	return rte_devargs_parse(da, dev);
> > +}
> > +
> >   int __rte_experimental
> >   rte_devargs_insert(struct rte_devargs *da)
> >   {
> 
> [...]
> 
> Except the comment above:
> 
> Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
  

Patch

diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c
index 2c002b164..626883ce2 100644
--- a/drivers/net/failsafe/failsafe_args.c
+++ b/drivers/net/failsafe/failsafe_args.c
@@ -63,7 +63,7 @@  fs_parse_device(struct sub_device *sdev, char *args)
 
 	d = &sdev->devargs;
 	DEBUG("%s", args);
-	ret = rte_devargs_parse(d, "%s", args);
+	ret = rte_devargs_parse(d, args);
 	if (ret) {
 		DEBUG("devargs parsing failed with code %d", ret);
 		return ret;
diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c
index 5672f3961..ce1633f13 100644
--- a/drivers/net/failsafe/failsafe_eal.c
+++ b/drivers/net/failsafe/failsafe_eal.c
@@ -86,7 +86,7 @@  fs_bus_init(struct rte_eth_dev *dev)
 			else
 				snprintf(devstr, sizeof(devstr), "%s",
 					 rte_eth_devices[pid].device->name);
-			ret = rte_devargs_parse(da, "%s", devstr);
+			ret = rte_devargs_parse(da, devstr);
 			if (ret) {
 				ERROR("Probed devargs parsing failed with code"
 				      " %d", ret);
diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c
index 61cb3b162..ce4b51469 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -138,8 +138,8 @@  int __rte_experimental rte_eal_hotplug_add(const char *busname, const char *devn
 	if (da == NULL)
 		return -ENOMEM;
 
-	ret = rte_devargs_parse(da, "%s:%s,%s",
-				    busname, devname, devargs);
+	ret = rte_devargs_parsef(da, "%s:%s,%s",
+				 busname, devname, devargs);
 	if (ret)
 		goto err_devarg;
 
diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c
index b0434158b..0a83beb94 100644
--- a/lib/librte_eal/common/eal_common_devargs.c
+++ b/lib/librte_eal/common/eal_common_devargs.c
@@ -62,24 +62,18 @@  bus_name_cmp(const struct rte_bus *bus, const void *name)
 	return strncmp(bus->name, name, strlen(bus->name));
 }
 
-int __rte_experimental
-rte_devargs_parse(struct rte_devargs *da, const char *format, ...)
+__rte_experimental
+int
+rte_devargs_parse(struct rte_devargs *da, const char *dev)
 {
 	struct rte_bus *bus = NULL;
-	va_list ap;
-	va_start(ap, format);
-	char dev[vsnprintf(NULL, 0, format, ap) + 1];
 	const char *devname;
 	const size_t maxlen = sizeof(da->name);
 	size_t i;
 
-	va_end(ap);
 	if (da == NULL)
 		return -EINVAL;
 
-	va_start(ap, format);
-	vsnprintf(dev, sizeof(dev), format, ap);
-	va_end(ap);
 	/* Retrieve eventual bus info */
 	do {
 		devname = dev;
@@ -124,6 +118,34 @@  rte_devargs_parse(struct rte_devargs *da, const char *format, ...)
 	return 0;
 }
 
+__rte_experimental
+int
+rte_devargs_parsef(struct rte_devargs *da, const char *format, ...)
+{
+	va_list ap;
+	size_t len;
+	char *dev;
+
+	if (da == NULL)
+		return -EINVAL;
+
+	va_start(ap, format);
+	len = vsnprintf(NULL, 0, format, ap);
+	va_end(ap);
+
+	dev = calloc(1, len + 1);
+	if (dev == NULL) {
+		fprintf(stderr, "ERROR: not enough memory to parse device\n");
+		return -ENOMEM;
+	}
+
+	va_start(ap, format);
+	vsnprintf(dev, len, format, ap);
+	va_end(ap);
+
+	return rte_devargs_parse(da, dev);
+}
+
 int __rte_experimental
 rte_devargs_insert(struct rte_devargs *da)
 {
@@ -150,7 +172,7 @@  rte_devargs_add(enum rte_devtype devtype, const char *devargs_str)
 	if (devargs == NULL)
 		goto fail;
 
-	if (rte_devargs_parse(devargs, "%s", dev))
+	if (rte_devargs_parse(devargs, dev))
 		goto fail;
 	devargs->type = devtype;
 	bus = devargs->bus;
diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h
index 58fbd90a2..6c3b6326b 100644
--- a/lib/librte_eal/common/include/rte_devargs.h
+++ b/lib/librte_eal/common/include/rte_devargs.h
@@ -89,6 +89,42 @@  __rte_deprecated
 int rte_eal_parse_devargs_str(const char *devargs_str,
 				char **drvname, char **drvargs);
 
+/**
+ * Parse a device string.
+ *
+ * Verify that a bus is capable of handling the device passed
+ * in argument. Store which bus will handle the device, its name
+ * and the eventual device parameters.
+ *
+ * The syntax is:
+ *
+ *     bus:device_identifier,arg1=val1,arg2=val2
+ *
+ * where "bus:" is the bus name followed by any character separator.
+ * The bus name is optional. If no bus name is specified, each bus
+ * will attempt to recognize the device identifier. The first one
+ * to succeed will be used.
+ *
+ * Examples:
+ *
+ *     pci:0000:05.00.0,arg=val
+ *     05.00.0,arg=val
+ *     vdev:net_ring0
+ *
+ * @param da
+ *   The devargs structure holding the device information.
+ *
+ * @param dev
+ *   String describing a device.
+ *
+ * @return
+ *   - 0 on success.
+ *   - Negative errno on error.
+ */
+__rte_experimental
+int
+rte_devargs_parse(struct rte_devargs *da, const char *dev);
+
 /**
  * Parse a device string.
  *
@@ -124,8 +160,8 @@  int rte_eal_parse_devargs_str(const char *devargs_str,
  */
 __rte_experimental
 int
-rte_devargs_parse(struct rte_devargs *da,
-		  const char *format, ...)
+rte_devargs_parsef(struct rte_devargs *da,
+		   const char *format, ...)
 __attribute__((format(printf, 2, 0)));
 
 /**
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index f7dd0e7bc..1c4db72fa 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -254,6 +254,7 @@  EXPERIMENTAL {
 	rte_devargs_insert;
 	rte_devargs_next;
 	rte_devargs_parse;
+	rte_devargs_parsef;
 	rte_devargs_remove;
 	rte_devargs_type_count;
 	rte_eal_cleanup;
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index a9977df97..cce20d9ae 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -654,7 +654,7 @@  rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
 	}
 
 	/* parse devargs */
-	if (rte_devargs_parse(&da, "%s", devargs))
+	if (rte_devargs_parse(&da, devargs))
 		goto err;
 
 	ret = rte_eal_hotplug_add(da.bus->name, da.name, da.args);