diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-07-08 13:06:57 -0300 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2019-07-08 13:06:57 -0300 | 
| commit | e3b22a65348ab54261a98b6bc90ecf8977ff8ebf (patch) | |
| tree | 81c517d6f0e5585be7af5ffa1a4d4136b1f4a9c6 /arch/x86/kernel/cpu/common.c | |
| parent | 05c78468a60f2fd961cd0a0c01c27f288bf81204 (diff) | |
| parent | 552a031ba12a4236be107a5b082a399237758a5d (diff) | |
Merge remote-tracking branch 'tip/perf/core' into perf/urgent
To pick up fixes.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 59 | 
1 files changed, 32 insertions, 27 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 2c57fffebf9b..482f74859fb7 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -801,6 +801,30 @@ static void init_speculation_control(struct cpuinfo_x86 *c)  	}  } +static void init_cqm(struct cpuinfo_x86 *c) +{ +	if (!cpu_has(c, X86_FEATURE_CQM_LLC)) { +		c->x86_cache_max_rmid  = -1; +		c->x86_cache_occ_scale = -1; +		return; +	} + +	/* will be overridden if occupancy monitoring exists */ +	c->x86_cache_max_rmid = cpuid_ebx(0xf); + +	if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC) || +	    cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL) || +	    cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)) { +		u32 eax, ebx, ecx, edx; + +		/* QoS sub-leaf, EAX=0Fh, ECX=1 */ +		cpuid_count(0xf, 1, &eax, &ebx, &ecx, &edx); + +		c->x86_cache_max_rmid  = ecx; +		c->x86_cache_occ_scale = ebx; +	} +} +  void get_cpu_cap(struct cpuinfo_x86 *c)  {  	u32 eax, ebx, ecx, edx; @@ -823,6 +847,12 @@ void get_cpu_cap(struct cpuinfo_x86 *c)  		c->x86_capability[CPUID_7_0_EBX] = ebx;  		c->x86_capability[CPUID_7_ECX] = ecx;  		c->x86_capability[CPUID_7_EDX] = edx; + +		/* Check valid sub-leaf index before accessing it */ +		if (eax >= 1) { +			cpuid_count(0x00000007, 1, &eax, &ebx, &ecx, &edx); +			c->x86_capability[CPUID_7_1_EAX] = eax; +		}  	}  	/* Extended state features: level 0x0000000d */ @@ -832,33 +862,6 @@ void get_cpu_cap(struct cpuinfo_x86 *c)  		c->x86_capability[CPUID_D_1_EAX] = eax;  	} -	/* Additional Intel-defined flags: level 0x0000000F */ -	if (c->cpuid_level >= 0x0000000F) { - -		/* QoS sub-leaf, EAX=0Fh, ECX=0 */ -		cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx); -		c->x86_capability[CPUID_F_0_EDX] = edx; - -		if (cpu_has(c, X86_FEATURE_CQM_LLC)) { -			/* will be overridden if occupancy monitoring exists */ -			c->x86_cache_max_rmid = ebx; - -			/* QoS sub-leaf, EAX=0Fh, ECX=1 */ -			cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx); -			c->x86_capability[CPUID_F_1_EDX] = edx; - -			if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) || -			      ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) || -			       (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) { -				c->x86_cache_max_rmid = ecx; -				c->x86_cache_occ_scale = ebx; -			} -		} else { -			c->x86_cache_max_rmid = -1; -			c->x86_cache_occ_scale = -1; -		} -	} -  	/* AMD-defined flags: level 0x80000001 */  	eax = cpuid_eax(0x80000000);  	c->extended_cpuid_level = eax; @@ -889,6 +892,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c)  	init_scattered_cpuid_features(c);  	init_speculation_control(c); +	init_cqm(c);  	/*  	 * Clear/Set all flags overridden by options, after probe. @@ -1299,6 +1303,7 @@ static void validate_apic_and_package_id(struct cpuinfo_x86 *c)  		       cpu, apicid, c->initial_apicid);  	}  	BUG_ON(topology_update_package_map(c->phys_proc_id, cpu)); +	BUG_ON(topology_update_die_map(c->cpu_die_id, cpu));  #else  	c->logical_proc_id = 0;  #endif  | 
