X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal.c;h=b5e755fc8b5fd9f5b76d9b31be81f03d6a9107ef;hb=e9d48c0072d36eb6423b45fba4ec49d0def6c36f;hp=5a9d7b9339d8c749a2e6275a8caf56b2ecfbb25b;hpb=1c1d4d7a923d4804f1926fc5264f9ecdd8977b04;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 5a9d7b9339..b5e755fc8b 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,6 +47,9 @@ #include #include #include +#include +#include +#include #include #include @@ -69,6 +72,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -85,6 +89,7 @@ #define OPT_NO_HUGE "no-huge" #define OPT_FILE_PREFIX "file-prefix" #define OPT_SOCKET_MEM "socket-mem" +#define OPT_USE_DEVICE "use-device" #define OPT_SYSLOG "syslog" #define RTE_EAL_BLACKLIST_SIZE 0x100 @@ -93,6 +98,10 @@ #define SOCKET_MEM_STRLEN (RTE_MAX_NUMA_NODES * 10) +#define HIGHEST_RPL 3 + +#define BITS_PER_HEX 4 + #define GET_BLACKLIST_FIELD(in, fd, lim, dlm) \ { \ unsigned long val; \ @@ -331,13 +340,17 @@ eal_usage(const char *prgname) " --"OPT_HUGE_DIR" : directory where hugetlbfs is mounted\n" " --"OPT_PROC_TYPE" : type of this process\n" " --"OPT_FILE_PREFIX": prefix for hugepage filenames\n" + " --"OPT_USE_DEVICE": use the specified ethernet device(s) only. " + "Use comma-separate <[domain:]bus:devid.func> values.\n" + " [NOTE: Cannot be used with -b option]\n" " --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of " "native RDTSC\n" "\nEAL options for DEBUG use only:\n" " --"OPT_NO_HUGE" : use malloc instead of hugetlbfs\n" " --"OPT_NO_PCI" : disable pci\n" " --"OPT_NO_HPET" : disable hpet\n" - " --"OPT_NO_SHCONF": no shared config (mmap'd files)\n\n", + " --"OPT_NO_SHCONF": no shared config (mmap'd files)\n" + "\n", prgname); /* Allow the application to print its usage message too if hook is set */ if ( rte_application_usage_hook ) { @@ -364,33 +377,67 @@ rte_set_application_usage_hook( rte_usage_hook_t usage_func ) * the global configuration (core role and core count) with the parsed * value. */ +static int xdigit2val(unsigned char c) +{ + int val; + if(isdigit(c)) + val = c - '0'; + else if(isupper(c)) + val = c - 'A' + 10; + else + val = c - 'a' + 10; + return val; +} static int eal_parse_coremask(const char *coremask) { struct rte_config *cfg = rte_eal_get_configuration(); - unsigned i; - char *end = NULL; - unsigned long long cm; + int i, j, idx = 0 ; unsigned count = 0; + char c; + int val; - /* parse hexadecimal string */ - cm = strtoull(coremask, &end, 16); - if ((coremask[0] == '\0') || (end == NULL) || (*end != '\0') || (cm == 0)) + if (coremask == NULL) + return -1; + /* Remove all blank characters ahead and after . + * Remove 0x/0X if exists. + */ + while (isblank(*coremask)) + coremask++; + if (coremask[0] == '0' && ((coremask[1] == 'x') + || (coremask[1] == 'X')) ) + coremask += 2; + i = strnlen(coremask, MAX_ARG_STRLEN); + while ((i > 0) && isblank(coremask[i - 1])) + i--; + if (i == 0) return -1; - RTE_LOG(DEBUG, EAL, "coremask set to %llx\n", cm); - /* set core role and core count */ - for (i = 0; i < RTE_MAX_LCORE; i++) { - if ((1ULL << i) & cm) { - if (count == 0) - cfg->master_lcore = i; - cfg->lcore_role[i] = ROLE_RTE; - count++; + for (i = i - 1; i >= 0 && idx < RTE_MAX_LCORE; i--) { + c = coremask[i]; + if (isxdigit(c) == 0) { + /* invalid characters */ + return (-1); } - else { - cfg->lcore_role[i] = ROLE_OFF; + val = xdigit2val(c); + for(j = 0; j < BITS_PER_HEX && idx < RTE_MAX_LCORE; j++, idx++) { + if((1 << j) & val) { + cfg->lcore_role[idx] = ROLE_RTE; + if(count == 0) + cfg->master_lcore = idx; + count++; + } else { + cfg->lcore_role[idx] = ROLE_OFF; + } } } + for(; i >= 0; i--) + if(coremask[i] != '0') + return -1; + for(; idx < RTE_MAX_LCORE; idx++) + cfg->lcore_role[idx] = ROLE_OFF; + if(count == 0) + return -1; return 0; } @@ -514,28 +561,15 @@ eal_parse_proc_type(const char *arg) return RTE_PROC_INVALID; } -static int -eal_parse_blacklist(const char *input, struct rte_pci_addr *dev2bl) -{ - GET_BLACKLIST_FIELD(input, dev2bl->domain, UINT16_MAX, ':'); - GET_BLACKLIST_FIELD(input, dev2bl->bus, UINT8_MAX, ':'); - GET_BLACKLIST_FIELD(input, dev2bl->devid, UINT8_MAX, '.'); - GET_BLACKLIST_FIELD(input, dev2bl->function, UINT8_MAX, 0); - return (0); -} - static ssize_t eal_parse_blacklist_opt(const char *optarg, size_t idx) { if (idx >= sizeof (eal_dev_blacklist) / sizeof (eal_dev_blacklist[0])) { - RTE_LOG(ERR, EAL, - "%s - too many devices to blacklist...\n", - optarg); + RTE_LOG(ERR, EAL, "%s - too many devices to blacklist...\n", optarg); return (-EINVAL); - } else if (eal_parse_blacklist(optarg, eal_dev_blacklist + idx) != 0) { - RTE_LOG(ERR, EAL, - "%s - invalid device to blacklist...\n", - optarg); + } else if (eal_parse_pci_DomBDF(optarg, eal_dev_blacklist + idx) < 0 && + eal_parse_pci_BDF(optarg, eal_dev_blacklist + idx) < 0) { + RTE_LOG(ERR, EAL, "%s - invalid device to blacklist...\n", optarg); return (-EINVAL); } @@ -543,7 +577,6 @@ eal_parse_blacklist_opt(const char *optarg, size_t idx) return (idx); } - /* Parse the argument given in the command line of the application */ static int eal_parse_args(int argc, char **argv) @@ -552,7 +585,7 @@ eal_parse_args(int argc, char **argv) char **argvopt; int option_index; int coremask_ok = 0; - ssize_t blacklist_index = 0;; + ssize_t blacklist_index = 0; char *prgname = argv[0]; static struct option lgopts[] = { {OPT_NO_HUGE, 0, 0, 0}, @@ -564,6 +597,7 @@ eal_parse_args(int argc, char **argv) {OPT_PROC_TYPE, 1, 0, 0}, {OPT_FILE_PREFIX, 1, 0, 0}, {OPT_SOCKET_MEM, 1, 0, 0}, + {OPT_USE_DEVICE, 1, 0, 0}, {OPT_SYSLOG, 1, NULL, 0}, {0, 0, 0, 0} }; @@ -680,6 +714,9 @@ eal_parse_args(int argc, char **argv) return -1; } } + else if (!strcmp(lgopts[option_index].name, OPT_USE_DEVICE)) { + eal_dev_whitelist_add_entry(optarg); + } else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) { if (eal_parse_syslog(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameters for --" @@ -737,8 +774,21 @@ eal_parse_args(int argc, char **argv) return -1; } - if (blacklist_index > 0) + /* if no blacklist, parse a whitelist */ + if (blacklist_index > 0) { + if (eal_dev_whitelist_exists()) { + RTE_LOG(ERR, EAL, "Error: blacklist [-b] and whitelist " + "[--use-device] options cannot be used at the same time\n"); + eal_usage(prgname); + return -1; + } rte_eal_pci_set_blacklist(eal_dev_blacklist, blacklist_index); + } else { + if (eal_dev_whitelist_exists() && eal_dev_whitelist_parse() < 0) { + RTE_LOG(ERR,EAL, "Error parsing whitelist[--use-device] options\n"); + return -1; + } + } if (optind >= 0) argv[optind-1] = prgname; @@ -786,6 +836,15 @@ rte_eal_mcfg_complete(void) rte_config.mem_config->magic = RTE_MAGIC; } +/* + * Request iopl priviledge for all RPL, returns 0 on success + */ +static int +rte_eal_iopl_init(void) +{ + return iopl(HIGHEST_RPL); +} + /* Launch threads, called at application init(). */ int rte_eal_init(int argc, char **argv) @@ -832,6 +891,9 @@ rte_eal_init(int argc, char **argv) rte_srand(rte_rdtsc()); rte_config_init(); + + if (rte_eal_iopl_init() == 0) + rte_config.flags |= EAL_FLG_HIGH_IOPL; if (rte_eal_cpu_init() < 0) rte_panic("Cannot detect lcores\n"); @@ -870,6 +932,9 @@ rte_eal_init(int argc, char **argv) rte_eal_mcfg_complete(); + if (rte_eal_non_pci_ethdev_init() < 0) + rte_panic("Cannot init non-PCI eth_devs\n"); + RTE_LCORE_FOREACH_SLAVE(i) { /*