OSDN Git Service

tools/power/x86/intel-speed-select: cpufreq reads on offline CPUs
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Sat, 7 Jan 2023 01:44:26 +0000 (17:44 -0800)
committerHans de Goede <hdegoede@redhat.com>
Fri, 3 Feb 2023 08:57:07 +0000 (09:57 +0100)
Due to some recent kernel changes, reading cpufreq attributes like
scaling_max_freq on offline CPUs returns error. So avoid reading
cpufreq attributes on offline CPUs.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
tools/power/x86/intel-speed-select/isst-config.c

index b549e6f..2a737bf 100644 (file)
@@ -413,6 +413,33 @@ int get_topo_max_cpus(void)
        return topo_max_cpus;
 }
 
+static unsigned int is_cpu_online(int cpu)
+{
+       char buffer[128];
+       int fd, ret;
+       unsigned char online;
+
+       snprintf(buffer, sizeof(buffer),
+                "/sys/devices/system/cpu/cpu%d/online", cpu);
+
+       fd = open(buffer, O_RDONLY);
+       if (fd < 0)
+               return fd;
+
+       ret = read(fd, &online, sizeof(online));
+       close(fd);
+
+       if (ret == -1)
+               return ret;
+
+       if (online == '1')
+               online = 1;
+       else
+               online = 0;
+
+       return online;
+}
+
 void set_cpu_online_offline(int cpu, int state)
 {
        char buffer[128];
@@ -1603,6 +1630,9 @@ static void set_scaling_min_to_cpuinfo_max(struct isst_id *id)
                if (!is_cpu_in_power_domain(i, id))
                        continue;
 
+               if (is_cpu_online(i) != 1)
+                       continue;
+
                adjust_scaling_max_from_base_freq(i);
                set_cpufreq_scaling_min_max_from_cpuinfo(i, 1, 0);
                adjust_scaling_min_from_base_freq(i);
@@ -1617,6 +1647,9 @@ static void set_scaling_min_to_cpuinfo_min(struct isst_id *id)
                if (!is_cpu_in_power_domain(i, id))
                        continue;
 
+               if (is_cpu_online(i) != 1)
+                       continue;
+
                adjust_scaling_max_from_base_freq(i);
                set_cpufreq_scaling_min_max_from_cpuinfo(i, 0, 0);
        }