]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86,fs/resctrl: Consolidate monitoring related data from rdt_resource
authorBabu Moger <babu.moger@amd.com>
Fri, 5 Sep 2025 21:34:06 +0000 (16:34 -0500)
committerBorislav Petkov (AMD) <bp@alien8.de>
Mon, 15 Sep 2025 10:07:01 +0000 (12:07 +0200)
The cache allocation and memory bandwidth allocation feature properties are
consolidated into struct resctrl_cache and struct resctrl_membw respectively.

In preparation for more monitoring properties that will clobber the existing
resource struct more, re-organize the monitoring specific properties to also
be in a separate structure.

Also convert "bandwidth sources" terminology to "memory transactions" to have
consistency within resctrl for related monitoring features.

  [ bp: Massage commit message. ]

Suggested-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: Babu Moger <babu.moger@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Link: https://lore.kernel.org/cover.1757108044.git.babu.moger@amd.com
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/monitor.c
fs/resctrl/rdtgroup.c
include/linux/resctrl.h

index b07b12a058862b53a1dfd7cdfc5742c547e760a0..267e9206a999268293c1e42aa9f5149b4e0ce061 100644 (file)
@@ -107,7 +107,7 @@ u32 resctrl_arch_system_num_rmid_idx(void)
        struct rdt_resource *r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;
 
        /* RMID are independent numbers for x86. num_rmid_idx == num_rmid */
-       return r->num_rmid;
+       return r->mon.num_rmid;
 }
 
 struct rdt_resource *resctrl_arch_get_resource(enum resctrl_res_level l)
@@ -541,7 +541,7 @@ static void domain_add_cpu_mon(int cpu, struct rdt_resource *r)
 
        arch_mon_domain_online(r, d);
 
-       if (arch_domain_mbm_alloc(r->num_rmid, hw_dom)) {
+       if (arch_domain_mbm_alloc(r->mon.num_rmid, hw_dom)) {
                mon_domain_free(hw_dom);
                return;
        }
index f01db2034d08df1283bcc4528905afc86eef00d7..2558b1bdef8b547f8f58f0fef79a6e48fbfae263 100644 (file)
@@ -130,7 +130,7 @@ static int logical_rmid_to_physical_rmid(int cpu, int lrmid)
        if (snc_nodes_per_l3_cache == 1)
                return lrmid;
 
-       return lrmid + (cpu_to_node(cpu) % snc_nodes_per_l3_cache) * r->num_rmid;
+       return lrmid + (cpu_to_node(cpu) % snc_nodes_per_l3_cache) * r->mon.num_rmid;
 }
 
 static int __rmid_read_phys(u32 prmid, enum resctrl_event_id eventid, u64 *val)
@@ -205,7 +205,7 @@ void resctrl_arch_reset_rmid_all(struct rdt_resource *r, struct rdt_mon_domain *
                        continue;
                idx = MBM_STATE_IDX(eventid);
                memset(hw_dom->arch_mbm_states[idx], 0,
-                      sizeof(*hw_dom->arch_mbm_states[0]) * r->num_rmid);
+                      sizeof(*hw_dom->arch_mbm_states[0]) * r->mon.num_rmid);
        }
 }
 
@@ -344,7 +344,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)
 
        resctrl_rmid_realloc_limit = boot_cpu_data.x86_cache_size * 1024;
        hw_res->mon_scale = boot_cpu_data.x86_cache_occ_scale / snc_nodes_per_l3_cache;
-       r->num_rmid = (boot_cpu_data.x86_cache_max_rmid + 1) / snc_nodes_per_l3_cache;
+       r->mon.num_rmid = (boot_cpu_data.x86_cache_max_rmid + 1) / snc_nodes_per_l3_cache;
        hw_res->mbm_width = MBM_CNTR_WIDTH_BASE;
 
        if (mbm_offset > 0 && mbm_offset <= MBM_CNTR_WIDTH_OFFSET_MAX)
@@ -359,7 +359,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)
         *
         * For a 35MB LLC and 56 RMIDs, this is ~1.8% of the LLC.
         */
