s390/topology: clear thread/group maps for offline cpus

The current code doesn't clear the thread/group maps for offline
CPUs. This may cause kernel crashes like the one bewlow in common
code that assumes if a CPU has sibblings it is online.

Unable to handle kernel pointer dereference in virtual kernel address space

Call Trace:
[<000000013a4b8c3c>] blk_mq_map_swqueue+0x10c/0x388
([<000000013a4b8bcc>] blk_mq_map_swqueue+0x9c/0x388)
[<000000013a4b9300>] blk_mq_init_allocated_queue+0x448/0x478
[<000000013a4b9416>] blk_mq_init_queue+0x4e/0x90
[<000003ff8019d3e6>] loop_add+0x106/0x278 [loop]
[<000003ff801b8148>] loop_init+0x148/0x1000 [loop]
[<0000000139de4924>] do_one_initcall+0x3c/0x1e0
[<0000000139ef449a>] do_init_module+0x6a/0x2a0
[<0000000139ef61bc>] __do_sys_finit_module+0xa4/0xc0
[<0000000139de9e6e>] do_syscall+0x7e/0xd0
[<000000013a8e0aec>] __do_syscall+0xbc/0x110
[<000000013a8ee2e8>] system_call+0x78/0xa0

Fixes: 52aeda7accb6 ("s390/topology: remove offline CPUs from CPU topology masks")
Cc: <stable@kernel.org> # 5.7+
Reported-by: Marius Hillenbrand <mhillen@linux.ibm.com>
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>

authored by Sven Schnelle and committed by Vasily Gorbik 9e3d62d5 8c0795d2

Changed files
+9 -3
arch
s390
kernel
+9 -3
arch/s390/kernel/topology.c
··· 66 66 { 67 67 static cpumask_t mask; 68 68 69 - cpumask_copy(&mask, cpumask_of(cpu)); 69 + cpumask_clear(&mask); 70 + if (!cpu_online(cpu)) 71 + goto out; 72 + cpumask_set_cpu(cpu, &mask); 70 73 switch (topology_mode) { 71 74 case TOPOLOGY_MODE_HW: 72 75 while (info) { ··· 86 83 default: 87 84 fallthrough; 88 85 case TOPOLOGY_MODE_SINGLE: 89 - cpumask_copy(&mask, cpumask_of(cpu)); 90 86 break; 91 87 } 92 88 cpumask_and(&mask, &mask, cpu_online_mask); 89 + out: 93 90 cpumask_copy(dst, &mask); 94 91 } 95 92 ··· 98 95 static cpumask_t mask; 99 96 int i; 100 97 101 - cpumask_copy(&mask, cpumask_of(cpu)); 98 + cpumask_clear(&mask); 99 + if (!cpu_online(cpu)) 100 + goto out; 101 + cpumask_set_cpu(cpu, &mask); 102 102 if (topology_mode != TOPOLOGY_MODE_HW) 103 103 goto out; 104 104 cpu -= cpu % (smp_cpu_mtid + 1);