tools/power/x86/intel-speed-select: Prevent CPU 0 offline
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Tue, 8 Aug 2023 21:12:01 +0000 (14:12 -0700)
committerSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Tue, 8 Aug 2023 22:16:40 +0000 (15:16 -0700)
Kernel 6.5 version deprecated CPU 0 hotplug. This will cause all
requests to fail to offline CPU 0. Check version number of kernel
and ignore CPU 0 hotplug request with debug aid to use cgroup
isolation feature for CPU 0.

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

index b4864f3477da9b81bedad3c042a09d92aeb2e016..bddc71f7730893065b3813314bd88e6f934cb6f6 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <linux/isst_if.h>
+#include <sys/utsname.h>
 
 #include "isst.h"
 
@@ -473,11 +474,44 @@ static unsigned int is_cpu_online(int cpu)
        return online;
 }
 
+static int get_kernel_version(int *major, int *minor)
+{
+       struct utsname buf;
+       int ret;
+
+       ret = uname(&buf);
+       if (ret)
+               return ret;
+
+       ret = sscanf(buf.release, "%d.%d", major, minor);
+       if (ret != 2)
+               return ret;
+
+       return 0;
+}
+
+#define CPU0_HOTPLUG_DEPRECATE_MAJOR_VER       6
+#define CPU0_HOTPLUG_DEPRECATE_MINOR_VER       5
+
 void set_cpu_online_offline(int cpu, int state)
 {
        char buffer[128];
        int fd, ret;
 
+       if (!cpu) {
+               int major, minor;
+
+               ret = get_kernel_version(&major, &minor);
+               if (!ret) {
+                       if (major > CPU0_HOTPLUG_DEPRECATE_MAJOR_VER || (major == CPU0_HOTPLUG_DEPRECATE_MAJOR_VER &&
+                               minor >= CPU0_HOTPLUG_DEPRECATE_MINOR_VER)) {
+                               debug_printf("Ignore CPU 0 offline/online for kernel version >= %d.%d\n", major, minor);
+                               debug_printf("Use cgroups to isolate CPU 0\n");
+                               return;
+                       }
+               }
+       }
+
        snprintf(buffer, sizeof(buffer),
                 "/sys/devices/system/cpu/cpu%d/online", cpu);