-       threshold = resctrl_rmid_realloc_limit / r->num_rmid;
+       threshold = resctrl_rmid_realloc_limit / r->mon.num_rmid;
 
        /*
         * Because num_rmid may not be a power of two, round the value
@@ -373,7 +373,7 @@ int __init rdt_get_mon_l3_config(struct rdt_resource *r)
 
                /* Detect list of bandwidth sources that can be tracked */
                cpuid_count(0x80000020, 3, &eax, &ebx, &ecx, &edx);
-               r->mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS;
+               r->mon.mbm_cfg_mask = ecx & MAX_EVT_CONFIG_BITS;
        }
 
        r->mon_capable = true;
index a6047e9345cdab61cc1b3a2a9c66b99bf6e89441..b6ab107049939a62f47ac633b728e967bf65ecdd 100644 (file)
@@ -1135,7 +1135,7 @@ static int rdt_num_rmids_show(struct kernfs_open_file *of,
 {
        struct rdt_resource *r = rdt_kn_parent_priv(of->kn);
 
-       seq_printf(seq, "%d\n", r->num_rmid);
+       seq_printf(seq, "%d\n", r->mon.num_rmid);
 
        return 0;
 }
@@ -1731,9 +1731,9 @@ next:
        }
 
        /* Value from user cannot be more than the supported set of events */
-       if ((val & r->mbm_cfg_mask) != val) {
+       if ((val & r->mon.mbm_cfg_mask) != val) {
                rdt_last_cmd_printf("Invalid event configuration: max valid mask is 0x%02x\n",
-                                   r->mbm_cfg_mask);
+                                   r->mon.mbm_cfg_mask);
                return -EINVAL;
        }
 
index 478d7a935ca36edfe39c2b394b98e174274c5c5e..fe2af6cb96d4b47683eb165b8674e0deb26c2d6b 100644 (file)
@@ -255,38 +255,46 @@ enum resctrl_schema_fmt {
        RESCTRL_SCHEMA_RANGE,
 };
 
+/**
+ * struct resctrl_mon - Monitoring related data of a resctrl resource.
+ * @num_rmid:          Number of RMIDs available.
+ * @mbm_cfg_mask:      Memory transactions that can be tracked when bandwidth
+ *                     monitoring events can be configured.
+ */
+struct resctrl_mon {
+       int                     num_rmid;
+       unsigned int            mbm_cfg_mask;
+};
+
 /**
  * struct rdt_resource - attributes of a resctrl resource
  * @rid:               The index of the resource
  * @alloc_capable:     Is allocation available on this machine
  * @mon_capable:       Is monitor feature available on this machine
- * @num_rmid:          Number of RMIDs available
  * @ctrl_scope:                Scope of this resource for control functions
  * @mon_scope:         Scope of this resource for monitor functions
  * @cache:             Cache allocation related data
  * @membw:             If the component has bandwidth controls, their properties.
+ * @mon:               Monitoring related data.
  * @ctrl_domains:      RCU list of all control domains for this resource
  * @mon_domains:       RCU list of all monitor domains for this resource
  * @name:              Name to use in "schemata" file.
  * @schema_fmt:                Which format string and parser is used for this schema.
- * @mbm_cfg_mask:      Bandwidth sources that can be tracked when bandwidth
- *                     monitoring events can be configured.
  * @cdp_capable:       Is the CDP feature available on this resource
  */
 struct rdt_resource {
        int                     rid;
        bool                    alloc_capable;
        bool                    mon_capable;
-       int                     num_rmid;
        enum resctrl_scope      ctrl_scope;
        enum resctrl_scope      mon_scope;
        struct resctrl_cache    cache;
        struct resctrl_membw    membw;
+       struct resctrl_mon      mon;
        struct list_head        ctrl_domains;
        struct list_head        mon_domains;
        char                    *name;
        enum resctrl_schema_fmt schema_fmt;
-       unsigned int            mbm_cfg_mask;
        bool                    cdp_capable;
 };