X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_options.c;fp=lib%2Flibrte_eal%2Fcommon%2Feal_common_options.c;h=5920233bcd022674c550afe7804d57b0c816da8c;hb=8674b203f1270034e7d23d58b0c40ebdf996625e;hp=68f7d1cd732e8e7c2781905ab0333e1a9d0798a9;hpb=927b5499c5af9f2d0f889feb9ce66c5a1ca06e8f;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 68f7d1cd73..5920233bcd 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -658,14 +658,14 @@ eal_parse_master_lcore(const char *arg) * ',' used for a single number. */ static int -eal_parse_set(const char *input, uint16_t set[], unsigned num) +eal_parse_set(const char *input, rte_cpuset_t *set) { unsigned idx; const char *str = input; char *end = NULL; unsigned min, max; - memset(set, 0, num * sizeof(uint16_t)); + CPU_ZERO(set); while (isblank(*str)) str++; @@ -678,7 +678,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) if (*str != '(') { errno = 0; idx = strtoul(str, &end, 10); - if (errno || end == NULL || idx >= num) + if (errno || end == NULL || idx >= CPU_SETSIZE) return -1; else { while (isblank(*end)) @@ -696,7 +696,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) errno = 0; idx = strtoul(end, &end, 10); - if (errno || end == NULL || idx >= num) + if (errno || end == NULL || idx >= CPU_SETSIZE) return -1; max = idx; while (isblank(*end)) @@ -711,7 +711,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) for (idx = RTE_MIN(min, max); idx <= RTE_MAX(min, max); idx++) - set[idx] = 1; + CPU_SET(idx, set); return end - input; } @@ -736,7 +736,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) /* get the digit value */ errno = 0; idx = strtoul(str, &end, 10); - if (errno || end == NULL || idx >= num) + if (errno || end == NULL || idx >= CPU_SETSIZE) return -1; /* go ahead to separator '-',',' and ')' */ @@ -753,7 +753,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) min = idx; for (idx = RTE_MIN(min, max); idx <= RTE_MAX(min, max); idx++) - set[idx] = 1; + CPU_SET(idx, set); min = RTE_MAX_LCORE; } else @@ -772,17 +772,13 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num) return str - input; } -/* convert from set array to cpuset bitmap */ static int -convert_to_cpuset(rte_cpuset_t *cpusetp, - uint16_t *set, unsigned num) +check_cpuset(rte_cpuset_t *set) { - unsigned idx; - - CPU_ZERO(cpusetp); + unsigned int idx; - for (idx = 0; idx < num; idx++) { - if (!set[idx]) + for (idx = 0; idx < CPU_SETSIZE; idx++) { + if (!CPU_ISSET(idx, set)) continue; if (eal_cpu_detected(idx) == 0) { @@ -790,10 +786,7 @@ convert_to_cpuset(rte_cpuset_t *cpusetp, "unavailable\n", idx); return -1; } - - CPU_SET(idx, cpusetp); } - return 0; } @@ -815,7 +808,8 @@ static int eal_parse_lcores(const char *lcores) { struct rte_config *cfg = rte_eal_get_configuration(); - static uint16_t set[RTE_MAX_LCORE]; + rte_cpuset_t lcore_set; + unsigned int set_count; unsigned idx = 0; unsigned count = 0; const char *lcore_start = NULL; @@ -864,18 +858,13 @@ eal_parse_lcores(const char *lcores) lcores += strcspn(lcores, "@,"); if (*lcores == '@') { - /* explicit assign cpu_set */ - offset = eal_parse_set(lcores + 1, set, RTE_DIM(set)); + /* explicit assign cpuset and update the end cursor */ + offset = eal_parse_set(lcores + 1, &cpuset); if (offset < 0) goto err; - - /* prepare cpu_set and update the end cursor */ - if (0 > convert_to_cpuset(&cpuset, - set, RTE_DIM(set))) - goto err; end = lcores + 1 + offset; } else { /* ',' or '\0' */ - /* haven't given cpu_set, current loop done */ + /* haven't given cpuset, current loop done */ end = lcores; /* go back to check - */ @@ -889,18 +878,19 @@ eal_parse_lcores(const char *lcores) goto err; /* parse lcore_set from start point */ - if (0 > eal_parse_set(lcore_start, set, RTE_DIM(set))) + if (eal_parse_set(lcore_start, &lcore_set) < 0) goto err; - /* without '@', by default using lcore_set as cpu_set */ - if (*lcores != '@' && - 0 > convert_to_cpuset(&cpuset, set, RTE_DIM(set))) - goto err; + /* without '@', by default using lcore_set as cpuset */ + if (*lcores != '@') + rte_memcpy(&cpuset, &lcore_set, sizeof(cpuset)); + set_count = CPU_COUNT(&lcore_set); /* start to update lcore_set */ for (idx = 0; idx < RTE_MAX_LCORE; idx++) { - if (!set[idx]) + if (!CPU_ISSET(idx, &lcore_set)) continue; + set_count--; if (cfg->lcore_role[idx] != ROLE_RTE) { lcore_config[idx].core_index = count; @@ -912,10 +902,17 @@ eal_parse_lcores(const char *lcores) CPU_ZERO(&cpuset); CPU_SET(idx, &cpuset); } + + if (check_cpuset(&cpuset) < 0) + goto err; rte_memcpy(&lcore_config[idx].cpuset, &cpuset, sizeof(rte_cpuset_t)); } + /* some cores from the lcore_set can't be handled by EAL */ + if (set_count != 0) + goto err; + lcores = end + 1; } while (*end != '\0');