]> git.droids-corp.org - dpdk.git/commitdiff
devargs: introduce new parsing helper
authorGaetan Rivet <gaetan.rivet@6wind.com>
Fri, 7 Jul 2017 00:04:33 +0000 (02:04 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Sat, 8 Jul 2017 22:12:00 +0000 (00:12 +0200)
Introduce a more versatile helper to parse device strings. This
helper expects a generic rte_devargs structure as storage in order not
to require API changes in the future, should this structure be
updated.

The old equivalent function is thus being deprecated, as its API does
not allow to accompany rte_devargs evolutions.

A deprecation notice is issued.

This new helper will parse bus information as well as device name and
device parameters. It does not allocate an rte_devargs structure and
expects one to be given as input.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
doc/guides/rel_notes/deprecation.rst
lib/librte_eal/bsdapp/eal/rte_eal_version.map
lib/librte_eal/common/eal_common_devargs.c
lib/librte_eal/common/include/rte_devargs.h
lib/librte_eal/linuxapp/eal/rte_eal_version.map

index 68a1ccfd11d179ac09595f11b080aa55b45e7a53..257dcba3234ae750c3cdb00ce27379ceaad1e4b8 100644 (file)
@@ -59,3 +59,8 @@ Deprecation Notices
   The non-"do-sig" versions of the hash tables will be removed
   (including the ``signature_offset`` parameter)
   and the "do-sig" versions renamed accordingly.
+
+* eal: the following function is deprecated starting from 17.08 and will
+  be removed in 17.11:
+
+  - ``rte_eal_parse_devargs_str``, replaced by ``rte_eal_devargs_parse``
index 0295ea948a0f1c52124f12b3fe2210a5fdbe3413..381f895cd1163d3cf11d5a4b10135333ae491535 100644 (file)
@@ -206,6 +206,7 @@ DPDK_17.08 {
 EXPERIMENTAL {
        global:
 
+       rte_eal_devargs_parse;
        rte_eal_hotplug_add;
        rte_eal_hotplug_remove;
 
index f0c3291fbfd48d2fe9a9b5bde95eedd94dcd7034..49d43a32856336b4cb3adf68db0553f3c461c463 100644 (file)
@@ -83,49 +83,77 @@ bus_name_cmp(const struct rte_bus *bus, const void *name)
        return strncmp(bus->name, name, strlen(bus->name));
 }
 
-/* store a whitelist parameter for later parsing */
 int
-rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
+rte_eal_devargs_parse(const char *dev, struct rte_devargs *da)
 {
-       struct rte_devargs *devargs = NULL;
        struct rte_bus *bus = NULL;
-       char *dev = NULL;
        const char *devname;
-       int ret;
-
-       /* use malloc instead of rte_malloc as it's called early at init */
-       devargs = malloc(sizeof(*devargs));
-       if (devargs == NULL)
-               goto fail;
-
-       memset(devargs, 0, sizeof(*devargs));
-       devargs->type = devtype;
+       const size_t maxlen = sizeof(da->name);
+       size_t i;
 
-       if (rte_eal_parse_devargs_str(devargs_str, &dev, &devargs->args))
-               goto fail;
-       devname = dev;
+       if (dev == NULL || da == NULL)
+               return -EINVAL;
+       /* Retrieve eventual bus info */
        do {
+               devname = dev;
                bus = rte_bus_find(bus, bus_name_cmp, dev);
                if (bus == NULL)
                        break;
                devname = dev + strlen(bus->name) + 1;
                if (rte_bus_find_by_device_name(devname) == bus)
                        break;
-               devname = dev;
        } while (1);
+       /* Store device name */
+       i = 0;
+       while (devname[i] != '\0' && devname[i] != ',') {
+               da->name[i] = devname[i];
+               i++;
+               if (i == maxlen) {
+                       fprintf(stderr, "WARNING: Parsing \"%s\": device name should be shorter than %zu\n",
+                               dev, maxlen);
+                       da->name[i - 1] = '\0';
+                       return -EINVAL;
+               }
+       }
+       da->name[i] = '\0';
        if (bus == NULL) {
-               bus = rte_bus_find_by_device_name(devname);
+               bus = rte_bus_find_by_device_name(da->name);
                if (bus == NULL) {
-                       fprintf(stderr, "ERROR: failed to parse bus info from device declaration\n");
-                       goto fail;
+                       fprintf(stderr, "ERROR: failed to parse device \"%s\"\n",
+                               da->name);
+                       return -EFAULT;
                }
        }
-       devargs->bus = bus;
+       da->bus = bus;
+       /* Parse eventual device arguments */
+       if (devname[i] == ',')
+               da->args = strdup(&devname[i + 1]);
+       else
+               da->args = strdup("");
+       if (da->args == NULL) {
+               fprintf(stderr, "ERROR: not enough memory to parse arguments\n");
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+/* store a whitelist parameter for later parsing */
+int
+rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
+{
+       struct rte_devargs *devargs = NULL;
+       struct rte_bus *bus = NULL;
+       const char *dev = devargs_str;
 
-       /* save device name. */
-       ret = snprintf(devargs->name, sizeof(devargs->name), "%s", devname);
-       if (ret < 0 || ret >= (int)sizeof(devargs->name))
+       /* use calloc instead of rte_zmalloc as it's called early at init */
+       devargs = calloc(1, sizeof(*devargs));
+       if (devargs == NULL)
                goto fail;
+
+       if (rte_eal_devargs_parse(dev, devargs))
+               goto fail;
+       devargs->type = devtype;
+       bus = devargs->bus;
        if (devargs->type == RTE_DEVTYPE_WHITELISTED) {
                if (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) {
                        bus->conf.scan_mode = RTE_BUS_SCAN_WHITELIST;
@@ -142,12 +170,10 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
                }
        }
 
-       free(dev);
        TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
        return 0;
 
 fail:
-       free(dev);
        if (devargs) {
                free(devargs->args);
                free(devargs);
index a5c4a4ae562721c88b2c51715ff589c7c397f56f..a0427cd8a7d3bb149803fca1b69b39cbd75c5d71 100644 (file)
@@ -118,6 +118,26 @@ extern struct rte_devargs_list devargs_list;
 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.
+ *
+ * @param dev
+ *   The device declaration string.
+ * @param da
+ *   The devargs structure holding the device information.
+ *
+ * @return
+ *   - 0 on success.
+ *   - Negative errno on error.
+ */
+int
+rte_eal_devargs_parse(const char *dev,
+                     struct rte_devargs *da);
+
 /**
  * Add a device to the user device list
  *
index a118fb1600a1417e34e23039c523de435164d33b..0f9e009b602ae653df231de2a5c5ffc6aedeae4f 100644 (file)
@@ -211,6 +211,7 @@ DPDK_17.08 {
 EXPERIMENTAL {
        global:
 
+       rte_eal_devargs_parse;
        rte_eal_hotplug_add;
        rte_eal_hotplug_remove;