]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/resctrl: Make rdt_enable_key the arch's decision to switch
authorJames Morse <james.morse@arm.com>
Tue, 13 Feb 2024 18:44:32 +0000 (18:44 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 16 Feb 2024 18:18:33 +0000 (19:18 +0100)
rdt_enable_key is switched when resctrl is mounted. It was also previously used
to prevent a second mount of the filesystem.

Any other architecture that wants to support resctrl has to provide identical
static keys.

Now that there are helpers for enabling and disabling the alloc/mon keys,
resctrl doesn't need to switch this extra key, it can be done by the arch code.
Use the static-key increment and decrement helpers, and change resctrl to
ensure the calls are balanced.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Reviewed-by: Reinette Chatre <reinette.chatre@intel.com>
Reviewed-by: Babu Moger <babu.moger@amd.com>
Tested-by: Shaopeng Tan <tan.shaopeng@fujitsu.com>
Tested-by: Peter Newman <peternewman@google.com>
Tested-by: Babu Moger <babu.moger@amd.com>
Tested-by: Carl Worth <carl@os.amperecomputing.com> # arm64
Link: https://lore.kernel.org/r/20240213184438.16675-19-james.morse@arm.com
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
arch/x86/include/asm/resctrl.h
arch/x86/kernel/cpu/resctrl/rdtgroup.c

index 3c9137b6ad4f251bb48fae715f067ccded6016d6..b74aa34dc9e8fffc8c8a63ae8fe15dd82ce934ce 100644 (file)
@@ -45,21 +45,25 @@ DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
 static inline void resctrl_arch_enable_alloc(void)
 {
        static_branch_enable_cpuslocked(&rdt_alloc_enable_key);
+       static_branch_inc_cpuslocked(&rdt_enable_key);
 }
 
 static inline void resctrl_arch_disable_alloc(void)
 {
        static_branch_disable_cpuslocked(&rdt_alloc_enable_key);
+       static_branch_dec_cpuslocked(&rdt_enable_key);
 }
 
 static inline void resctrl_arch_enable_mon(void)
 {
        static_branch_enable_cpuslocked(&rdt_mon_enable_key);
+       static_branch_inc_cpuslocked(&rdt_enable_key);
 }
 
 static inline void resctrl_arch_disable_mon(void)
 {
        static_branch_disable_cpuslocked(&rdt_mon_enable_key);
+       static_branch_dec_cpuslocked(&rdt_enable_key);
 }
 
 /*
index 231207f09e040adf2771e0b8ae12fa525fdc4fc9..7e57ac9d81f7b8e4b8f853adb483061ce8950c2f 100644 (file)
@@ -2672,10 +2672,8 @@ static int rdt_get_tree(struct fs_context *fc)
        if (rdt_mon_capable)
                resctrl_arch_enable_mon();
 
-       if (rdt_alloc_capable || rdt_mon_capable) {
-               static_branch_enable_cpuslocked(&rdt_enable_key);
+       if (rdt_alloc_capable || rdt_mon_capable)
                resctrl_mounted = true;
-       }
 
        if (is_mbm_enabled()) {
                r = &rdt_resources_all[RDT_RESOURCE_L3].r_resctrl;
@@ -2946,9 +2944,10 @@ static void rdt_kill_sb(struct super_block *sb)
        rdtgroup_default.mode = RDT_MODE_SHAREABLE;
        schemata_list_destroy();
        rdtgroup_destroy_root();
-       resctrl_arch_disable_alloc();
-       resctrl_arch_disable_mon();
-       static_branch_disable_cpuslocked(&rdt_enable_key);
+       if (rdt_alloc_capable)
+               resctrl_arch_disable_alloc();
+       if (rdt_mon_capable)
+               resctrl_arch_disable_mon();
        resctrl_mounted = false;
        kernfs_kill_sb(sb);
        mutex_unlock(&rdtgroup_mutex);