Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/cpufeatures: Combine word 11 and 12 into a new scattered features word

It's a waste for the four X86_FEATURE_CQM_* feature bits to occupy two
whole feature bits words. To better utilize feature words, re-define
word 11 to host scattered features and move the four X86_FEATURE_CQM_*
features into Linux defined word 11. More scattered features can be
added in word 11 in the future.

Rename leaf 11 in cpuid_leafs to CPUID_LNX_4 to reflect it's a
Linux-defined leaf.

Rename leaf 12 as CPUID_DUMMY which will be replaced by a meaningful
name in the next patch when CPUID.7.1:EAX occupies world 12.

Maximum number of RMID and cache occupancy scale are retrieved from
CPUID.0xf.1 after scattered CQM features are enumerated. Carve out the
code into a separate function.

KVM doesn't support resctrl now. So it's safe to move the
X86_FEATURE_CQM_* features to scattered features word 11 for KVM.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Aaron Lewis <aaronlewis@google.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Babu Moger <babu.moger@amd.com>
Cc: "Chang S. Bae" <chang.seok.bae@intel.com>
Cc: "Sean J Christopherson" <sean.j.christopherson@intel.com>
Cc: Frederic Weisbecker <frederic@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jann Horn <jannh@google.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: kvm ML <kvm@vger.kernel.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Nadav Amit <namit@vmware.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Pavel Tatashin <pasha.tatashin@oracle.com>
Cc: Peter Feiner <pfeiner@google.com>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
Cc: Ravi V Shankar <ravi.v.shankar@intel.com>
Cc: Sherry Hurwitz <sherry.hurwitz@amd.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Thomas Lendacky <Thomas.Lendacky@amd.com>
Cc: x86 <x86@kernel.org>
Link: https://lkml.kernel.org/r/1560794416-217638-2-git-send-email-fenghua.yu@intel.com

authored by

Fenghua Yu and committed by
Borislav Petkov
acec0ce0 45fc56e6

