]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
arm64: topology: Avoid checking numa mask for scheduler MC selection
authorJeremy Linton <jeremy.linton@arm.com>
Fri, 12 Oct 2018 17:48:44 +0000 (12:48 -0500)
committerKhalid Elmously <khalid.elmously@canonical.com>
Tue, 23 Oct 2018 06:45:58 +0000 (08:45 +0200)
The numa mask subset check can often lead to system hang or crash during
CPU hotplug and system suspend operation if NUMA is disabled. This is
mostly observed on HMP systems where the CPU compute capacities are
different and ends up in different scheduler domains. Since
cpumask_of_node is returned instead core_sibling, the scheduler is
confused with incorrect cpumasks(e.g. one CPU in two different sched
domains at the same time) on CPU hotplug.

Lets disable the NUMA siblings checks for the time being, as NUMA in
socket machines have LLC's that will assure that the scheduler topology
isn't "borken".

The NUMA check exists to assure that if a LLC within a socket crosses
NUMA nodes/chiplets the scheduler domains remain consistent. This code will
likely have to be re-enabled in the near future once the NUMA mask story
is sorted.  At the moment its not necessary because the NUMA in socket
machines LLC's are contained within the NUMA domains.

Further, as a defensive mechanism during hot-plug, lets assure that the
LLC siblings are also masked.

BugLink: http://launchpad.net/bugs/1797202
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Jeremy Linton <jeremy.linton@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit e156ab71a974737c279530e3b868131291fe677e)
Signed-off-by: Manoj Iyer <manoj.iyer@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Souza <kleber.souza@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
arch/arm64/kernel/topology.c

index 6fd3197495cf589c964279fb847ee7113ddacea9..eb2e6dd07507079ffbdec3e2f3ab2d641326a746 100644 (file)
@@ -219,13 +219,8 @@ EXPORT_SYMBOL_GPL(cpu_topology);
 
 const struct cpumask *cpu_coregroup_mask(int cpu)
 {
-       const cpumask_t *core_mask = cpumask_of_node(cpu_to_node(cpu));
+       const cpumask_t *core_mask = &cpu_topology[cpu].core_sibling;
 
-       /* Find the smaller of NUMA, core or LLC siblings */
-       if (cpumask_subset(&cpu_topology[cpu].core_sibling, core_mask)) {
-               /* not numa in package, lets use the package siblings */
-               core_mask = &cpu_topology[cpu].core_sibling;
-       }
        if (cpu_topology[cpu].llc_id != -1) {
                if (cpumask_subset(&cpu_topology[cpu].llc_siblings, core_mask))
                        core_mask = &cpu_topology[cpu].llc_siblings;
@@ -243,8 +238,10 @@ static void update_siblings_masks(unsigned int cpuid)
        for_each_possible_cpu(cpu) {
                cpu_topo = &cpu_topology[cpu];
 
-               if (cpuid_topo->llc_id == cpu_topo->llc_id)
+               if (cpuid_topo->llc_id == cpu_topo->llc_id) {
                        cpumask_set_cpu(cpu, &cpuid_topo->llc_siblings);
+                       cpumask_set_cpu(cpuid, &cpu_topo->llc_siblings);
+               }
 
                if (cpuid_topo->package_id != cpu_topo->package_id)
                        continue;