Skip to content

Commit

Permalink
tools/power/turbostat: Abstrct function for parsing cpu string
Browse files Browse the repository at this point in the history
Abstract parse_cpu_str() which can update any specified cpu_set by a
given cpu string. This can be used to handle further CPU limitations
from other sources like cgroup.

The cpu string parsing code is also enhanced to handle the strings that
have an extra '\n' before string terminator.

Signed-off-by: Zhang Rui <[email protected]>
  • Loading branch information
zhang-rui committed Oct 24, 2023
1 parent c25ef0e commit 8c3dd2c
Showing 1 changed file with 55 additions and 49 deletions.
104 changes: 55 additions & 49 deletions tools/power/x86/turbostat/turbostat.c
Original file line number Diff line number Diff line change
Expand Up @@ -3565,6 +3565,59 @@ int get_physical_node_id(struct cpu_topology *thiscpu)
return -1;
}

static int parse_cpu_str(char *cpu_str, cpu_set_t *cpu_set, int cpu_set_size)
{
unsigned int start, end;
char *next = cpu_str;

while (next && *next) {

if (*next == '-') /* no negative cpu numbers */
return 1;

start = strtoul(next, &next, 10);

if (start >= CPU_SUBSET_MAXCPUS)
return 1;
CPU_SET_S(start, cpu_set_size, cpu_set);

if (*next == '\0' || *next == '\n')
break;

if (*next == ',') {
next += 1;
continue;
}

if (*next == '-') {
next += 1; /* start range */
} else if (*next == '.') {
next += 1;
if (*next == '.')
next += 1; /* start range */
else
return 1;
}

end = strtoul(next, &next, 10);
if (end <= start)
return 1;

while (++start <= end) {
if (start >= CPU_SUBSET_MAXCPUS)
return 1;
CPU_SET_S(start, cpu_set_size, cpu_set);
}

if (*next == ',')
next += 1;
else if (*next != '\0' && *next != '\n')
return 1;
}

return 0;
}

int get_thread_siblings(struct cpu_topology *thiscpu)
{
char path[80], character;
Expand Down Expand Up @@ -6384,9 +6437,6 @@ void probe_sysfs(void)
*/
void parse_cpu_command(char *optarg)
{
unsigned int start, end;
char *next;

if (!strcmp(optarg, "core")) {
if (cpu_subset)
goto error;
Expand All @@ -6409,52 +6459,8 @@ void parse_cpu_command(char *optarg)

CPU_ZERO_S(cpu_subset_size, cpu_subset);

next = optarg;

while (next && *next) {

if (*next == '-') /* no negative cpu numbers */
goto error;

start = strtoul(next, &next, 10);

if (start >= CPU_SUBSET_MAXCPUS)
goto error;
CPU_SET_S(start, cpu_subset_size, cpu_subset);

if (*next == '\0')
break;

if (*next == ',') {
next += 1;
continue;
}

if (*next == '-') {
next += 1; /* start range */
} else if (*next == '.') {
next += 1;
if (*next == '.')
next += 1; /* start range */
else
goto error;
}

end = strtoul(next, &next, 10);
if (end <= start)
goto error;

while (++start <= end) {
if (start >= CPU_SUBSET_MAXCPUS)
goto error;
CPU_SET_S(start, cpu_subset_size, cpu_subset);
}

if (*next == ',')
next += 1;
else if (*next != '\0')
goto error;
}
if (parse_cpu_str(optarg, cpu_subset, cpu_subset_size))
goto error;

return;

Expand Down

0 comments on commit 8c3dd2c

Please sign in to comment.