lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 08 Jan 2021 19:05:59 +0100
From:   "Rafael J. Wysocki" <>
To:     Peter Zijlstra <>
Cc:     Linux PM <>,
        LKML <>,
        x86 Maintainers <>,
        Srinivas Pandruvada <>,
        Giovanni Gherdovich <>,
        Giovanni Gherdovich <>
Subject: [PATCH] x86: PM: Register syscore_ops for scale invariance

From: Rafael J. Wysocki <>

On x86 scale invariace tends to be disabled during resume from
suspend-to-RAM, because the MPERF or APERF MSR values are not as
expected then due to updates taking place after the platform
firmware has been invoked to complete the suspend transition.

That, of course, is not desirable, especially if the schedutil
scaling governor is in use, because the lack of scale invariance
causes it to be less reliable.

To counter that effect, modify init_freq_invariance() to register
a syscore_ops object for scale invariance with the ->resume callback
pointing to init_counter_refs() which will run on the CPU starting
the resume transition (the other CPUs will be taken care of the
"online" operations taking place later).

Fixes: e2b0d619b400 ("x86, sched: check for counters overflow in frequency invariant accounting")
Signed-off-by: Rafael J. Wysocki <>
 arch/x86/kernel/smpboot.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Index: linux-pm/arch/x86/kernel/smpboot.c
--- linux-pm.orig/arch/x86/kernel/smpboot.c
+++ linux-pm/arch/x86/kernel/smpboot.c
@@ -56,6 +56,7 @@
 #include <linux/numa.h>
 #include <linux/pgtable.h>
 #include <linux/overflow.h>
+#include <linux/syscore_ops.h>
 #include <asm/acpi.h>
 #include <asm/desc.h>
@@ -2083,6 +2084,23 @@ static void init_counter_refs(void)
 	this_cpu_write(arch_prev_mperf, mperf);
+static struct syscore_ops freq_invariance_syscore_ops = {
+	.resume = init_counter_refs,
+static void register_freq_invariance_syscore_ops(void)
+	/* Bail out if registered already. */
+	if (freq_invariance_syscore_ops.node.prev)
+		return;
+	register_syscore_ops(&freq_invariance_syscore_ops);
+static inline void register_freq_invariance_syscore_ops(void) {}
 static void init_freq_invariance(bool secondary, bool cppc_ready)
 	bool ret = false;
@@ -2109,6 +2127,7 @@ static void init_freq_invariance(bool se
 	if (ret) {
+		register_freq_invariance_syscore_ops();
 		pr_info("Estimated ratio of average max frequency by base frequency (times 1024): %llu\n", arch_max_freq_ratio);
 	} else {
 		pr_debug("Couldn't determine max cpu frequency, necessary for scale-invariant accounting.\n");

Powered by blists - more mailing lists