From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
To: andriy.shevchenko@linux.intel.com
Cc: platform-driver-x86@vger.kernel.org, prarit@redhat.com,
linux-kernel@vger.kernel.org,
Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Subject: [PATCH 07/27] tools/power/x86/intel-speed-select: Store topology information
Date: Thu, 5 Mar 2020 14:45:18 -0800 [thread overview]
Message-ID: <20200305224538.490864-8-srinivas.pandruvada@linux.intel.com> (raw)
In-Reply-To: <20200305224538.490864-1-srinivas.pandruvada@linux.intel.com>
Once the CPU is offline, the topology information (core-id, package-id,
die-id) is not accessible via sysfs. So when user selects a config level
more than base config 0 and offlined CPUs to match the config level,
to return to base config he has to manually online CPUs before. Without
this CPUs information mapping from Punit CPU numbering will lot work
as it needs atlest package id for each CPU.
To avoid this additional steps store the topology information in a file
, which is created on the very first run after boot. Since system boots
in base config and all CPUs are online, we can get information about
every CPU.
Once any of the APIs like get_physical_package_id(),
get_physical_core_id() or get_physical_die_id() fails to read from
sysfs, read from the stored mapping file.
This mapping file is stored in /tmp file system. so on every boot
it is recreated to make sure that any new CPUs are added to the
system before boot are taken into account.
But don't use the stored physical device id when trying to get
information for CPU to send message in for_each_online_package_in_set().
Here use the real value from syfs and in case fails try the next CPU.
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
.../x86/intel-speed-select/isst-config.c | 143 ++++++++++++++++--
1 file changed, 132 insertions(+), 11 deletions(-)
diff --git a/tools/power/x86/intel-speed-select/isst-config.c b/tools/power/x86/intel-speed-select/isst-config.c
index c773c6cc02a5..4773970cda9b 100644
--- a/tools/power/x86/intel-speed-select/isst-config.c
+++ b/tools/power/x86/intel-speed-select/isst-config.c
@@ -62,6 +62,13 @@ struct _cpu_map {
};
struct _cpu_map *cpu_map;
+struct cpu_topology {
+ short cpu;
+ short core_id;
+ short pkg_id;
+ short die_id;
+};
+
void debug_printf(const char *format, ...)
{
va_list args;
@@ -176,25 +183,137 @@ int out_format_is_json(void)
return out_format_json;
}
+static int get_stored_topology_info(int cpu, int *core_id, int *pkg_id, int *die_id)
+{
+ const char *pathname = "/tmp/isst_cpu_topology.dat";
+ struct cpu_topology cpu_top;
+ FILE *fp;
+ int ret;
+
+ fp = fopen(pathname, "rb");
+ if (!fp)
+ return -1;
+
+ ret = fseek(fp, cpu * sizeof(cpu_top), SEEK_SET);
+ if (ret)
+ goto err_ret;
+
+ ret = fread(&cpu_top, sizeof(cpu_top), 1, fp);
+ if (ret != 1) {
+ ret = -1;
+ goto err_ret;
+ }
+
+ *pkg_id = cpu_top.pkg_id;
+ *core_id = cpu_top.core_id;
+ *die_id = cpu_top.die_id;
+ ret = 0;
+
+err_ret:
+ fclose(fp);
+
+ return ret;
+}
+
+static void store_cpu_topology(void)
+{
+ const char *pathname = "/tmp/isst_cpu_topology.dat";
+ FILE *fp;
+ int i;
+
+ fp = fopen(pathname, "rb");
+ if (fp) {
+ /* Mapping already exists */
+ fclose(fp);
+ return;
+ }
+
+ fp = fopen(pathname, "wb");
+ if (!fp) {
+ fprintf(stderr, "Can't create file:%s\n", pathname);
+ return;
+ }
+
+ for (i = 0; i < topo_max_cpus; ++i) {
+ struct cpu_topology cpu_top;
+
+ cpu_top.core_id = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/core_id", i);
+ if (cpu_top.core_id < 0)
+ cpu_top.core_id = -1;
+
+ cpu_top.pkg_id = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/physical_package_id", i);
+ if (cpu_top.pkg_id < 0)
+ cpu_top.pkg_id = -1;
+
+ cpu_top.die_id = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/die_id", i);
+ if (cpu_top.die_id < 0)
+ cpu_top.die_id = -1;
+
+ cpu_top.cpu = i;
+
+ if (fwrite(&cpu_top, sizeof(cpu_top), 1, fp) != 1) {
+ fprintf(stderr, "Can't write to:%s\n", pathname);
+ break;
+ }
+ }
+
+ fclose(fp);
+}
+
int get_physical_package_id(int cpu)
{
- return parse_int_file(
- 0, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",
- cpu);
+ int ret;
+
+ ret = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",
+ cpu);
+ if (ret < 0) {
+ int core_id, pkg_id, die_id;
+
+ ret = get_stored_topology_info(cpu, &core_id, &pkg_id, &die_id);
+ if (!ret)
+ return pkg_id;
+ }
+
+ return ret;
}
int get_physical_core_id(int cpu)
{
- return parse_int_file(
- 0, "/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
+ int ret;
+
+ ret = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/core_id",
+ cpu);
+ if (ret < 0) {
+ int core_id, pkg_id, die_id;
+
+ ret = get_stored_topology_info(cpu, &core_id, &pkg_id, &die_id);
+ if (!ret)
+ return core_id;
+ }
+
+ return ret;
}
int get_physical_die_id(int cpu)
{
int ret;
- ret = parse_int_file(0, "/sys/devices/system/cpu/cpu%d/topology/die_id",
- cpu);
+ ret = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/die_id",
+ cpu);
+ if (ret < 0) {
+ int core_id, pkg_id, die_id;
+
+ ret = get_stored_topology_info(cpu, &core_id, &pkg_id, &die_id);
+ if (!ret)
+ return die_id;
+ }
+
if (ret < 0)
ret = 0;
@@ -266,11 +385,12 @@ static void for_each_online_package_in_set(void (*callback)(int, void *, void *,
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);
+
+ pkg_id = parse_int_file(0,
+ "/sys/devices/system/cpu/cpu%d/topology/physical_package_id", i);
+ if (pkg_id < 0)
continue;
- }
+
/* Create an unique id for package, die combination to store */
pkg_id = (MAX_PACKAGE_COUNT * pkg_id + die_id);
@@ -2352,6 +2472,7 @@ static void cmdline(int argc, char **argv)
printf("Intel(R) Speed Select Technology\n");
printf("Executing on CPU model:%d[0x%x]\n", cpu_model, cpu_model);
set_max_cpu_num();
+ store_cpu_topology();
set_cpu_present_cpu_mask();
set_cpu_target_cpu_mask();
--
2.24.1
next prev parent reply other threads:[~2020-03-05 22:45 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-05 22:45 [PATCH 00/27] tools/power/x86/intel-speed-select: Enhancements Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 01/27] tools/power/x86/intel-speed-select: Warn for invalid package id Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 02/27] tools/power/x86/intel-speed-select: Make target CPU optional for core-power info Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 03/27] tools/power/x86/intel-speed-select: Enhance core-power info command Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 04/27] tools/power/x86/intel-speed-select: Use more verbiage for clos information Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 05/27] tools/power/x86/intel-speed-select: Special handling for CPU 0 online/offline Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 06/27] tools/power/x86/intel-speed-select: Max CPU count calculation when CPU0 is offline Srinivas Pandruvada
2020-03-05 22:45 ` Srinivas Pandruvada [this message]
2020-03-05 22:45 ` [PATCH 08/27] tools/power/x86/intel-speed-select: Helpful warning for missing kernel interface Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 09/27] tools/power/x86/intel-speed-select: Enhance help Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 10/27] tools/power/x86/intel-speed-select: Enhance --info option Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 11/27] tools/power/x86/intel-speed-select: Add an API for error/information print Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 12/27] tools/power/x86/intel-speed-select: Improve error display for perf-profile feature Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 13/27] tools/power/x86/intel-speed-select: Check feature status first Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 14/27] tools/power/x86/intel-speed-select: Display error for invalid priority type Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 15/27] tools/power/x86/intel-speed-select: Enhance help for core-power assoc Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 16/27] tools/power/x86/intel-speed-select: Improve output of perf-profile commands Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 17/27] tools/power/x86/intel-speed-select: Improve error display for base-freq feature Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 18/27] tools/power/x86/intel-speed-select: Improve error display for turbo-freq feature Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 19/27] tools/power/x86/intel-speed-select: Kernel interface error handling Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 20/27] tools/power/x86/intel-speed-select: Improve core-power result and error display Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 21/27] tools/power/x86/intel-speed-select: Show error for invalid CPUs in the options Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 22/27] tools/power/x86/intel-speed-select: Improve CLX commands Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 23/27] tools/power/x86/intel-speed-select: Fix avx options for turbo-freq feature Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 24/27] tools/power/x86/intel-speed-select: Print friendly warning for bad command line Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 25/27] tools/power/x86/intel-speed-select: Add display for enabled cpus count Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 26/27] tools/power/x86/intel-speed-select: Avoid duplicate Package strings for json Srinivas Pandruvada
2020-03-05 22:45 ` [PATCH 27/27] tools/power/x86/intel-speed-select: Update version Srinivas Pandruvada
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200305224538.490864-8-srinivas.pandruvada@linux.intel.com \
--to=srinivas.pandruvada@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
--cc=prarit@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®