eal: remove limitation on cpuset with --lcores

Contrary to the -c/-l options, where a logical core runs on the same
physical core in a 1:1 fashion (example: lcore 0 runs on core 0, lcore
16 runs on core 16), the --lcores option makes it possible to select the
physical cores on which runs a logical core.

However the current parsing code still limits the cpuset to the
[0, RTE_MAX_LCORE] range.

Example, before the patch, on a 24 cores system with RTE_MAX_LCORE == 16:
$ ./master/app/testpmd --no-huge --no-pci -m 512 --log-level *:debug \
 --lcores 0@16,1@17 -- -i --total-num-mbufs 2048
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 1 on socket 0
EAL: Detected lcore 2 as core 2 on socket 0
EAL: Detected lcore 3 as core 3 on socket 0
EAL: Detected lcore 4 as core 4 on socket 0
EAL: Detected lcore 5 as core 5 on socket 0
EAL: Detected lcore 6 as core 6 on socket 0
EAL: Detected lcore 7 as core 8 on socket 0
EAL: Detected lcore 8 as core 9 on socket 0
EAL: Detected lcore 9 as core 10 on socket 0
EAL: Detected lcore 10 as core 11 on socket 0
EAL: Detected lcore 11 as core 12 on socket 0
EAL: Detected lcore 12 as core 13 on socket 0
EAL: Detected lcore 13 as core 14 on socket 0
EAL: Detected lcore 14 as core 0 on socket 0
EAL: Detected lcore 15 as core 1 on socket 0
EAL: Skipped lcore 16 as core 2 on socket 0
EAL: Skipped lcore 17 as core 3 on socket 0
EAL: Skipped lcore 18 as core 4 on socket 0
EAL: Skipped lcore 19 as core 5 on socket 0
EAL: Skipped lcore 20 as core 6 on socket 0
EAL: Skipped lcore 21 as core 8 on socket 0
EAL: Skipped lcore 22 as core 9 on socket 0
EAL: Skipped lcore 23 as core 10 on socket 0
EAL: Skipped lcore 24 as core 11 on socket 0
EAL: Skipped lcore 25 as core 12 on socket 0
EAL: Skipped lcore 26 as core 13 on socket 0
EAL: Skipped lcore 27 as core 14 on socket 0
EAL: Support maximum 16 logical core(s) by configuration.
EAL: Detected 16 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: invalid parameter for --lcores

We can remove this limitation by using a cpuset_t (which is a more
natural type since this is what gets passed to pthread_setaffinity*
in the end).

After the patch:
$ ./master/app/testpmd --no-huge --no-pci -m 512 --log-level *:debug \
 --lcores 0@16,1@17 -- -i --total-num-mbufs 2048
[...]
EAL: Master lcore 0 is ready (tid=7f94217bbc00;cpuset=[16])
EAL: lcore 1 is ready (tid=7f941f491700;cpuset=[17])

Signed-off-by: David Marchand <david.marchand@redhat.com>
This commit is contained in:
David Marchand 2019-12-02 16:42:20 +01:00 committed by Thomas Monjalon
parent 927b5499c5
commit 8674b203f1
3 changed files with 49 additions and 47 deletions

View File

