@@ -159,7 +159,7 @@ void __check_limbo(struct rdt_mon_domain *d, bool force_free)
159159 break ;
160160
161161 entry = __rmid_entry (idx );
162- if (resctrl_arch_rmid_read (r , d , entry -> closid , entry -> rmid ,
162+ if (resctrl_arch_rmid_read (r , & d -> hdr , entry -> closid , entry -> rmid ,
163163 QOS_L3_OCCUP_EVENT_ID , & val ,
164164 arch_mon_ctx )) {
165165 rmid_dirty = true;
@@ -421,11 +421,16 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
421421 struct rdt_mon_domain * d ;
422422 int cntr_id = - ENOENT ;
423423 struct mbm_state * m ;
424- int err , ret ;
425424 u64 tval = 0 ;
426425
426+ if (!domain_header_is_valid (rr -> hdr , RESCTRL_MON_DOMAIN , RDT_RESOURCE_L3 )) {
427+ rr -> err = - EIO ;
428+ return - EINVAL ;
429+ }
430+ d = container_of (rr -> hdr , struct rdt_mon_domain , hdr );
431+
427432 if (rr -> is_mbm_cntr ) {
428- cntr_id = mbm_cntr_get (rr -> r , rr -> d , rdtgrp , rr -> evtid );
433+ cntr_id = mbm_cntr_get (rr -> r , d , rdtgrp , rr -> evtid );
429434 if (cntr_id < 0 ) {
430435 rr -> err = - ENOENT ;
431436 return - EINVAL ;
@@ -434,31 +439,50 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
434439
435440 if (rr -> first ) {
436441 if (rr -> is_mbm_cntr )
437- resctrl_arch_reset_cntr (rr -> r , rr -> d , closid , rmid , cntr_id , rr -> evtid );
442+ resctrl_arch_reset_cntr (rr -> r , d , closid , rmid , cntr_id , rr -> evtid );
438443 else
439- resctrl_arch_reset_rmid (rr -> r , rr -> d , closid , rmid , rr -> evtid );
440- m = get_mbm_state (rr -> d , closid , rmid , rr -> evtid );
444+ resctrl_arch_reset_rmid (rr -> r , d , closid , rmid , rr -> evtid );
445+ m = get_mbm_state (d , closid , rmid , rr -> evtid );
441446 if (m )
442447 memset (m , 0 , sizeof (struct mbm_state ));
443448 return 0 ;
444449 }
445450
446- if (rr -> d ) {
447- /* Reading a single domain, must be on a CPU in that domain. */
448- if (!cpumask_test_cpu (cpu , & rr -> d -> hdr .cpu_mask ))
449- return - EINVAL ;
450- if (rr -> is_mbm_cntr )
451- rr -> err = resctrl_arch_cntr_read (rr -> r , rr -> d , closid , rmid , cntr_id ,
452- rr -> evtid , & tval );
453- else
454- rr -> err = resctrl_arch_rmid_read (rr -> r , rr -> d , closid , rmid ,
455- rr -> evtid , & tval , rr -> arch_mon_ctx );
456- if (rr -> err )
457- return rr -> err ;
451+ /* Reading a single domain, must be on a CPU in that domain. */
452+ if (!cpumask_test_cpu (cpu , & d -> hdr .cpu_mask ))
453+ return - EINVAL ;
454+ if (rr -> is_mbm_cntr )
455+ rr -> err = resctrl_arch_cntr_read (rr -> r , d , closid , rmid , cntr_id ,
456+ rr -> evtid , & tval );
457+ else
458+ rr -> err = resctrl_arch_rmid_read (rr -> r , rr -> hdr , closid , rmid ,
459+ rr -> evtid , & tval , rr -> arch_mon_ctx );
460+ if (rr -> err )
461+ return rr -> err ;
458462
459- rr -> val += tval ;
463+ rr -> val += tval ;
460464
461- return 0 ;
465+ return 0 ;
466+ }
467+
468+ static int __l3_mon_event_count_sum (struct rdtgroup * rdtgrp , struct rmid_read * rr )
469+ {
470+ int cpu = smp_processor_id ();
471+ u32 closid = rdtgrp -> closid ;
472+ u32 rmid = rdtgrp -> mon .rmid ;
473+ struct rdt_mon_domain * d ;
474+ u64 tval = 0 ;
475+ int err , ret ;
476+
477+ /*
478+ * Summing across domains is only done for systems that implement
479+ * Sub-NUMA Cluster. There is no overlap with systems that support
480+ * assignable counters.
481+ */
482+ if (rr -> is_mbm_cntr ) {
483+ pr_warn_once ("Summing domains using assignable counters is not supported\n" );
484+ rr -> err = - EINVAL ;
485+ return - EINVAL ;
462486 }
463487
464488 /* Summing domains that share a cache, must be on a CPU for that cache. */
@@ -476,12 +500,8 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
476500 list_for_each_entry (d , & rr -> r -> mon_domains , hdr .list ) {
477501 if (d -> ci_id != rr -> ci -> id )
478502 continue ;
479- if (rr -> is_mbm_cntr )
480- err = resctrl_arch_cntr_read (rr -> r , d , closid , rmid , cntr_id ,
481- rr -> evtid , & tval );
482- else
483- err = resctrl_arch_rmid_read (rr -> r , d , closid , rmid ,
484- rr -> evtid , & tval , rr -> arch_mon_ctx );
503+ err = resctrl_arch_rmid_read (rr -> r , & d -> hdr , closid , rmid ,
504+ rr -> evtid , & tval , rr -> arch_mon_ctx );
485505 if (!err ) {
486506 rr -> val += tval ;
487507 ret = 0 ;
@@ -498,7 +518,10 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
498518{
499519 switch (rr -> r -> rid ) {
500520 case RDT_RESOURCE_L3 :
501- return __l3_mon_event_count (rdtgrp , rr );
521+ if (rr -> hdr )
522+ return __l3_mon_event_count (rdtgrp , rr );
523+ else
524+ return __l3_mon_event_count_sum (rdtgrp , rr );
502525 default :
503526 rr -> err = - EINVAL ;
504527 return - EINVAL ;
@@ -522,9 +545,13 @@ static void mbm_bw_count(struct rdtgroup *rdtgrp, struct rmid_read *rr)
522545 u64 cur_bw , bytes , cur_bytes ;
523546 u32 closid = rdtgrp -> closid ;
524547 u32 rmid = rdtgrp -> mon .rmid ;
548+ struct rdt_mon_domain * d ;
525549 struct mbm_state * m ;
526550
527- m = get_mbm_state (rr -> d , closid , rmid , rr -> evtid );
551+ if (!domain_header_is_valid (rr -> hdr , RESCTRL_MON_DOMAIN , RDT_RESOURCE_L3 ))
552+ return ;
553+ d = container_of (rr -> hdr , struct rdt_mon_domain , hdr );
554+ m = get_mbm_state (d , closid , rmid , rr -> evtid );
528555 if (WARN_ON_ONCE (!m ))
529556 return ;
530557
@@ -697,7 +724,7 @@ static void mbm_update_one_event(struct rdt_resource *r, struct rdt_mon_domain *
697724 struct rmid_read rr = {0 };
698725
699726 rr .r = r ;
700- rr .d = d ;
727+ rr .hdr = & d -> hdr ;
701728 rr .evtid = evtid ;
702729 if (resctrl_arch_mbm_cntr_assign_enabled (r )) {
703730 rr .is_mbm_cntr = true;
0 commit comments