]> git.dujemihanovic.xyz Git - linux.git/commitdiff
x86/resctrl: Avoid redundant counter read in __mon_event_count()
authorPeter Newman <peternewman@google.com>
Tue, 20 Dec 2022 16:41:32 +0000 (17:41 +0100)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 15 Mar 2023 22:44:15 +0000 (15:44 -0700)
__mon_event_count() does the per-RMID, per-domain work for
user-initiated event count reads and the initialization of new monitor
groups.

In the initialization case, after resctrl_arch_reset_rmid() calls
__rmid_read() to record an initial count for a new monitor group, it
immediately calls resctrl_arch_rmid_read(). This re-read of the hardware
counter is unnecessary and the following computations are ignored by the
caller during initialization.

Following return from resctrl_arch_reset_rmid(), just clear the
mbm_state and return. This involves moving the mbm_state lookup into the
rr->first case, as it's not needed for regular event count reads: the
QOS_L3_OCCUP_EVENT_ID case was redundant with the accumulating logic at
the end of the function.

Signed-off-by: Peter Newman <peternewman@google.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lore.kernel.org/all/20221220164132.443083-2-peternewman%40google.com
arch/x86/kernel/cpu/resctrl/monitor.c

index 7fe51488e136ab7b6c320589ca09c5dd1d37ed0b..20952419be75cf714dde021b1d60c5133945b75d 100644 (file)
@@ -383,41 +383,36 @@ void free_rmid(u32 rmid)
                list_add_tail(&entry->list, &rmid_free_lru);
 }
 
+static struct mbm_state *get_mbm_state(struct rdt_domain *d, u32 rmid,
+                                      enum resctrl_event_id evtid)
+{
+       switch (evtid) {
+       case QOS_L3_MBM_TOTAL_EVENT_ID:
+               return &d->mbm_total[rmid];
+       case QOS_L3_MBM_LOCAL_EVENT_ID:
+               return &d->mbm_local[rmid];
+       default:
+               return NULL;
+       }
+}
+
 static int __mon_event_count(u32 rmid, struct rmid_read *rr)
 {
        struct mbm_state *m;
        u64 tval = 0;
 
-       if (rr->first)
+       if (rr->first) {
                resctrl_arch_reset_rmid(rr->r, rr->d, rmid, rr->evtid);
+               m = get_mbm_state(rr->d, rmid, rr->evtid);
+               if (m)
+                       memset(m, 0, sizeof(struct mbm_state));
+               return 0;
+       }
 
        rr->err = resctrl_arch_rmid_read(rr->r, rr->d, rmid, rr->evtid, &tval);
        if (rr->err)
                return rr->err;
 
-       switch (rr->evtid) {
-       case QOS_L3_OCCUP_EVENT_ID:
-               rr->val += tval;
-               return 0;
-       case QOS_L3_MBM_TOTAL_EVENT_ID:
-               m = &rr->d->mbm_total[rmid];
-               break;
-       case QOS_L3_MBM_LOCAL_EVENT_ID:
-               m = &rr->d->mbm_local[rmid];
-               break;
-       default:
-               /*
-                * Code would never reach here because an invalid
-                * event id would fail in resctrl_arch_rmid_read().
-                */
-               return -EINVAL;
-       }
-
-       if (rr->first) {
-               memset(m, 0, sizeof(struct mbm_state));
-               return 0;
-       }
-
        rr->val += tval;
 
        return 0;