devargs: add non-variadic parsing function

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: Shreyansh Jain <shreyansh.jain@nxp.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
This commit is contained in:
Gaetan Rivet 2018-07-11 23:44:52 +02:00 committed by Thomas Monjalon
parent 0436120e33
commit a23bc2c4e0
7 changed files with 76 additions and 17 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -63,24 +63,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;
@ -125,6 +119,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) {
RTE_LOG(ERR, EAL, "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)
{
@ -151,7 +173,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;

View File

@ -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)));
/**

View File

@ -264,6 +264,7 @@ EXPERIMENTAL {
rte_devargs_insert;
rte_devargs_next;
rte_devargs_parse;
rte_devargs_parsef;
rte_devargs_remove;
rte_devargs_type_count;
rte_eal_cleanup;

View File

@ -658,7 +658,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);