+34 -34
+2 -2
arch/x86/include/asm/cpufeature.h
··· 22 22 CPUID_LNX_3, 23 23 CPUID_7_0_EBX, 24 24 CPUID_D_1_EAX, 25 - CPUID_F_0_EDX, 26 - CPUID_F_1_EDX, 25 + CPUID_LNX_4, 26 + CPUID_DUMMY, 27 27 CPUID_8000_0008_EBX, 28 28 CPUID_6_EAX, 29 29 CPUID_8000_000A_EDX,
+10 -7
arch/x86/include/asm/cpufeatures.h
··· 271 271 #define X86_FEATURE_XGETBV1 (10*32+ 2) /* XGETBV with ECX = 1 instruction */ 272 272 #define X86_FEATURE_XSAVES (10*32+ 3) /* XSAVES/XRSTORS instructions */ 273 273 274 - /* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:0 (EDX), word 11 */ 275 - #define X86_FEATURE_CQM_LLC (11*32+ 1) /* LLC QoS if 1 */ 276 - 277 - /* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:1 (EDX), word 12 */ 278 - #define X86_FEATURE_CQM_OCCUP_LLC (12*32+ 0) /* LLC occupancy monitoring */ 279 - #define X86_FEATURE_CQM_MBM_TOTAL (12*32+ 1) /* LLC Total MBM monitoring */ 280 - #define X86_FEATURE_CQM_MBM_LOCAL (12*32+ 2) /* LLC Local MBM monitoring */ 274 + /* 275 + * Extended auxiliary flags: Linux defined - for features scattered in various 276 + * CPUID levels like 0xf, etc. 277 + * 278 + * Reuse free bits when adding new feature flags! 279 + */ 280 + #define X86_FEATURE_CQM_LLC (11*32+ 0) /* LLC QoS if 1 */ 281 + #define X86_FEATURE_CQM_OCCUP_LLC (11*32+ 1) /* LLC occupancy monitoring */ 282 + #define X86_FEATURE_CQM_MBM_TOTAL (11*32+ 2) /* LLC Total MBM monitoring */ 283 + #define X86_FEATURE_CQM_MBM_LOCAL (11*32+ 3) /* LLC Local MBM monitoring */ 281 284 282 285 /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */ 283 286 #define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */
+15 -23
arch/x86/kernel/cpu/common.c
··· 803 803 804 804 static void init_cqm(struct cpuinfo_x86 *c) 805 805 { 806 - u32 eax, ebx, ecx, edx; 806 + if (!cpu_has(c, X86_FEATURE_CQM_LLC)) { 807 + c->x86_cache_max_rmid = -1; 808 + c->x86_cache_occ_scale = -1; 809 + return; 810 + } 807 811 808 - /* Additional Intel-defined flags: level 0x0000000F */ 809 - if (c->cpuid_level >= 0x0000000F) { 812 + /* will be overridden if occupancy monitoring exists */ 813 + c->x86_cache_max_rmid = cpuid_ebx(0xf); 810 814 811 - /* QoS sub-leaf, EAX=0Fh, ECX=0 */ 812 - cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx); 813 - c->x86_capability[CPUID_F_0_EDX] = edx; 815 + if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC) || 816 + cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL) || 817 + cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)) { 818 + u32 eax, ebx, ecx, edx; 814 819 815 - if (cpu_has(c, X86_FEATURE_CQM_LLC)) { 816 - /* will be overridden if occupancy monitoring exists */ 817 - c->x86_cache_max_rmid = ebx; 820 + /* QoS sub-leaf, EAX=0Fh, ECX=1 */ 821 + cpuid_count(0xf, 1, &eax, &ebx, &ecx, &edx); 818 822 819 - /* QoS sub-leaf, EAX=0Fh, ECX=1 */ 820 - cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx); 821 - c->x86_capability[CPUID_F_1_EDX] = edx; 822 - 823 - if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) || 824 - ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) || 825 - (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) { 826 - c->x86_cache_max_rmid = ecx; 827 - c->x86_cache_occ_scale = ebx; 828 - } 829 - } else { 830 - c->x86_cache_max_rmid = -1; 831 - c->x86_cache_occ_scale = -1; 832 - } 823 + c->x86_cache_max_rmid = ecx; 824 + c->x86_cache_occ_scale = ebx; 833 825 } 834 826 } 835 827
+3
arch/x86/kernel/cpu/cpuid-deps.c
··· 59 59 { X86_FEATURE_AVX512_4VNNIW, X86_FEATURE_AVX512F }, 60 60 { X86_FEATURE_AVX512_4FMAPS, X86_FEATURE_AVX512F }, 61 61 { X86_FEATURE_AVX512_VPOPCNTDQ, X86_FEATURE_AVX512F }, 62 + { X86_FEATURE_CQM_OCCUP_LLC, X86_FEATURE_CQM_LLC }, 63 + { X86_FEATURE_CQM_MBM_TOTAL, X86_FEATURE_CQM_LLC }, 64 + { X86_FEATURE_CQM_MBM_LOCAL, X86_FEATURE_CQM_LLC }, 62 65 {} 63 66 }; 64 67
+4
arch/x86/kernel/cpu/scattered.c
··· 26 26 static const struct cpuid_bit cpuid_bits[] = { 27 27 { X86_FEATURE_APERFMPERF, CPUID_ECX, 0, 0x00000006, 0 }, 28 28 { X86_FEATURE_EPB, CPUID_ECX, 3, 0x00000006, 0 }, 29 + { X86_FEATURE_CQM_LLC, CPUID_EDX, 1, 0x0000000f, 0 }, 30 + { X86_FEATURE_CQM_OCCUP_LLC, CPUID_EDX, 0, 0x0000000f, 1 }, 31 + { X86_FEATURE_CQM_MBM_TOTAL, CPUID_EDX, 1, 0x0000000f, 1 }, 32 + { X86_FEATURE_CQM_MBM_LOCAL, CPUID_EDX, 2, 0x0000000f, 1 }, 29 33 { X86_FEATURE_CAT_L3, CPUID_EBX, 1, 0x00000010, 0 }, 30 34 { X86_FEATURE_CAT_L2, CPUID_EBX, 2, 0x00000010, 0 }, 31 35 { X86_FEATURE_CDP_L3, CPUID_ECX, 2, 0x00000010, 1 },
-2
arch/x86/kvm/cpuid.h
··· 47 47 [CPUID_8000_0001_ECX] = {0x80000001, 0, CPUID_ECX}, 48 48 [CPUID_7_0_EBX] = { 7, 0, CPUID_EBX}, 49 49 [CPUID_D_1_EAX] = { 0xd, 1, CPUID_EAX}, 50 - [CPUID_F_0_EDX] = { 0xf, 0, CPUID_EDX}, 51 - [CPUID_F_1_EDX] = { 0xf, 1, CPUID_EDX}, 52 50 [CPUID_8000_0008_EBX] = {0x80000008, 0, CPUID_EBX}, 53 51 [CPUID_6_EAX] = { 6, 0, CPUID_EAX}, 54 52 [CPUID_8000_000A_EDX] = {0x8000000a, 0, CPUID_EDX},