]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc64: Update cpumaps correctly during hotplug.
authorAtish Patra <atish.patra@oracle.com>
Mon, 23 Jan 2017 21:39:24 +0000 (14:39 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 9 Mar 2017 03:30:11 +0000 (19:30 -0800)
Currently,numa_cpu_mask is not updated when cpus are
hotplugged resulting incorrect number of cpus reported
by lscpu/numactl. Moreover, cpu_core_sib_cache_map is
also not cleared when cpu goes offline.

Update both the masks correctly whenever cpu goes online/
offline.

Orabug: 25144324

Signed-off-by: Atish Patra <atish.patra@oracle.com>
Reviewed-by: Allen Pais <allen.pais@oracle.com>
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/kernel/cpumap.h
arch/sparc/kernel/smp_64.c
arch/sparc/mm/init_64.c

index e6173aaccbc709983f51e0d63b337209f7cc13fc..c764ed25ed0a660e6008339f14ea7c9f9985ec40 100644 (file)
@@ -14,5 +14,6 @@ static inline int map_to_cpu(unsigned int index)
 #endif
 
 void sparc64_update_numa_mask(unsigned int cpu);
+void sparc64_clear_numa_mask(unsigned int cpu);
 
 #endif
index 7963bae4492795a72595085e26e6947f834ea534..9455397912014433058284467a0f5ccc86cef0de 100644 (file)
@@ -1388,10 +1388,15 @@ int __cpu_disable(void)
                cpumask_clear_cpu(cpu, &cpu_core_sib_map[i]);
        cpumask_clear(&cpu_core_sib_map[cpu]);
 
+       for_each_cpu(i, &cpu_core_sib_cache_map[cpu])
+               cpumask_clear_cpu(cpu, &cpu_core_sib_cache_map[i]);
+       cpumask_clear(&cpu_core_sib_cache_map[cpu]);
+
        for_each_cpu(i, &per_cpu(cpu_sibling_map, cpu))
                cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));
        cpumask_clear(&per_cpu(cpu_sibling_map, cpu));
 
+       sparc64_clear_numa_mask(cpu);
        /*
         * Offline before fixup.
         * See irq_choose_cpu(), cpu_map_rebuild().
index 3bc1ab2aa1be2271fbb8d5f86cfd5a4a02f22b7c..052309b04b375448dffecc952104aec8c23df7fb 100644 (file)
@@ -1836,11 +1836,14 @@ static int __init bootmem_init_numa(void)
 
 void sparc64_update_numa_mask(unsigned int cpu)
 {
-       if (num_node_masks > 1)
-               return;
+       cpumask_set_cpu(cpu, &numa_cpumask_lookup_table[cpu_to_node(cpu)]);
+}
 
-       cpumask_set_cpu(cpu, &numa_cpumask_lookup_table[0]);
+void sparc64_clear_numa_mask(unsigned int cpu)
+{
+       cpumask_clear_cpu(cpu, &numa_cpumask_lookup_table[cpu_to_node(cpu)]);
 }
+#
 #else
 
 static int bootmem_init_numa(void)
@@ -1852,6 +1855,9 @@ void sparc64_update_numa_mask(unsigned int cpu)
 {
 }
 
+void sparc64_clear_numa_mask(unsigned int cpu)
+{
+}
 #endif
 
 static void __init bootmem_init_nonnuma(void)