]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/resctrl: Handle throttle_mode for SMBA resources
authorJames Morse <james.morse@arm.com>
Tue, 11 Mar 2025 18:37:13 +0000 (18:37 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Wed, 12 Mar 2025 11:24:46 +0000 (12:24 +0100)
Now that the visibility of throttle_mode is being managed by resctrl, it
should consider resources other than MBA that may have a throttle_mode.  SMBA
is one such resource.

Extend thread_throttle_mode_init() to check SMBA for a throttle_mode.

Adding support for multiple resources means it is possible for a platform with
both MBA and SMBA, but an undefined throttle_mode on one of them to make the
file visible.

Add the 'undefined' case to rdt_thread_throttle_mode_show().

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Reviewed-by: Fenghua Yu <fenghuay@nvidia.com>
Reviewed-by: Babu Moger <babu.moger@amd.com>
Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Peter Newman <peternewman@google.com>
Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.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-29-james.morse@arm.com
arch/x86/kernel/cpu/resctrl/rdtgroup.c

index 58feba3feefd8a12abd6f4b8fadfe7a031dcd041..5fc60c9ce28f8fe10eb90853c594ba848e85ff8e 100644 (file)
@@ -1188,10 +1188,19 @@ static int rdt_thread_throttle_mode_show(struct kernfs_open_file *of,
        struct resctrl_schema *s = of->kn->parent->priv;
        struct rdt_resource *r = s->res;
 
-       if (r->membw.throttle_mode == THREAD_THROTTLE_PER_THREAD)
+       switch (r->membw.throttle_mode) {
+       case THREAD_THROTTLE_PER_THREAD:
                seq_puts(seq, "per-thread\n");
-       else
+               return 0;
+       case THREAD_THROTTLE_MAX:
                seq_puts(seq, "max\n");
+               return 0;
+       case THREAD_THROTTLE_UNDEFINED:
+               seq_puts(seq, "undefined\n");
+               return 0;
+       }
+
+       WARN_ON_ONCE(1);
 
        return 0;
 }
@@ -2066,12 +2075,24 @@ static struct rftype *rdtgroup_get_rftype_by_name(const char *name)
 
 static void thread_throttle_mode_init(void)
 {
-       struct rdt_resource *r_mba;
+       enum membw_throttle_mode throttle_mode = THREAD_THROTTLE_UNDEFINED;
+       struct rdt_resource *r_mba, *r_smba;
 
        r_mba = resctrl_arch_get_resource(RDT_RESOURCE_MBA);
-       if (r_mba->membw.throttle_mode != THREAD_THROTTLE_UNDEFINED)
-               resctrl_file_fflags_init("thread_throttle_mode",
-                                        RFTYPE_CTRL_INFO | RFTYPE_RES_MB);
+       if (r_mba->alloc_capable &&
+           r_mba->membw.throttle_mode != THREAD_THROTTLE_UNDEFINED)
+               throttle_mode = r_mba->membw.throttle_mode;
+
+       r_smba = resctrl_arch_get_resource(RDT_RESOURCE_SMBA);
+       if (r_smba->alloc_capable &&
+           r_smba->membw.throttle_mode != THREAD_THROTTLE_UNDEFINED)
+               throttle_mode = r_smba->membw.throttle_mode;
+
+       if (throttle_mode == THREAD_THROTTLE_UNDEFINED)
+               return;
+
+       resctrl_file_fflags_init("thread_throttle_mode",
+                                RFTYPE_CTRL_INFO | RFTYPE_RES_MB);
 }
 
 void resctrl_file_fflags_init(const char *config, unsigned long fflags)