x86/resctrl: Add CPU offline callback for resctrl work
authorJames Morse <james.morse@arm.com>
Tue, 13 Feb 2024 18:44:36 +0000 (18:44 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 16 Feb 2024 18:18:33 +0000 (19:18 +0100)
The resctrl architecture specific code may need to free a domain when a CPU
goes offline, it also needs to reset the CPUs PQR_ASSOC register.  Amongst
other things, the resctrl filesystem code needs to clear this CPU from the
cpu_mask of any control and monitor groups.

Currently, this is all done in core.c and called from resctrl_offline_cpu(),
making the split between architecture and filesystem code unclear.

Move the filesystem work to remove the CPU from the control and monitor groups
into a filesystem helper called resctrl_offline_cpu(), and rename the one in
core.c resctrl_arch_offline_cpu().

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-23-james.morse@arm.com
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
arch/x86/kernel/cpu/resctrl/core.c
arch/x86/kernel/cpu/resctrl/rdtgroup.c
include/linux/resctrl.h

index 55322ba629da3e2ffbb7d415c2887e71ecdcd178..4aedefa22f6114ac09cb9344d92498a18f5a92e5 100644 (file)
@@ -625,31 +625,15 @@ static int resctrl_arch_online_cpu(unsigned int cpu)
        return 0;
 }
 
-static void clear_childcpus(struct rdtgroup *r, unsigned int cpu)
+static int resctrl_arch_offline_cpu(unsigned int cpu)
 {
-       struct rdtgroup *cr;
-
-       list_for_each_entry(cr, &r->mon.crdtgrp_list, mon.crdtgrp_list) {
-               if (cpumask_test_and_clear_cpu(cpu, &cr->cpu_mask)) {
-                       break;
-               }
-       }
-}
-
-static int resctrl_offline_cpu(unsigned int cpu)
-{
-       struct rdtgroup *rdtgrp;
        struct rdt_resource *r;
 
        mutex_lock(&rdtgroup_mutex);
+       resctrl_offline_cpu(cpu);
+
        for_each_capable_rdt_resource(r)
                domain_remove_cpu(cpu, r);
-       list_for_each_entry(rdtgrp, &rdt_all_groups, rdtgroup_list) {
-               if (cpumask_test_and_clear_cpu(cpu, &rdtgrp->cpu_mask)) {
-                       clear_childcpus(rdtgrp, cpu);
-                       break;
-               }
-       }
        clear_closid_rmid(cpu);
        mutex_unlock(&rdtgroup_mutex);
 
@@ -971,7 +955,8 @@ static int __init resctrl_late_init(void)
 
        state = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
                                  "x86/resctrl/cat:online:",
-                                 resctrl_arch_online_cpu, resctrl_offline_cpu);
+                                 resctrl_arch_online_cpu,
+                                 resctrl_arch_offline_cpu);
        if (state < 0)
                return state;
 
index f5688c79d94f4a89b0c986fd5a5ffc16f88527ba..5bd3d8fb3f67df55c60c48845be802b9f031f150 100644 (file)
@@ -4017,6 +4017,30 @@ void resctrl_online_cpu(unsigned int cpu)
        cpumask_set_cpu(cpu, &rdtgroup_default.cpu_mask);
 }
 
+static void clear_childcpus(struct rdtgroup *r, unsigned int cpu)
+{
+       struct rdtgroup *cr;
+
+       list_for_each_entry(cr, &r->mon.crdtgrp_list, mon.crdtgrp_list) {
+               if (cpumask_test_and_clear_cpu(cpu, &cr->cpu_mask))
+                       break;
+       }
+}
+
+void resctrl_offline_cpu(unsigned int cpu)
+{
+       struct rdtgroup *rdtgrp;
+
+       lockdep_assert_held(&rdtgroup_mutex);
+
+       list_for_each_entry(rdtgrp, &rdt_all_groups, rdtgroup_list) {
+               if (cpumask_test_and_clear_cpu(cpu, &rdtgrp->cpu_mask)) {
+                       clear_childcpus(rdtgrp, cpu);
+                       break;
+               }
+       }
+}
+
 /*
  * rdtgroup_init - rdtgroup initialization
  *
index ccbbbe5d18d34e6d1ef8946732761666d318508a..270ff1d5c051ca1cc6206c645c967e6e6f619c60 100644 (file)
@@ -226,6 +226,7 @@ u32 resctrl_arch_get_config(struct rdt_resource *r, struct rdt_domain *d,
 int resctrl_online_domain(struct rdt_resource *r, struct rdt_domain *d);
 void resctrl_offline_domain(struct rdt_resource *r, struct rdt_domain *d);
 void resctrl_online_cpu(unsigned int cpu);
+void resctrl_offline_cpu(unsigned int cpu);
 
 /**
  * resctrl_arch_rmid_read() - Read the eventid counter corresponding to rmid