X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_options.c;h=0a594d7fd9c2e39b257dd48820046701e0f7dacc;hb=a461943208397029b85273b89d4ac30f7c89c3fa;hp=e40f65bb5b0811bed6a9b9593e335b3c85102109;hpb=fa9cdc6f84104152698ccc8a183272503300e204;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index e40f65bb5b..0a594d7fd9 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include #include #include @@ -109,6 +112,18 @@ struct shared_driver { 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; + +/* + * Stringified version of solib path used by pmdinfo.py + * Note: PLEASE DO NOT ALTER THIS without making a corresponding + * change to tools/pmdinfo.py + */ +static const char dpdk_solib_path[] __attribute__((used)) = +"DPDK_PLUGIN_PATH=" RTE_EAL_PMD_PATH; + + static int master_lcore_parsed; static int mem_parsed; @@ -133,7 +148,11 @@ eal_reset_internal_config(struct internal_config *internal_cfg) internal_cfg->syslog_facility = LOG_DAEMON; /* default value from build option */ +#if RTE_LOG_LEVEL >= RTE_LOG_DEBUG + internal_cfg->log_level = RTE_LOG_INFO; +#else internal_cfg->log_level = RTE_LOG_LEVEL; +#endif internal_cfg->xen_dom0_support = 0; @@ -167,18 +186,69 @@ eal_plugin_add(const char *path) 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) { + struct stat sb; + + snprintf(sopath, PATH_MAX-1, "%s/%s", path, dent->d_name); + sopath[PATH_MAX-1] = 0; + + if (!(stat(sopath, &sb) == 0 && S_ISREG(sb.st_mode))) + continue; + + 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) { - 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; + struct stat sb; + + if (stat(solib->name, &sb) == 0 && S_ISDIR(sb.st_mode)) { + if (eal_plugindir_init(solib->name) == -1) { + RTE_LOG(ERR, EAL, + "Cannot init plugin directory %s\n", + solib->name); + return -1; + } + } else { + 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; + } } + } return 0; } @@ -740,8 +810,7 @@ eal_parse_common_option(int opt, const char *optarg, /* force number of channels */ case 'n': conf->force_nchannel = atoi(optarg); - if (conf->force_nchannel == 0 || - conf->force_nchannel > 4) { + if (conf->force_nchannel == 0) { RTE_LOG(ERR, EAL, "invalid channel number\n"); return -1; } @@ -948,7 +1017,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 Add driver (can be used multiple times)\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"