x86/CPU/AMD: Don’t force the CPB cap when running under a hypervisor [Linux 4.14.129]

x86/CPU/AMD: Don’t force the CPB cap when running under a hypervisor [Linux 4.14.129]

This Linux kernel change "x86/CPU/AMD: Don’t force the CPB cap when running under a hypervisor" is included in the Linux 4.14.129 release. This change is authored by Frank van der Linden <fllinden [at] amazon.com> on Wed May 22 22:17:45 2019 +0000. The commit for this change in Linux stable tree is 746b9c0 (patch) which is from upstream commit 2ac44ab. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 2ac44ab.

x86/CPU/AMD: Don't force the CPB cap when running under a hypervisor

[ Upstream commit 2ac44ab608705948564791ce1d15d43ba81a1e38 ]

For F17h AMD CPUs, the CPB capability ('Core Performance Boost') is forcibly set,
because some versions of that chip incorrectly report that they do not have it.

However, a hypervisor may filter out the CPB capability, for good
reasons. For example, KVM currently does not emulate setting the CPB
bit in MSR_K7_HWCR, and unchecked MSR access errors will be thrown
when trying to set it as a guest:

    unchecked MSR access error: WRMSR to 0xc0010015 (tried to write 0x0000000001000011) at rIP: 0xffffffff890638f4 (native_write_msr+0x4/0x20)

    Call Trace:
    boost_set_msr+0x50/0x80 [acpi_cpufreq]
    cpuhp_invoke_callback+0x86/0x560
    sort_range+0x20/0x20
    cpuhp_thread_fun+0xb0/0x110
    smpboot_thread_fn+0xef/0x160
    kthread+0x113/0x130
    kthread_create_worker_on_cpu+0x70/0x70
    ret_from_fork+0x35/0x40

To avoid this issue, don't forcibly set the CPB capability for a CPU
when running under a hypervisor.

Signed-off-by: Frank van der Linden <[email protected]>
Acked-by: Borislav Petkov <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: [email protected]
Cc: [email protected]
Fixes: 0237199186e7 ("x86/CPU/AMD: Set the CPB bit unconditionally on F17h")
Link: http://lkml.kernel.org/r/[email protected]azon.com
[ Minor edits to the changelog. ]
Signed-off-by: Ingo Molnar <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>

There are 7 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/x86/kernel/cpu/amd.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index ecf8285..bbebcd7 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -792,8 +792,11 @@ static void init_amd_zn(struct cpuinfo_x86 *c)
 {
    set_cpu_cap(c, X86_FEATURE_ZEN);

-   /* Fix erratum 1076: CPB feature bit not being set in CPUID. */
-   if (!cpu_has(c, X86_FEATURE_CPB))
+   /*
+    * Fix erratum 1076: CPB feature bit not being set in CPUID.
+    * Always set it, except when running under a hypervisor.
+    */
+   if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && !cpu_has(c, X86_FEATURE_CPB))
        set_cpu_cap(c, X86_FEATURE_CPB);
 }

Leave a Reply

Your email address will not be published. Required fields are marked *