]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/smp: perform initial CPU reset also for SMT siblings
authorSven Schnelle <svens@linux.ibm.com>
Tue, 8 Dec 2020 06:35:21 +0000 (07:35 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Dec 2020 10:26:09 +0000 (11:26 +0100)
commit b5e438ebd7e808d1d2435159ac4742e01a94b8da upstream.

Not resetting the SMT siblings might leave them in unpredictable
state. One of the observed problems was that the CPU timer wasn't
reset and therefore large system time values where accounted during
CPU bringup.

Cc: <stable@kernel.org> # 4.0
Fixes: 10ad34bc76dfb ("s390: add SMT support")
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/kernel/smp.c

index 888f247c9261a77ba0389fa145f87c090fee5bd3..c47bd581a08a9a74231ea2a96bae34ee8e80c0c7 100644 (file)
@@ -863,24 +863,12 @@ static void smp_start_secondary(void *cpuvoid)
 /* Upping and downing of CPUs */
 int __cpu_up(unsigned int cpu, struct task_struct *tidle)
 {
-       struct pcpu *pcpu;
-       int base, i, rc;
+       struct pcpu *pcpu = pcpu_devices + cpu;
+       int rc;
 
-       pcpu = pcpu_devices + cpu;
        if (pcpu->state != CPU_STATE_CONFIGURED)
                return -EIO;
-       base = smp_get_base_cpu(cpu);
-       for (i = 0; i <= smp_cpu_mtid; i++) {
-               if (base + i < nr_cpu_ids)
-                       if (cpu_online(base + i))
-                               break;
-       }
-       /*
-        * If this is the first CPU of the core to get online
-        * do an initial CPU reset.
-        */
-       if (i > smp_cpu_mtid &&
-           pcpu_sigp_retry(pcpu_devices + base, SIGP_INITIAL_CPU_RESET, 0) !=
+       if (pcpu_sigp_retry(pcpu, SIGP_INITIAL_CPU_RESET, 0) !=
            SIGP_CC_ORDER_CODE_ACCEPTED)
                return -EIO;