X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_options.c;h=bed738570064b5960708afa9d47f901a5271c378;hb=75583b0d1efd3fa7f8b8c66dd0e58212150f1d41;hp=4319549a590a80023924229ed1496520a00e9135;hpb=a9b1c67a2ce87b24f60927c57522feb97ccbcda5;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 4319549a59..bed7385700 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -39,6 +39,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -70,10 +74,11 @@ eal_short_options[] = const struct option eal_long_options[] = { {OPT_BASE_VIRTADDR, 1, NULL, OPT_BASE_VIRTADDR_NUM }, - {OPT_CREATE_UIO_DEV, 1, NULL, OPT_CREATE_UIO_DEV_NUM }, + {OPT_CREATE_UIO_DEV, 0, NULL, OPT_CREATE_UIO_DEV_NUM }, {OPT_FILE_PREFIX, 1, NULL, OPT_FILE_PREFIX_NUM }, {OPT_HELP, 0, NULL, OPT_HELP_NUM }, {OPT_HUGE_DIR, 1, NULL, OPT_HUGE_DIR_NUM }, + {OPT_HUGE_UNLINK, 0, NULL, OPT_HUGE_UNLINK_NUM }, {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 }, @@ -93,7 +98,23 @@ eal_long_options[] = { {0, 0, NULL, 0 } }; -static int lcores_parsed; +TAILQ_HEAD(shared_driver_list, shared_driver); + +/* Definition for shared object drivers. */ +struct shared_driver { + TAILQ_ENTRY(shared_driver) next; + + char name[PATH_MAX]; + void* lib_handle; +}; + +/* List of external loadable drivers */ +static struct shared_driver_list solib_list = +TAILQ_HEAD_INITIALIZER(solib_list); + +/* Default path of external loadable drivers */ +static const char *default_solib_dir = RTE_EAL_PMD_PATH; + static int master_lcore_parsed; static int mem_parsed; @@ -131,6 +152,98 @@ eal_reset_internal_config(struct internal_config *internal_cfg) internal_cfg->no_hpet = 1; #endif internal_cfg->vmware_tsc_map = 0; + internal_cfg->create_uio_dev = 0; +} + +static int +eal_plugin_add(const char *path) +{ + struct shared_driver *solib; + + solib = malloc(sizeof(*solib)); + if (solib == NULL) { + RTE_LOG(ERR, EAL, "malloc(solib) failed\n"); + return -1; + } + memset(solib, 0, sizeof(*solib)); + strncpy(solib->name, path, PATH_MAX-1); + solib->name[PATH_MAX-1] = 0; + TAILQ_INSERT_TAIL(&solib_list, solib, next); + + return 0; +} + +static int +eal_plugindir_init(const char *path) +{ + DIR *d = NULL; + struct dirent *dent = NULL; + char sopath[PATH_MAX]; + + if (path == NULL || *path == '\0') + return 0; + + d = opendir(path); + if (d == NULL) { + RTE_LOG(ERR, EAL, "failed to open directory %s: %s\n", + path, strerror(errno)); + return -1; + } + + while ((dent = readdir(d)) != NULL) { + if (dent->d_type != DT_REG && dent->d_type != DT_LNK) + continue; + + snprintf(sopath, PATH_MAX-1, "%s/%s", path, dent->d_name); + sopath[PATH_MAX-1] = 0; + + if (eal_plugin_add(sopath) == -1) + break; + } + + closedir(d); + /* XXX this ignores failures from readdir() itself */ + return (dent == NULL) ? 0 : -1; +} + +int +eal_plugins_init(void) +{ + struct shared_driver *solib = NULL; + + if (*default_solib_dir != '\0') + eal_plugin_add(default_solib_dir); + + TAILQ_FOREACH(solib, &solib_list, next) { + struct stat sb; + if (stat(solib->name, &sb) == -1) { + RTE_LOG(ERR, EAL, "Invalid plugin specified: %s: %s\n", + solib->name, strerror(errno)); + return -1; + } + + switch (sb.st_mode & S_IFMT) { + case S_IFDIR: + if (eal_plugindir_init(solib->name) == -1) { + RTE_LOG(ERR, EAL, + "Cannot init plugin directory %s\n", + solib->name); + return -1; + } + break; + case S_IFREG: + RTE_LOG(DEBUG, EAL, "open shared lib %s\n", + solib->name); + solib->lib_handle = dlopen(solib->name, RTLD_NOW); + if (solib->lib_handle == NULL) { + RTE_LOG(ERR, EAL, "%s\n", dlerror()); + return -1; + } + break; + } + + } + return 0; } /* @@ -211,7 +324,6 @@ eal_parse_coremask(const char *coremask) return -1; /* Update the count of enabled logical cores of the EAL configuration */ cfg->lcore_count = count; - lcores_parsed = 1; return 0; } @@ -278,7 +390,6 @@ eal_parse_corelist(const char *corelist) /* Update the count of enabled logical cores of the EAL configuration */ cfg->lcore_count = count; - lcores_parsed = 1; return 0; } @@ -568,7 +679,6 @@ eal_parse_lcores(const char *lcores) goto err; cfg->lcore_count = count; - lcores_parsed = 1; ret = 0; err: @@ -708,6 +818,11 @@ eal_parse_common_option(int opt, const char *optarg, return -1; } break; + /* force loading of external driver */ + case 'd': + if (eal_plugin_add(optarg) == -1) + return -1; + break; case 'v': /* since message is explicitly requested by user, we * write message at highest log level so it can always @@ -717,6 +832,10 @@ eal_parse_common_option(int opt, const char *optarg, break; /* long options */ + case OPT_HUGE_UNLINK_NUM: + conf->hugepage_unlink = 1; + break; + case OPT_NO_HUGE_NUM: conf->no_hugetlbfs = 1; break; @@ -819,11 +938,6 @@ eal_check_common_options(struct internal_config *internal_cfg) { struct rte_config *cfg = rte_eal_get_configuration(); - if (!lcores_parsed) { - RTE_LOG(ERR, EAL, "CPU cores must be enabled with options " - "-c, -l or --lcores\n"); - return -1; - } if (cfg->lcore_role[cfg->master_lcore] != ROLE_RTE) { RTE_LOG(ERR, EAL, "Master lcore is not enabled for DPDK\n"); return -1; @@ -833,12 +947,6 @@ eal_check_common_options(struct internal_config *internal_cfg) RTE_LOG(ERR, EAL, "Invalid process type specified\n"); return -1; } - if (internal_cfg->process_type == RTE_PROC_PRIMARY && - internal_cfg->force_nchannel == 0) { - RTE_LOG(ERR, EAL, "Number of memory channels (-n) not " - "specified\n"); - return -1; - } if (index(internal_cfg->hugefile_prefix, '%') != NULL) { RTE_LOG(ERR, EAL, "Invalid char, '%%', in --"OPT_FILE_PREFIX" " "option\n"); @@ -849,9 +957,14 @@ eal_check_common_options(struct internal_config *internal_cfg) "be specified at the same time\n"); return -1; } - if (internal_cfg->no_hugetlbfs && - (mem_parsed || internal_cfg->force_sockets == 1)) { - RTE_LOG(ERR, EAL, "Options -m or --"OPT_SOCKET_MEM" cannot " + if (internal_cfg->no_hugetlbfs && internal_cfg->force_sockets == 1) { + RTE_LOG(ERR, EAL, "Option --"OPT_SOCKET_MEM" cannot " + "be specified together with --"OPT_NO_HUGE"\n"); + return -1; + } + + if (internal_cfg->no_hugetlbfs && internal_cfg->hugepage_unlink) { + RTE_LOG(ERR, EAL, "Option --"OPT_HUGE_UNLINK" cannot " "be specified together with --"OPT_NO_HUGE"\n"); return -1; } @@ -869,7 +982,7 @@ eal_check_common_options(struct internal_config *internal_cfg) void eal_common_usage(void) { - printf("-c COREMASK|-l CORELIST -n CHANNELS [options]\n\n" + printf("[options]\n\n" "EAL common options:\n" " -c COREMASK Hexadecimal bitmask of cores to run on\n" " -l CORELIST List of cores to run on\n" @@ -898,6 +1011,8 @@ eal_common_usage(void) " --"OPT_VDEV" Add a virtual device.\n" " The argument format is [,key=val,...]\n" " (ex: --vdev=eth_pcap0,iface=eth2).\n" + " -d LIB.so|DIR Add a driver or driver directory\n" + " (can be used multiple times)\n" " --"OPT_VMWARE_TSC_MAP" Use VMware TSC map instead of native RDTSC\n" " --"OPT_PROC_TYPE" Type of this process (primary|secondary|auto)\n" " --"OPT_SYSLOG" Set syslog facility\n" @@ -905,6 +1020,7 @@ eal_common_usage(void) " -v Display version information on startup\n" " -h, --help This help\n" "\nEAL options for DEBUG use only:\n" + " --"OPT_HUGE_UNLINK" Unlink hugepage files after init\n" " --"OPT_NO_HUGE" Use malloc instead of hugetlbfs\n" " --"OPT_NO_PCI" Disable PCI\n" " --"OPT_NO_HPET" Disable HPET\n"