diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c index 3a6c069614eb..976bdf15be22 100644 --- a/arch/x86/kernel/cpu/resctrl/monitor.c +++ b/arch/x86/kernel/cpu/resctrl/monitor.c @@ -241,11 +241,15 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain *d, if (!cpumask_test_cpu(smp_processor_id(), &d->cpu_mask)) return -EINVAL; - ret = __rmid_read(rmid, eventid, &msr_val); - if (ret) - return ret; - am = get_arch_mbm_state(hw_dom, rmid, eventid); + + ret = __rmid_read(rmid, eventid, &msr_val); + if (ret) { + if (am && ret == -EINVAL) + am->prev_msr = 0; + return ret; + } + if (am) { am->chunks += mbm_overflow_count(am->prev_msr, msr_val, hw_res->mbm_width);