@@ -225,10 +225,18 @@ void free_rmid(u32 rmid)
225
225
list_add_tail (& entry -> list , & rmid_free_lru );
226
226
}
227
227
228
+ static u64 mbm_overflow_count (u64 prev_msr , u64 cur_msr )
229
+ {
230
+ u64 shift = 64 - MBM_CNTR_WIDTH , chunks ;
231
+
232
+ chunks = (cur_msr << shift ) - (prev_msr << shift );
233
+ return chunks >>= shift ;
234
+ }
235
+
228
236
static int __mon_event_count (u32 rmid , struct rmid_read * rr )
229
237
{
230
- u64 chunks , shift , tval ;
231
238
struct mbm_state * m ;
239
+ u64 chunks , tval ;
232
240
233
241
tval = __rmid_read (rmid , rr -> evtid );
234
242
if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL )) {
@@ -254,21 +262,45 @@ static int __mon_event_count(u32 rmid, struct rmid_read *rr)
254
262
}
255
263
256
264
if (rr -> first ) {
257
- m -> prev_msr = tval ;
258
- m -> chunks = 0 ;
265
+ memset ( m , 0 , sizeof ( struct mbm_state )) ;
266
+ m -> prev_bw_msr = m -> prev_msr = tval ;
259
267
return 0 ;
260
268
}
261
269
262
- shift = 64 - MBM_CNTR_WIDTH ;
263
- chunks = (tval << shift ) - (m -> prev_msr << shift );
264
- chunks >>= shift ;
270
+ chunks = mbm_overflow_count (m -> prev_msr , tval );
265
271
m -> chunks += chunks ;
266
272
m -> prev_msr = tval ;
267
273
268
274
rr -> val += m -> chunks ;
269
275
return 0 ;
270
276
}
271
277
278
+ /*
279
+ * Supporting function to calculate the memory bandwidth
280
+ * and delta bandwidth in MBps.
281
+ */
282
+ static void mbm_bw_count (u32 rmid , struct rmid_read * rr )
283
+ {
284
+ struct rdt_resource * r = & rdt_resources_all [RDT_RESOURCE_L3 ];
285
+ struct mbm_state * m = & rr -> d -> mbm_local [rmid ];
286
+ u64 tval , cur_bw , chunks ;
287
+
288
+ tval = __rmid_read (rmid , rr -> evtid );
289
+ if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL ))
290
+ return ;
291
+
292
+ chunks = mbm_overflow_count (m -> prev_bw_msr , tval );
293
+ m -> chunks_bw += chunks ;
294
+ m -> chunks = m -> chunks_bw ;
295
+ cur_bw = (chunks * r -> mon_scale ) >> 20 ;
296
+
297
+ if (m -> delta_comp )
298
+ m -> delta_bw = abs (cur_bw - m -> prev_bw );
299
+ m -> delta_comp = false;
300
+ m -> prev_bw = cur_bw ;
301
+ m -> prev_bw_msr = tval ;
302
+ }
303
+
272
304
/*
273
305
* This is called via IPI to read the CQM/MBM counters
274
306
* on a domain.
0 commit comments