@@ -312,38 +312,52 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr, unsigned int width)
312312 return chunks >> shift ;
313313}
314314
315+ static u64 get_corrected_val (struct rdt_resource * r , struct rdt_mon_domain * d ,
316+ u32 rmid , enum resctrl_event_id eventid , u64 msr_val )
317+ {
318+ struct rdt_hw_mon_domain * hw_dom = resctrl_to_arch_mon_dom (d );
319+ struct rdt_hw_resource * hw_res = resctrl_to_arch_res (r );
320+ struct arch_mbm_state * am ;
321+ u64 chunks ;
322+
323+ am = get_arch_mbm_state (hw_dom , rmid , eventid );
324+ if (am ) {
325+ am -> chunks += mbm_overflow_count (am -> prev_msr , msr_val ,
326+ hw_res -> mbm_width );
327+ chunks = get_corrected_mbm_count (rmid , am -> chunks );
328+ am -> prev_msr = msr_val ;
329+ } else {
330+ chunks = msr_val ;
331+ }
332+
333+ return chunks * hw_res -> mon_scale ;
334+ }
335+
315336int resctrl_arch_rmid_read (struct rdt_resource * r , struct rdt_mon_domain * d ,
316337 u32 unused , u32 rmid , enum resctrl_event_id eventid ,
317338 u64 * val , void * ignored )
318339{
319340 struct rdt_hw_mon_domain * hw_dom = resctrl_to_arch_mon_dom (d );
320- struct rdt_hw_resource * hw_res = resctrl_to_arch_res (r );
321341 int cpu = cpumask_any (& d -> hdr .cpu_mask );
322342 struct arch_mbm_state * am ;
323- u64 msr_val , chunks ;
343+ u64 msr_val ;
324344 u32 prmid ;
325345 int ret ;
326346
327347 resctrl_arch_rmid_read_context_check ();
328348
329349 prmid = logical_rmid_to_physical_rmid (cpu , rmid );
330350 ret = __rmid_read_phys (prmid , eventid , & msr_val );
331- if (ret )
332- return ret ;
333351
334- am = get_arch_mbm_state (hw_dom , rmid , eventid );
335- if (am ) {
336- am -> chunks += mbm_overflow_count (am -> prev_msr , msr_val ,
337- hw_res -> mbm_width );
338- chunks = get_corrected_mbm_count (rmid , am -> chunks );
339- am -> prev_msr = msr_val ;
340- } else {
341- chunks = msr_val ;
352+ if (!ret ) {
353+ * val = get_corrected_val (r , d , rmid , eventid , msr_val );
354+ } else if (ret == - EINVAL ) {
355+ am = get_arch_mbm_state (hw_dom , rmid , eventid );
356+ if (am )
357+ am -> prev_msr = 0 ;
342358 }
343359
344- * val = chunks * hw_res -> mon_scale ;
345-
346- return 0 ;
360+ return ret ;
347361}
348362
349363static void limbo_release_entry (struct rmid_entry * entry )
0 commit comments