X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal.c;h=f99e1586380d6b6b6dec7cc111a045af354c67cf;hb=8bae1da2afe0;hp=bb35669b3307c331f7059abad3ab877f154ee5d2;hpb=341befa2a2b83e71f749751e097f9bcc882ef4ba;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index bb35669b33..f99e158638 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -50,7 +50,9 @@ #include #include #include +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) #include +#endif #include #include @@ -284,7 +286,7 @@ rte_eal_config_reattach(void) } /* Detect if we are a primary or a secondary process */ -static enum rte_proc_type_t +enum rte_proc_type_t eal_proc_type_detect(void) { enum rte_proc_type_t ptype = RTE_PROC_PRIMARY; @@ -307,9 +309,7 @@ eal_proc_type_detect(void) static void rte_config_init(void) { - rte_config.process_type = (internal_config.process_type == RTE_PROC_AUTO) ? - eal_proc_type_detect() : /* for auto, detect the type */ - internal_config.process_type; /* otherwise use what's already set */ + rte_config.process_type = internal_config.process_type; switch (rte_config.process_type){ case RTE_PROC_PRIMARY: @@ -448,14 +448,17 @@ eal_parse_base_virtaddr(const char *arg) return -1; /* make sure we don't exceed 32-bit boundary on 32-bit target */ -#ifndef RTE_ARCH_X86_64 +#ifndef RTE_ARCH_64 if (addr >= UINTPTR_MAX) return -1; #endif - /* align the addr on 2M boundary */ - internal_config.base_virtaddr = RTE_PTR_ALIGN_CEIL((uintptr_t)addr, - RTE_PGSIZE_2M); + /* align the addr on 16M boundary, 16MB is the minimum huge page + * size on IBM Power architecture. If the addr is aligned to 16MB, + * it can align to 2MB for x86. So this alignment can also be used + * on x86 */ + internal_config.base_virtaddr = + RTE_PTR_ALIGN_CEIL((uintptr_t)addr, (size_t)RTE_PGSIZE_16M); return 0; } @@ -504,10 +507,9 @@ eal_get_hugepage_mem_size(void) static int eal_parse_args(int argc, char **argv) { - int opt, ret, i; + int opt, ret; char **argvopt; int option_index; - int coremask_ok = 0; char *prgname = argv[0]; struct shared_driver *solib; @@ -531,13 +533,8 @@ eal_parse_args(int argc, char **argv) return -1; } /* common parser handled this option */ - if (ret == 0) { - /* special case, note that the common parser accepted - * the coremask option */ - if (opt == 'c') - coremask_ok = 1; + if (ret == 0) continue; - } switch (opt) { /* force loading of external driver */ @@ -622,70 +619,25 @@ eal_parse_args(int argc, char **argv) } } - /* sanity checks */ - if (!coremask_ok) { - RTE_LOG(ERR, EAL, "coremask not specified\n"); - eal_usage(prgname); - return -1; - } - if (internal_config.process_type == RTE_PROC_AUTO){ - internal_config.process_type = eal_proc_type_detect(); - } - if (internal_config.process_type == RTE_PROC_INVALID){ - RTE_LOG(ERR, EAL, "Invalid process type specified\n"); - eal_usage(prgname); - return -1; - } - if (internal_config.process_type == RTE_PROC_PRIMARY && - internal_config.force_nchannel == 0) { - RTE_LOG(ERR, EAL, "Number of memory channels (-n) not specified\n"); - eal_usage(prgname); + if (eal_adjust_config(&internal_config) != 0) return -1; - } - if (index(internal_config.hugefile_prefix,'%') != NULL){ - RTE_LOG(ERR, EAL, "Invalid char, '%%', in '"OPT_FILE_PREFIX"' option\n"); - eal_usage(prgname); - return -1; - } - if (internal_config.memory > 0 && internal_config.force_sockets == 1) { - RTE_LOG(ERR, EAL, "Options -m and --socket-mem cannot be specified " - "at the same time\n"); - eal_usage(prgname); - return -1; - } - /* --no-huge doesn't make sense with either -m or --socket-mem */ - if (internal_config.no_hugetlbfs && - (internal_config.memory > 0 || - internal_config.force_sockets == 1)) { - RTE_LOG(ERR, EAL, "Options -m or --socket-mem cannot be specified " - "together with --no-huge!\n"); + + /* sanity checks */ + if (eal_check_common_options(&internal_config) != 0) { eal_usage(prgname); return -1; } + /* --xen-dom0 doesn't make sense with --socket-mem */ if (internal_config.xen_dom0_support && internal_config.force_sockets == 1) { - RTE_LOG(ERR, EAL, "Options --socket-mem cannot be specified " - "together with --xen_dom0!\n"); - eal_usage(prgname); - 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, "Error: blacklist [-b] and whitelist " - "[-w] options cannot be used at the same time\n"); + RTE_LOG(ERR, EAL, "Options --"OPT_SOCKET_MEM" cannot be specified " + "together with --"OPT_XEN_DOM0"\n"); eal_usage(prgname); return -1; } if (optind >= 0) argv[optind-1] = prgname; - - /* if no memory amounts were requested, this will result in 0 and - * will be overriden later, right after eal_hugepage_info_init() */ - for (i = 0; i < RTE_MAX_NUMA_NODES; i++) - internal_config.memory += internal_config.socket_mem[i]; - ret = optind-1; optind = 0; /* reset getopt lib */ return ret; @@ -726,13 +678,19 @@ rte_eal_mcfg_complete(void) /* * Request iopl privilege for all RPL, returns 0 on success + * iopl() call is mostly for the i386 architecture. For other architectures, + * return -1 to indicate IO privilege can't be changed in this way. */ int rte_eal_iopl_init(void) { +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) if (iopl(3) != 0) return -1; return 0; +#else + return -1; +#endif } /* Launch threads, called at application init(). */ @@ -901,3 +859,31 @@ int rte_eal_has_hugepages(void) { return ! internal_config.no_hugetlbfs; } + +int +rte_eal_check_module(const char *module_name) +{ + char mod_name[30]; /* Any module names can be longer than 30 bytes? */ + int ret = 0; + int n; + + if (NULL == module_name) + return -1; + + FILE *fd = fopen("/proc/modules", "r"); + if (NULL == fd) { + RTE_LOG(ERR, EAL, "Open /proc/modules failed!" + " error %i (%s)\n", errno, strerror(errno)); + return -1; + } + while (!feof(fd)) { + n = fscanf(fd, "%29s %*[^\n]", mod_name); + if ((n == 1) && !strcmp(mod_name, module_name)) { + ret = 1; + break; + } + } + fclose(fd); + + return ret; +}