tools/power turbostat: track thread ID in cpu_topology
The code can be simplified if the cpu_topology *cpus tracks the thread IDs. This removes an additional file lookup and simplifies the counter initialization code. Add thread ID to cpu_topology information and cleanup the counter initialization code. v2: prevent thread_id from being overwritten Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
ef6057417a
commit
8cb48b32a5
@ -263,6 +263,7 @@ struct cpu_topology {
|
|||||||
int physical_node_id;
|
int physical_node_id;
|
||||||
int logical_node_id; /* 0-based count within the package */
|
int logical_node_id; /* 0-based count within the package */
|
||||||
int physical_core_id;
|
int physical_core_id;
|
||||||
|
int thread_id;
|
||||||
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
|
cpu_set_t *put_ids; /* Processing Unit/Thread IDs */
|
||||||
} *cpus;
|
} *cpus;
|
||||||
|
|
||||||
@ -2345,44 +2346,6 @@ int parse_int_file(const char *fmt, ...)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* get_cpu_position_in_core(cpu)
|
|
||||||
* return the position of the CPU among its HT siblings in the core
|
|
||||||
* return -1 if the sibling is not in list
|
|
||||||
*/
|
|
||||||
int get_cpu_position_in_core(int cpu)
|
|
||||||
{
|
|
||||||
char path[64];
|
|
||||||
FILE *filep;
|
|
||||||
int this_cpu;
|
|
||||||
char character;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
sprintf(path,
|
|
||||||
"/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list",
|
|
||||||
cpu);
|
|
||||||
filep = fopen(path, "r");
|
|
||||||
if (filep == NULL) {
|
|
||||||
perror(path);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < topo.num_threads_per_core; i++) {
|
|
||||||
fscanf(filep, "%d", &this_cpu);
|
|
||||||
if (this_cpu == cpu) {
|
|
||||||
fclose(filep);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Account for no separator after last thread*/
|
|
||||||
if (i != (topo.num_threads_per_core - 1))
|
|
||||||
fscanf(filep, "%c", &character);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(filep);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cpu_is_first_core_in_package(cpu)
|
* cpu_is_first_core_in_package(cpu)
|
||||||
* return 1 if given CPU is 1st core in package
|
* return 1 if given CPU is 1st core in package
|
||||||
@ -2473,12 +2436,15 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
|
|||||||
char path[80], character;
|
char path[80], character;
|
||||||
FILE *filep;
|
FILE *filep;
|
||||||
unsigned long map;
|
unsigned long map;
|
||||||
int shift, sib_core;
|
int so, shift, sib_core;
|
||||||
int cpu = thiscpu->logical_cpu_id;
|
int cpu = thiscpu->logical_cpu_id;
|
||||||
int offset = topo.max_cpu_num + 1;
|
int offset = topo.max_cpu_num + 1;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
int thread_id = 0;
|
||||||
|
|
||||||
thiscpu->put_ids = CPU_ALLOC((topo.max_cpu_num + 1));
|
thiscpu->put_ids = CPU_ALLOC((topo.max_cpu_num + 1));
|
||||||
|
if (thiscpu->thread_id < 0)
|
||||||
|
thiscpu->thread_id = thread_id++;
|
||||||
if (!thiscpu->put_ids)
|
if (!thiscpu->put_ids)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -2493,10 +2459,15 @@ int get_thread_siblings(struct cpu_topology *thiscpu)
|
|||||||
fscanf(filep, "%lx%c", &map, &character);
|
fscanf(filep, "%lx%c", &map, &character);
|
||||||
for (shift = 0; shift < BITMASK_SIZE; shift++) {
|
for (shift = 0; shift < BITMASK_SIZE; shift++) {
|
||||||
if ((map >> shift) & 0x1) {
|
if ((map >> shift) & 0x1) {
|
||||||
sib_core = get_core_id(shift + offset);
|
so = shift + offset;
|
||||||
if (sib_core == thiscpu->physical_core_id)
|
sib_core = get_core_id(so);
|
||||||
CPU_SET_S(shift + offset, size,
|
if (sib_core == thiscpu->physical_core_id) {
|
||||||
thiscpu->put_ids);
|
CPU_SET_S(so, size, thiscpu->put_ids);
|
||||||
|
if ((so != cpu) &&
|
||||||
|
(cpus[so].thread_id < 0))
|
||||||
|
cpus[so].thread_id =
|
||||||
|
thread_id++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (!strncmp(&character, ",", 1));
|
} while (!strncmp(&character, ",", 1));
|
||||||
@ -2617,6 +2588,12 @@ int mark_cpu_present(int cpu)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int init_thread_id(int cpu)
|
||||||
|
{
|
||||||
|
cpus[cpu].thread_id = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* snapshot_proc_interrupts()
|
* snapshot_proc_interrupts()
|
||||||
*
|
*
|
||||||
@ -4703,6 +4680,7 @@ void topology_probe()
|
|||||||
cpu_affinity_setsize = CPU_ALLOC_SIZE((topo.max_cpu_num + 1));
|
cpu_affinity_setsize = CPU_ALLOC_SIZE((topo.max_cpu_num + 1));
|
||||||
CPU_ZERO_S(cpu_affinity_setsize, cpu_affinity_set);
|
CPU_ZERO_S(cpu_affinity_setsize, cpu_affinity_set);
|
||||||
|
|
||||||
|
for_all_proc_cpus(init_thread_id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For online cpus
|
* For online cpus
|
||||||
@ -4738,12 +4716,16 @@ void topology_probe()
|
|||||||
siblings = get_thread_siblings(&cpus[i]);
|
siblings = get_thread_siblings(&cpus[i]);
|
||||||
if (siblings > max_siblings)
|
if (siblings > max_siblings)
|
||||||
max_siblings = siblings;
|
max_siblings = siblings;
|
||||||
|
if (cpus[i].thread_id != -1)
|
||||||
|
topo.num_cores++;
|
||||||
|
|
||||||
if (debug > 1)
|
if (debug > 1)
|
||||||
fprintf(outf, "cpu %d pkg %d node %d core %d\n",
|
fprintf(outf,
|
||||||
|
"cpu %d pkg %d node %d core %d thread %d\n",
|
||||||
i, cpus[i].physical_package_id,
|
i, cpus[i].physical_package_id,
|
||||||
cpus[i].physical_node_id,
|
cpus[i].physical_node_id,
|
||||||
cpus[i].physical_core_id);
|
cpus[i].physical_core_id,
|
||||||
|
cpus[i].thread_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
topo.num_cores_per_pkg = max_core_id + 1;
|
topo.num_cores_per_pkg = max_core_id + 1;
|
||||||
@ -4805,47 +4787,38 @@ error:
|
|||||||
/*
|
/*
|
||||||
* init_counter()
|
* init_counter()
|
||||||
*
|
*
|
||||||
* set cpu_id, core_num, pkg_num
|
|
||||||
* set FIRST_THREAD_IN_CORE and FIRST_CORE_IN_PACKAGE
|
* set FIRST_THREAD_IN_CORE and FIRST_CORE_IN_PACKAGE
|
||||||
*
|
|
||||||
* increment topo.num_cores when 1st core in pkg seen
|
|
||||||
*/
|
*/
|
||||||
void init_counter(struct thread_data *thread_base, struct core_data *core_base,
|
void init_counter(struct thread_data *thread_base, struct core_data *core_base,
|
||||||
struct pkg_data *pkg_base, int thread_num, int core_num,
|
struct pkg_data *pkg_base, int cpu_id)
|
||||||
int pkg_num, int cpu_id)
|
|
||||||
{
|
{
|
||||||
|
int pkg_id = cpus[cpu_id].physical_package_id;
|
||||||
|
int core_id = cpus[cpu_id].physical_core_id;
|
||||||
|
int thread_id = cpus[cpu_id].thread_id;
|
||||||
struct thread_data *t;
|
struct thread_data *t;
|
||||||
struct core_data *c;
|
struct core_data *c;
|
||||||
struct pkg_data *p;
|
struct pkg_data *p;
|
||||||
|
|
||||||
t = GET_THREAD(thread_base, thread_num, core_num, pkg_num);
|
t = GET_THREAD(thread_base, thread_id, core_id, pkg_id);
|
||||||
c = GET_CORE(core_base, core_num, pkg_num);
|
c = GET_CORE(core_base, core_id, pkg_id);
|
||||||
p = GET_PKG(pkg_base, pkg_num);
|
p = GET_PKG(pkg_base, pkg_id);
|
||||||
|
|
||||||
t->cpu_id = cpu_id;
|
t->cpu_id = cpu_id;
|
||||||
if (thread_num == 0) {
|
if (thread_id == 0) {
|
||||||
t->flags |= CPU_IS_FIRST_THREAD_IN_CORE;
|
t->flags |= CPU_IS_FIRST_THREAD_IN_CORE;
|
||||||
if (cpu_is_first_core_in_package(cpu_id))
|
if (cpu_is_first_core_in_package(cpu_id))
|
||||||
t->flags |= CPU_IS_FIRST_CORE_IN_PACKAGE;
|
t->flags |= CPU_IS_FIRST_CORE_IN_PACKAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
c->core_id = core_num;
|
c->core_id = core_id;
|
||||||
p->package_id = pkg_num;
|
p->package_id = pkg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int initialize_counters(int cpu_id)
|
int initialize_counters(int cpu_id)
|
||||||
{
|
{
|
||||||
int my_thread_id, my_core_id, my_package_id;
|
init_counter(EVEN_COUNTERS, cpu_id);
|
||||||
|
init_counter(ODD_COUNTERS, cpu_id);
|
||||||
my_package_id = get_physical_package_id(cpu_id);
|
|
||||||
my_core_id = get_core_id(cpu_id);
|
|
||||||
my_thread_id = get_cpu_position_in_core(cpu_id);
|
|
||||||
if (!my_thread_id)
|
|
||||||
topo.num_cores++;
|
|
||||||
|
|
||||||
init_counter(EVEN_COUNTERS, my_thread_id, my_core_id, my_package_id, cpu_id);
|
|
||||||
init_counter(ODD_COUNTERS, my_thread_id, my_core_id, my_package_id, cpu_id);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user