net/virtio: fix incorrect cast of void *
[dpdk.git] / lib / librte_eal / common / eal_common_devargs.c
index 49d43a3..6ac88d6 100644 (file)
@@ -40,7 +40,9 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <rte_dev.h>
 #include <rte_devargs.h>
+#include <rte_tailq.h>
 #include "eal_private.h"
 
 /** Global list of user devices */
@@ -137,6 +139,18 @@ rte_eal_devargs_parse(const char *dev, struct rte_devargs *da)
        return 0;
 }
 
+int
+rte_eal_devargs_insert(struct rte_devargs *da)
+{
+       int ret;
+
+       ret = rte_eal_devargs_remove(da->bus->name, da->name);
+       if (ret < 0)
+               return ret;
+       TAILQ_INSERT_TAIL(&devargs_list, da, next);
+       return 0;
+}
+
 /* store a whitelist parameter for later parsing */
 int
 rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
@@ -154,22 +168,14 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str)
                goto fail;
        devargs->type = devtype;
        bus = devargs->bus;
-       if (devargs->type == RTE_DEVTYPE_WHITELISTED) {
-               if (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) {
+       if (devargs->type == RTE_DEVTYPE_BLACKLISTED_PCI)
+               devargs->policy = RTE_DEV_BLACKLISTED;
+       if (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) {
+               if (devargs->policy == RTE_DEV_WHITELISTED)
                        bus->conf.scan_mode = RTE_BUS_SCAN_WHITELIST;
-               } else if (bus->conf.scan_mode == RTE_BUS_SCAN_BLACKLIST) {
-                       fprintf(stderr, "ERROR: incompatible device type and bus scan mode\n");
-                       goto fail;
-               }
-       } else if (devargs->type == RTE_DEVTYPE_BLACKLISTED) {
-               if (bus->conf.scan_mode == RTE_BUS_SCAN_UNDEFINED) {
+               else if (devargs->policy == RTE_DEV_BLACKLISTED)
                        bus->conf.scan_mode = RTE_BUS_SCAN_BLACKLIST;
-               } else if (bus->conf.scan_mode == RTE_BUS_SCAN_WHITELIST) {
-                       fprintf(stderr, "ERROR: incompatible device type and bus scan mode\n");
-                       goto fail;
-               }
        }
-
        TAILQ_INSERT_TAIL(&devargs_list, devargs, next);
        return 0;
 
@@ -182,6 +188,24 @@ fail:
        return -1;
 }
 
+int
+rte_eal_devargs_remove(const char *busname, const char *devname)
+{
+       struct rte_devargs *d;
+       void *tmp;
+
+       TAILQ_FOREACH_SAFE(d, &devargs_list, next, tmp) {
+               if (strcmp(d->bus->name, busname) == 0 &&
+                   strcmp(d->name, devname) == 0) {
+                       TAILQ_REMOVE(&devargs_list, d, next);
+                       free(d->args);
+                       free(d);
+                       return 0;
+               }
+       }
+       return 1;
+}
+
 /* count the number of devices of a specified type */
 unsigned int
 rte_eal_devargs_type_count(enum rte_devtype devtype)