diff options
Diffstat (limited to 'arch/x86/kernel/cpu/resctrl/monitor.c')
| -rw-r--r-- | arch/x86/kernel/cpu/resctrl/monitor.c | 25 | 
1 files changed, 20 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index c8945610d455..fe1a2aa53c16 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -242,7 +242,9 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,  			   u32 unused, u32 rmid, enum resctrl_event_id eventid,  			   u64 *val, void *ignored)  { +	struct rdt_hw_mon_domain *hw_dom = resctrl_to_arch_mon_dom(d);  	int cpu = cpumask_any(&d->hdr.cpu_mask); +	struct arch_mbm_state *am;  	u64 msr_val;  	u32 prmid;  	int ret; @@ -251,12 +253,16 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_mon_domain *d,  	prmid = logical_rmid_to_physical_rmid(cpu, rmid);  	ret = __rmid_read_phys(prmid, eventid, &msr_val); -	if (ret) -		return ret; -	*val = get_corrected_val(r, d, rmid, eventid, msr_val); +	if (!ret) { +		*val = get_corrected_val(r, d, rmid, eventid, msr_val); +	} else if (ret == -EINVAL) { +		am = get_arch_mbm_state(hw_dom, rmid, eventid); +		if (am) +			am->prev_msr = 0; +	} -	return 0; +	return ret;  }  static int __cntr_id_read(u32 cntr_id, u64 *val) @@ -452,7 +458,16 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)  		r->mon.mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS;  	} -	if (rdt_cpu_has(X86_FEATURE_ABMC)) { +	/* +	 * resctrl assumes a system that supports assignable counters can +	 * switch to "default" mode. Ensure that there is a "default" mode +	 * to switch to. This enforces a dependency between the independent +	 * X86_FEATURE_ABMC and X86_FEATURE_CQM_MBM_TOTAL/X86_FEATURE_CQM_MBM_LOCAL +	 * hardware features. +	 */ +	if (rdt_cpu_has(X86_FEATURE_ABMC) && +	    (rdt_cpu_has(X86_FEATURE_CQM_MBM_TOTAL) || +	     rdt_cpu_has(X86_FEATURE_CQM_MBM_LOCAL))) {  		r->mon.mbm_cntr_assignable = true;  		cpuid_count(0x80000020, 5, &eax, &ebx, &ecx, &edx);  		r->mon.num_mbm_cntrs = (ebx & GENMASK(15, 0)) + 1;  | 
