| From fb7d7518b0d65955f91c7b875c36eae7694c69bd Mon Sep 17 00:00:00 2001 |
| From: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Date: Tue, 31 Jul 2018 16:14:18 +0200 |
| Subject: s390/numa: move initial setup of node_to_cpumask_map |
| |
| From: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| |
| commit fb7d7518b0d65955f91c7b875c36eae7694c69bd upstream. |
| |
| The numa_init_early initcall sets the node_to_cpumask_map[0] to the |
| full cpu_possible_mask. Unfortunately this early_initcall is too late, |
| the NUMA setup for numa=emu is done even earlier. The order of calls |
| is numa_setup() -> emu_update_cpu_topology(), then the early_initcalls(), |
| followed by sched_init_domains(). |
| |
| Starting with git commit 051f3ca02e46432c0965e8948f00c07d8a2f09c0 |
| "sched/topology: Introduce NUMA identity node sched domain" |
| the incorrect node_to_cpumask_map[0] really screws up the domain |
| setup and the kernel panics with the follow oops: |
| |
| Cc: <stable@vger.kernel.org> # v4.15+ |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/s390/numa/numa.c | 16 ++-------------- |
| 1 file changed, 2 insertions(+), 14 deletions(-) |
| |
| --- a/arch/s390/numa/numa.c |
| +++ b/arch/s390/numa/numa.c |
| @@ -134,6 +134,8 @@ void __init numa_setup(void) |
| { |
| pr_info("NUMA mode: %s\n", mode->name); |
| nodes_clear(node_possible_map); |
| + /* Initially attach all possible CPUs to node 0. */ |
| + cpumask_copy(&node_to_cpumask_map[0], cpu_possible_mask); |
| if (mode->setup) |
| mode->setup(); |
| numa_setup_memory(); |
| @@ -141,20 +143,6 @@ void __init numa_setup(void) |
| } |
| |
| /* |
| - * numa_init_early() - Initialization initcall |
| - * |
| - * This runs when only one CPU is online and before the first |
| - * topology update is called for by the scheduler. |
| - */ |
| -static int __init numa_init_early(void) |
| -{ |
| - /* Attach all possible CPUs to node 0 for now. */ |
| - cpumask_copy(&node_to_cpumask_map[0], cpu_possible_mask); |
| - return 0; |
| -} |
| -early_initcall(numa_init_early); |
| - |
| -/* |
| * numa_init_late() - Initialization initcall |
| * |
| * Register NUMA nodes. |