]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/resctrl: Remove fflags from struct rdt_resource
authorJames Morse <james.morse@arm.com>
Tue, 11 Mar 2025 18:36:48 +0000 (18:36 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Wed, 12 Mar 2025 11:22:26 +0000 (12:22 +0100)
The resctrl arch code specifies whether a resource controls a cache or memory
using the fflags field. This field is then used by resctrl to determine which
files should be exposed in the filesystem.

Allowing the architecture to pick this value means the RFTYPE_ flags have to
be in a shared header, and allows an architecture to create a combination that
resctrl does not support.

Remove the fflags field, and pick the value based on the resource id.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Reviewed-by: Tony Luck <tony.luck@intel.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Reviewed-by: Fenghua Yu <fenghuay@nvidia.com>
Reviewed-by: Babu Moger <babu.moger@amd.com>
Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Peter Newman <peternewman@google.com>
Tested-by: Amit Singh Tomar <amitsinght@marvell.com> # arm64
Tested-by: Shanker Donthineni <sdonthineni@nvidia.com> # arm64
Tested-by: Babu Moger <babu.moger@amd.com>
Link: https://lore.kernel.org/r/20250311183715.16445-4-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/rdtgroup.c
include/linux/resctrl.h

index 12b41316d8f7ff9cd0e99247b5298519dd12ecd3..8ef2e449b4650acb48aad3b8f6482a88e4610ae9 100644 (file)
@@ -74,7 +74,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
                        .mon_domains            = mon_domain_init(RDT_RESOURCE_L3),
                        .parse_ctrlval          = parse_cbm,
                        .format_str             = "%d=%0*x",
-                       .fflags                 = RFTYPE_RES_CACHE,
                },
                .msr_base               = MSR_IA32_L3_CBM_BASE,
                .msr_update             = cat_wrmsr,
@@ -88,7 +87,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_L2),
                        .parse_ctrlval          = parse_cbm,
                        .format_str             = "%d=%0*x",
-                       .fflags                 = RFTYPE_RES_CACHE,
                },
                .msr_base               = MSR_IA32_L2_CBM_BASE,
                .msr_update             = cat_wrmsr,
@@ -102,7 +100,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_MBA),
                        .parse_ctrlval          = parse_bw,
                        .format_str             = "%d=%*u",
-                       .fflags                 = RFTYPE_RES_MB,
                },
        },
        [RDT_RESOURCE_SMBA] =
@@ -114,7 +111,6 @@ struct rdt_hw_resource rdt_resources_all[RDT_NUM_RESOURCES] = {
                        .ctrl_domains           = ctrl_domain_init(RDT_RESOURCE_SMBA),
                        .parse_ctrlval          = parse_bw,
                        .format_str             = "%d=%*u",
-                       .fflags                 = RFTYPE_RES_MB,
                },
        },
 };
index 45093b9e8e6302cd432a1e2ac21451dd1499db53..3391ac8ecb2def0dff052049742d76b208e33049 100644 (file)
@@ -2165,6 +2165,20 @@ static int rdtgroup_mkdir_info_resdir(void *priv, char *name,
        return ret;
 }
 
+static unsigned long fflags_from_resource(struct rdt_resource *r)
+{
+       switch (r->rid) {
+       case RDT_RESOURCE_L3:
+       case RDT_RESOURCE_L2:
+               return RFTYPE_RES_CACHE;
+       case RDT_RESOURCE_MBA:
+       case RDT_RESOURCE_SMBA:
+               return RFTYPE_RES_MB;
+       }
+
+       return WARN_ON_ONCE(1);
+}
+
 static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn)
 {
        struct resctrl_schema *s;
@@ -2185,14 +2199,14 @@ static int rdtgroup_create_info_dir(struct kernfs_node *parent_kn)
        /* loop over enabled controls, these are all alloc_capable */
        list_for_each_entry(s, &resctrl_schema_all, list) {
                r = s->res;
-               fflags = r->fflags | RFTYPE_CTRL_INFO;
+               fflags = fflags_from_resource(r) | RFTYPE_CTRL_INFO;
                ret = rdtgroup_mkdir_info_resdir(s, s->name, fflags);
                if (ret)
                        goto out_destroy;
        }
 
        for_each_mon_capable_rdt_resource(r) {
-               fflags = r->fflags | RFTYPE_MON_INFO;
+               fflags = fflags_from_resource(r) | RFTYPE_MON_INFO;
                sprintf(name, "%s_MON", r->name);
                ret = rdtgroup_mkdir_info_resdir(r, name, fflags);
                if (ret)
index 37279e2a89dae6aa2f5b72db4464f186ff1efeba..496ddcaa4ecf369c853cfb2059f3f8ff1ecf8f50 100644 (file)
@@ -210,7 +210,6 @@ enum resctrl_scope {
  * @format_str:                Per resource format string to show domain value
  * @parse_ctrlval:     Per resource function pointer to parse control values
  * @evt_list:          List of monitoring events
- * @fflags:            flags to choose base and info files
  * @cdp_capable:       Is the CDP feature available on this resource
  */
 struct rdt_resource {
@@ -232,7 +231,6 @@ struct rdt_resource {
                                                 struct resctrl_schema *s,
                                                 struct rdt_ctrl_domain *d);
        struct list_head        evt_list;
-       unsigned long           fflags;
        bool                    cdp_capable;
 };