@ -365,20 +365,25 @@ dpaa2_check_lcore_cpuset(void)
dpaa2_cpu[lcore_id] = 0xffffffff; dpaa2_cpu[lcore_id] = 0xffffffff;
for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) { for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
for (i = 0; i < RTE_MAX_LCORE; i++) { rte_cpuset_t cpuset = rte_lcore_cpuset(lcore_id);
rte_cpuset_t cpuset = rte_lcore_cpuset(lcore_id);
if (CPU_ISSET(i, &cpuset)) { for (i = 0; i < CPU_SETSIZE; i++) {
RTE_LOG(DEBUG, EAL, "lcore id = %u cpu=%u\n", if (!CPU_ISSET(i, &cpuset))
lcore_id, i); continue;
if (dpaa2_cpu[lcore_id] != 0xffffffff) { if (i >= RTE_MAX_LCORE) {
DPAA2_BUS_ERR( DPAA2_BUS_ERR("ERR:lcore map to core %u (>= %u) not supported",
"ERR:lcore map to multi-cpu not supported"); i, RTE_MAX_LCORE);
ret = -1; ret = -1;
} else { continue;
dpaa2_cpu[lcore_id] = i;
}
} }
RTE_LOG(DEBUG, EAL, "lcore id = %u cpu=%u\n",
lcore_id, i);
if (dpaa2_cpu[lcore_id] != 0xffffffff) {
DPAA2_BUS_ERR("ERR:lcore map to multi-cpu not supported");
ret = -1;
continue;
}
dpaa2_cpu[lcore_id] = i;
} }
} }
return ret; return ret;

View File

