tools/power/x86/intel-speed-select: Optimize CPU initialization

Optimize CPU initialization.
Do cpu related initialization in one function, including setting the cpu
present_cpumask, target_cpumask, and cpu_map and core_count arrays.

Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
This commit is contained in:
Zhang Rui 2022-08-20 23:58:27 +08:00 committed by Srinivas Pandruvada
parent ca56725d78
commit 921604b409

View file

@ -584,40 +584,6 @@ void free_cpu_set(cpu_set_t *cpu_set)
}
static int cpu_cnt[MAX_PACKAGE_COUNT][MAX_DIE_PER_PACKAGE];
static void set_cpu_present_cpu_mask(void)
{
size_t size;
DIR *dir;
int i;
size = alloc_cpu_set(&present_cpumask);
present_cpumask_size = size;
for (i = 0; i < topo_max_cpus; ++i) {
char buffer[256];
snprintf(buffer, sizeof(buffer),
"/sys/devices/system/cpu/cpu%d", i);
dir = opendir(buffer);
if (dir) {
int pkg_id, die_id;
CPU_SET_S(i, size, present_cpumask);
die_id = get_physical_die_id(i);
if (die_id < 0)
die_id = 0;
pkg_id = get_physical_package_id(i);
if (pkg_id < 0) {
fprintf(stderr, "Failed to get package id, CPU %d may be offline\n", i);
continue;
}
if (pkg_id < MAX_PACKAGE_COUNT &&
die_id < MAX_DIE_PER_PACKAGE)
cpu_cnt[pkg_id][die_id]++;
}
closedir(dir);
}
}
int get_max_punit_core_id(struct isst_id *id)
{
@ -645,25 +611,11 @@ int get_cpu_count(struct isst_id *id)
return cpu_cnt[id->pkg][id->die];
}
static void set_cpu_target_cpu_mask(void)
{
size_t size;
int i;
size = alloc_cpu_set(&target_cpumask);
target_cpumask_size = size;
for (i = 0; i < max_target_cpus; ++i) {
if (!CPU_ISSET_S(target_cpus[i], present_cpumask_size,
present_cpumask))
continue;
CPU_SET_S(target_cpus[i], size, target_cpumask);
}
}
static void create_cpu_map(void)
{
const char *pathname = "/dev/isst_interface";
size_t size;
DIR *dir;
int i, fd = 0;
struct isst_if_cpu_maps map;
@ -676,15 +628,37 @@ static void create_cpu_map(void)
if (fd < 0 && !is_clx_n_platform())
err(-1, "%s open failed", pathname);
size = alloc_cpu_set(&present_cpumask);
present_cpumask_size = size;
for (i = 0; i < topo_max_cpus; ++i) {
if (!CPU_ISSET_S(i, present_cpumask_size, present_cpumask))
char buffer[256];
int pkg_id, die_id, core_id;
/* check if CPU is online */
snprintf(buffer, sizeof(buffer),
"/sys/devices/system/cpu/cpu%d", i);
dir = opendir(buffer);
if (!dir)
continue;
closedir(dir);
CPU_SET_S(i, size, present_cpumask);
pkg_id = get_physical_package_id(i);
die_id = get_physical_die_id(i);
core_id = get_physical_core_id(i);
if (pkg_id < 0 || die_id < 0 || core_id < 0)
continue;
cpu_map[i].core_id = get_physical_core_id(i);
cpu_map[i].pkg_id = get_physical_package_id(i);
cpu_map[i].die_id = get_physical_die_id(i);
cpu_map[i].pkg_id = pkg_id;
cpu_map[i].die_id = die_id;
cpu_map[i].core_id = core_id;
cpu_map[i].initialized = 1;
cpu_cnt[pkg_id][die_id]++;
if (fd < 0)
continue;
map.cmd_count = 1;
@ -707,9 +681,18 @@ static void create_cpu_map(void)
cpu_map[i].pkg_id, cpu_map[i].punit_cpu,
cpu_map[i].punit_cpu_core);
}
if (fd >= 0)
close(fd);
size = alloc_cpu_set(&target_cpumask);
target_cpumask_size = size;
for (i = 0; i < max_target_cpus; ++i) {
if (!CPU_ISSET_S(target_cpus[i], present_cpumask_size,
present_cpumask))
continue;
CPU_SET_S(target_cpus[i], size, target_cpumask);
}
}
void set_cpu_mask_from_punit_coremask(struct isst_id *id, unsigned long long core_mask,
@ -1039,7 +1022,6 @@ static void isst_print_platform_information(void)
/* Early initialization to create working cpu_map */
set_max_cpu_num();
set_cpu_present_cpu_mask();
create_cpu_map();
fd = open(pathname, O_RDWR);
@ -2975,8 +2957,6 @@ static void cmdline(int argc, char **argv)
if (force_cpus_online)
force_all_cpus_online();
store_cpu_topology();
set_cpu_present_cpu_mask();
set_cpu_target_cpu_mask();
create_cpu_map();
if (oob_mode) {