From: Thomas Tai Date: Fri, 2 Sep 2016 19:18:19 +0000 (-0700) Subject: sparc64: Fixes NUMA node cpulist sysfs file in single NUMA node case. X-Git-Tag: v4.1.12-92~30^2~3 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=fdf8e9c846df76995f80e79cdc48a8ee7ad45a57;p=users%2Fjedix%2Flinux-maple.git sparc64: Fixes NUMA node cpulist sysfs file in single NUMA node case. Forward port 23175351 to UEK4 The sysfs file /sys/devices/system/node/node0/cpulist is incorrect in the single node case on sun4v machines as the machine description record in this case does not contain any NUMA information. A default list from 0 to NR_CPUS was used prior. This file is read by utilities such as 'numactl --hardware' and lscpu to show CPU-to-node assignment. In order to fix this issue, the numa_cpumask_lookup_table is cleared at bootup. Whenever an extra cpu is bringup via __cpu_up, the corresponding cpu mask is set in the numa_cpumask_lookup_table. Orabug: 24500614 Orabug: 22546851 Signed-off-by: Chris Hyser Signed-off-by: Thomas Tai --- diff --git a/arch/sparc/kernel/cpumap.h b/arch/sparc/kernel/cpumap.h index 9dac398c434a4..e6173aaccbc70 100644 --- a/arch/sparc/kernel/cpumap.h +++ b/arch/sparc/kernel/cpumap.h @@ -13,4 +13,6 @@ static inline int map_to_cpu(unsigned int index) } #endif +void sparc64_update_numa_mask(unsigned int cpu); + #endif diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index c4b6221d0f206..6263c03ab2a5f 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -1315,6 +1315,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) if (tlb_type != hypervisor) smp_synchronize_one_tick(cpu); cpu_map_rebuild(); + sparc64_update_numa_mask(cpu); } } return ret; diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index c28abb62367c7..2fde60da480a0 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -1266,7 +1266,10 @@ static void init_node_masks_nonnuma(void) for (i = 0; i < NR_CPUS; i++) numa_cpu_lookup_table[i] = 0; - cpumask_setall(&numa_cpumask_lookup_table[0]); + /* Add current cpu into numa_cpumask_lookup_table[0], + * the rest of the numa cpumask will be set in __cpu_up(). + */ + cpumask_set_cpu(smp_processor_id(), &numa_cpumask_lookup_table[0]); #endif } @@ -1831,6 +1834,13 @@ static int __init bootmem_init_numa(void) return err; } +void sparc64_update_numa_mask(unsigned int cpu) +{ + if (num_node_masks > 1) + return; + + cpumask_set_cpu(cpu, &numa_cpumask_lookup_table[0]); +} #else static int bootmem_init_numa(void) @@ -1838,6 +1848,10 @@ static int bootmem_init_numa(void) return -1; } +void sparc64_update_numa_mask(unsigned int cpu) +{ +} + #endif static void __init bootmem_init_nonnuma(void)