@ -658,14 +658,14 @@ eal_parse_master_lcore(const char *arg)
* ',' used for a single number. * ',' used for a single number.
*/ */
static int 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; unsigned idx;
const char *str = input; const char *str = input;
char *end = NULL; char *end = NULL;
unsigned min, max; unsigned min, max;
memset(set, 0, num * sizeof(uint16_t)); CPU_ZERO(set);
while (isblank(*str)) while (isblank(*str))
str++; str++;
@ -678,7 +678,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
if (*str != '(') { if (*str != '(') {
errno = 0; errno = 0;
idx = strtoul(str, &end, 10); idx = strtoul(str, &end, 10);
if (errno || end == NULL || idx >= num) if (errno || end == NULL || idx >= CPU_SETSIZE)
return -1; return -1;
else { else {
while (isblank(*end)) while (isblank(*end))
@ -696,7 +696,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
errno = 0; errno = 0;
idx = strtoul(end, &end, 10); idx = strtoul(end, &end, 10);
if (errno || end == NULL || idx >= num) if (errno || end == NULL || idx >= CPU_SETSIZE)
return -1; return -1;
max = idx; max = idx;
while (isblank(*end)) while (isblank(*end))
@ -711,7 +711,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
for (idx = RTE_MIN(min, max); for (idx = RTE_MIN(min, max);
idx <= RTE_MAX(min, max); idx++) idx <= RTE_MAX(min, max); idx++)
set[idx] = 1; CPU_SET(idx, set);
return end - input; return end - input;
} }
@ -736,7 +736,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
/* get the digit value */ /* get the digit value */
errno = 0; errno = 0;
idx = strtoul(str, &end, 10); idx = strtoul(str, &end, 10);
if (errno || end == NULL || idx >= num) if (errno || end == NULL || idx >= CPU_SETSIZE)
return -1; return -1;
/* go ahead to separator '-',',' and ')' */ /* go ahead to separator '-',',' and ')' */
@ -753,7 +753,7 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
min = idx; min = idx;
for (idx = RTE_MIN(min, max); for (idx = RTE_MIN(min, max);
idx <= RTE_MAX(min, max); idx++) idx <= RTE_MAX(min, max); idx++)
set[idx] = 1; CPU_SET(idx, set);
min = RTE_MAX_LCORE; min = RTE_MAX_LCORE;
} else } else
@ -772,17 +772,13 @@ eal_parse_set(const char *input, uint16_t set[], unsigned num)
return str - input; return str - input;
} }
/* convert from set array to cpuset bitmap */
static int static int
convert_to_cpuset(rte_cpuset_t *cpusetp, check_cpuset(rte_cpuset_t *set)
uint16_t *set, unsigned num)
{ {
unsigned idx; unsigned int idx;
CPU_ZERO(cpusetp); for (idx = 0; idx < CPU_SETSIZE; idx++) {
if (!CPU_ISSET(idx, set))
for (idx = 0; idx < num; idx++) {
if (!set[idx])
continue; continue;
if (eal_cpu_detected(idx) == 0) { if (eal_cpu_detected(idx) == 0) {
@ -790,10 +786,7 @@ convert_to_cpuset(rte_cpuset_t *cpusetp,
"unavailable\n", idx); "unavailable\n", idx);
return -1; return -1;
} }
CPU_SET(idx, cpusetp);
} }
return 0; return 0;
} }
@ -815,7 +808,8 @@ static int
eal_parse_lcores(const char *lcores) eal_parse_lcores(const char *lcores)
{ {
struct rte_config *cfg = rte_eal_get_configuration(); 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 idx = 0;
unsigned count = 0; unsigned count = 0;
const char *lcore_start = NULL; const char *lcore_start = NULL;
@ -864,18 +858,13 @@ eal_parse_lcores(const char *lcores)
lcores += strcspn(lcores, "@,"); lcores += strcspn(lcores, "@,");
if (*lcores == '@') { if (*lcores == '@') {
/* explicit assign cpu_set */ /* explicit assign cpuset and update the end cursor */
offset = eal_parse_set(lcores + 1, set, RTE_DIM(set)); offset = eal_parse_set(lcores + 1, &cpuset);
if (offset < 0) if (offset < 0)
goto err; 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; end = lcores + 1 + offset;
} else { /* ',' or '\0' */ } else { /* ',' or '\0' */
/* haven't given cpu_set, current loop done */ /* haven't given cpuset, current loop done */
end = lcores; end = lcores;
/* go back to check <number>-<number> */ /* go back to check <number>-<number> */
@ -889,18 +878,19 @@ eal_parse_lcores(const char *lcores)
goto err; goto err;
/* parse lcore_set from start point */ /* 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; goto err;
/* without '@', by default using lcore_set as cpu_set */ /* without '@', by default using lcore_set as cpuset */
if (*lcores != '@' && if (*lcores != '@')
0 > convert_to_cpuset(&cpuset, set, RTE_DIM(set))) rte_memcpy(&cpuset, &lcore_set, sizeof(cpuset));
goto err;
set_count = CPU_COUNT(&lcore_set);
/* start to update lcore_set */ /* start to update lcore_set */
for (idx = 0; idx < RTE_MAX_LCORE; idx++) { for (idx = 0; idx < RTE_MAX_LCORE; idx++) {
if (!set[idx]) if (!CPU_ISSET(idx, &lcore_set))
continue; continue;
set_count--;
if (cfg->lcore_role[idx] != ROLE_RTE) { if (cfg->lcore_role[idx] != ROLE_RTE) {
lcore_config[idx].core_index = count; lcore_config[idx].core_index = count;
@ -912,10 +902,17 @@ eal_parse_lcores(const char *lcores)
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
CPU_SET(idx, &cpuset); CPU_SET(idx, &cpuset);
} }
if (check_cpuset(&cpuset) < 0)
goto err;
rte_memcpy(&lcore_config[idx].cpuset, &cpuset, rte_memcpy(&lcore_config[idx].cpuset, &cpuset,
sizeof(rte_cpuset_t)); 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; lcores = end + 1;
} while (*end != '\0'); } while (*end != '\0');

View File

@ -61,7 +61,7 @@ eal_cpuset_socket_id(rte_cpuset_t *cpusetp)
break; break;
} }
} while (++cpu < RTE_MAX_LCORE); } while (++cpu < CPU_SETSIZE);
return socket_id; return socket_id;
} }
@ -118,7 +118,7 @@ eal_thread_dump_affinity(char *str, unsigned size)
rte_thread_get_affinity(&cpuset); rte_thread_get_affinity(&cpuset);
for (cpu = 0; cpu < RTE_MAX_LCORE; cpu++) { for (cpu = 0; cpu < CPU_SETSIZE; cpu++) {
if (!CPU_ISSET(cpu, &cpuset)) if (!CPU_ISSET(cpu, &cpuset))
continue; continue;