diff options
| author | Frank van der Linden <fllinden@amazon.com> | 2019-05-22 18:17:45 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2019-05-24 02:50:32 -0400 |
| commit | 2ac44ab608705948564791ce1d15d43ba81a1e38 (patch) | |
| tree | 1e0a8350de6e9f2a26f6410a618b6334348793ee | |
| parent | c3ee82ce47af63eca2075d8af956d468f508942e (diff) | |
x86/CPU/AMD: Don't force the CPB cap when running under a hypervisor
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 <fllinden@amazon.com>
Acked-by: Borislav Petkov <bp@suse.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: bp@alien8.de
Cc: jiaxun.yang@flygoat.com
Fixes: 0237199186e7 ("x86/CPU/AMD: Set the CPB bit unconditionally on F17h")
Link: http://lkml.kernel.org/r/20190522221745.GA15789@dev-dsk-fllinden-2c-c1893d73.us-west-2.amazon.com
[ Minor edits to the changelog. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 80a405c2048a..8d4e50428b68 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -824,8 +824,11 @@ static void init_amd_zn(struct cpuinfo_x86 *c) | |||
| 824 | { | 824 | { |
| 825 | set_cpu_cap(c, X86_FEATURE_ZEN); | 825 | set_cpu_cap(c, X86_FEATURE_ZEN); |
| 826 | 826 | ||
| 827 | /* Fix erratum 1076: CPB feature bit not being set in CPUID. */ | 827 | /* |
| 828 | if (!cpu_has(c, X86_FEATURE_CPB)) | 828 | * Fix erratum 1076: CPB feature bit not being set in CPUID. |
| 829 | * Always set it, except when running under a hypervisor. | ||
| 830 | */ | ||
| 831 | if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && !cpu_has(c, X86_FEATURE_CPB)) | ||
| 829 | set_cpu_cap(c, X86_FEATURE_CPB); | 832 | set_cpu_cap(c, X86_FEATURE_CPB); |
| 830 | } | 833 | } |
| 831 | 834 | ||
