net/virtio: fix incorrect cast of void *
[dpdk.git] / lib / librte_eal / common / eal_common_options.c
index 56c368c..996a034 100644 (file)
@@ -47,6 +47,7 @@
 #include <rte_eal.h>
 #include <rte_log.h>
 #include <rte_lcore.h>
+#include <rte_tailq.h>
 #include <rte_version.h>
 #include <rte_devargs.h>
 #include <rte_memcpy.h>
@@ -84,6 +85,7 @@ eal_long_options[] = {
        {OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
        {OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
        {OPT_MASTER_LCORE,      1, NULL, OPT_MASTER_LCORE_NUM     },
+       {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM},
        {OPT_NO_HPET,           0, NULL, OPT_NO_HPET_NUM          },
        {OPT_NO_HUGE,           0, NULL, OPT_NO_HUGE_NUM          },
        {OPT_NO_PCI,            0, NULL, OPT_NO_PCI_NUM           },
@@ -96,7 +98,6 @@ eal_long_options[] = {
        {OPT_VDEV,              1, NULL, OPT_VDEV_NUM             },
        {OPT_VFIO_INTR,         1, NULL, OPT_VFIO_INTR_NUM        },
        {OPT_VMWARE_TSC_MAP,    0, NULL, OPT_VMWARE_TSC_MAP_NUM   },
-       {OPT_XEN_DOM0,          0, NULL, OPT_XEN_DOM0_NUM         },
        {0,                     0, NULL, 0                        }
 };
 
@@ -125,11 +126,67 @@ static const char *default_solib_dir = RTE_EAL_PMD_PATH;
 static const char dpdk_solib_path[] __attribute__((used)) =
 "DPDK_PLUGIN_PATH=" RTE_EAL_PMD_PATH;
 
+TAILQ_HEAD(device_option_list, device_option);
+
+struct device_option {
+       TAILQ_ENTRY(device_option) next;
+
+       enum rte_devtype type;
+       char arg[];
+};
+
+static struct device_option_list devopt_list =
+TAILQ_HEAD_INITIALIZER(devopt_list);
 
 static int master_lcore_parsed;
 static int mem_parsed;
 static int core_parsed;
 
+static int
+eal_option_device_add(enum rte_devtype type, const char *optarg)
+{
+       struct device_option *devopt;
+       size_t optlen;
+       int ret;
+
+       optlen = strlen(optarg) + 1;
+       devopt = calloc(1, sizeof(*devopt) + optlen);
+       if (devopt == NULL) {
+               RTE_LOG(ERR, EAL, "Unable to allocate device option\n");
+               return -ENOMEM;
+       }
+
+       devopt->type = type;
+       ret = snprintf(devopt->arg, optlen, "%s", optarg);
+       if (ret < 0) {
+               RTE_LOG(ERR, EAL, "Unable to copy device option\n");
+               free(devopt);
+               return -EINVAL;
+       }
+       TAILQ_INSERT_TAIL(&devopt_list, devopt, next);
+       return 0;
+}
+
+int
+eal_option_device_parse(void)
+{
+       struct device_option *devopt;
+       void *tmp;
+       int ret = 0;
+
+       TAILQ_FOREACH_SAFE(devopt, &devopt_list, next, tmp) {
+               if (ret == 0) {
+                       ret = rte_eal_devargs_add(devopt->type, devopt->arg);
+                       if (ret)
+                               RTE_LOG(ERR, EAL, "Unable to parse device '%s'\n",
+                                       devopt->arg);
+               }
+               TAILQ_REMOVE(&devopt_list, devopt, next);
+               free(devopt);
+       }
+       return ret;
+}
+
 void
 eal_reset_internal_config(struct internal_config *internal_cfg)
 {
@@ -151,8 +208,6 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
 
        internal_cfg->syslog_facility = LOG_DAEMON;
 
-       internal_cfg->xen_dom0_support = 0;
-
        /* if set to NONE, interrupt mode is determined automatically */
        internal_cfg->vfio_intr_mode = RTE_INTR_MODE_NONE;
 
@@ -163,6 +218,7 @@ eal_reset_internal_config(struct internal_config *internal_cfg)
 #endif
        internal_cfg->vmware_tsc_map = 0;
        internal_cfg->create_uio_dev = 0;
+       internal_cfg->mbuf_pool_ops_name = RTE_MBUF_DEFAULT_MEMPOOL_OPS;
 }
 
 static int
@@ -222,12 +278,13 @@ int
 eal_plugins_init(void)
 {
        struct shared_driver *solib = NULL;
+       struct stat sb;
 
-       if (*default_solib_dir != '\0')
+       if (*default_solib_dir != '\0' && stat(default_solib_dir, &sb) == 0 &&
+                               S_ISDIR(sb.st_mode))
                eal_plugin_add(default_solib_dir);
 
        TAILQ_FOREACH(solib, &solib_list, next) {
-               struct stat sb;
 
                if (stat(solib->name, &sb) == 0 && S_ISDIR(sb.st_mode)) {
                        if (eal_plugindir_init(solib->name) == -1) {
@@ -941,20 +998,29 @@ int
 eal_parse_common_option(int opt, const char *optarg,
                        struct internal_config *conf)
 {
+       static int b_used;
+       static int w_used;
+
        switch (opt) {
        /* blacklist */
        case 'b':
-               if (rte_eal_devargs_add(RTE_DEVTYPE_BLACKLISTED_PCI,
+               if (w_used)
+                       goto bw_used;
+               if (eal_option_device_add(RTE_DEVTYPE_BLACKLISTED_PCI,
                                optarg) < 0) {
                        return -1;
                }
+               b_used = 1;
                break;
        /* whitelist */
        case 'w':
-               if (rte_eal_devargs_add(RTE_DEVTYPE_WHITELISTED_PCI,
+               if (b_used)
+                       goto bw_used;
+               if (eal_option_device_add(RTE_DEVTYPE_WHITELISTED_PCI,
                                optarg) < 0) {
                        return -1;
                }
+               w_used = 1;
                break;
        /* coremask */
        case 'c':
@@ -1061,7 +1127,7 @@ eal_parse_common_option(int opt, const char *optarg,
                break;
 
        case OPT_VDEV_NUM:
-               if (rte_eal_devargs_add(RTE_DEVTYPE_VIRTUAL,
+               if (eal_option_device_add(RTE_DEVTYPE_VIRTUAL,
                                optarg) < 0) {
                        return -1;
                }
@@ -1100,6 +1166,10 @@ eal_parse_common_option(int opt, const char *optarg,
        }
 
        return 0;
+bw_used:
+       RTE_LOG(ERR, EAL, "Options blacklist (-b) and whitelist (-w) "
+               "cannot be used at the same time\n");
+       return -1;
 }
 
 static void
@@ -1187,13 +1257,6 @@ eal_check_common_options(struct internal_config *internal_cfg)
                return -1;
        }
 
-       if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 0 &&
-               rte_eal_devargs_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 0) {
-               RTE_LOG(ERR, EAL, "Options blacklist (-b) and whitelist (-w) "
-                       "cannot be used at the same time\n");
-               return -1;
-       }
-
        return 0;
 }
 
@@ -1216,6 +1279,7 @@ eal_common_usage(void)
               "                      '@' can be omitted if cpus and lcores have the same value\n"
               "  -s SERVICE COREMASK Hexadecimal bitmask of cores to be used as service cores\n"
               "  --"OPT_MASTER_LCORE" ID   Core ID that is used as master\n"
+              "  --"OPT_MBUF_POOL_OPS_NAME" Pool ops name for mbuf to use\n"
               "  -n CHANNELS         Number of memory channels\n"
               "  -m MB               Memory to allocate (see also --"OPT_SOCKET_MEM")\n"
               "  -r RANKS            Force number of memory ranks (don't detect)\n"