OSDN Git Service

s390/topology: remove offline CPUs from CPU topology masks
authorAlexander Gordeev <agordeev@linux.ibm.com>
Thu, 12 Mar 2020 10:32:23 +0000 (11:32 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 23 Mar 2020 12:41:54 +0000 (13:41 +0100)
The CPU topology masks on s390 contain also bits of CPUs which
are offline. Currently this is already a problem, since common
code scheduler expects e.g. cpu_smt_mask() to reflect reality.

This update changes the described behaviour and s390 starts to
behave like all other architectures.

Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/topology.h
arch/s390/kernel/smp.c
arch/s390/kernel/topology.c

index 4648303..56b1461 100644 (file)
@@ -43,6 +43,7 @@ int topology_cpu_init(struct cpu *);
 int topology_set_cpu_management(int fc);
 void topology_schedule_update(void);
 void store_topology(struct sysinfo_15_1_x *info);
+void update_cpu_masks(void);
 void topology_expect_change(void);
 const struct cpumask *cpu_coregroup_mask(int cpu);
 
@@ -52,6 +53,7 @@ static inline void topology_init_early(void) { }
 static inline void topology_schedule_update(void) { }
 static inline int topology_cpu_init(struct cpu *cpu) { return 0; }
 static inline int topology_cpu_dedicated(int cpu_nr) { return 0; }
+static inline void update_cpu_masks(void) { }
 static inline void topology_expect_change(void) { }
 
 #endif /* CONFIG_SCHED_TOPOLOGY */
index edc1bf3..7eaabba 100644 (file)
@@ -858,12 +858,13 @@ static void smp_init_secondary(void)
        init_cpu_timer();
        vtime_init();
        pfault_init();
-       notify_cpu_starting(smp_processor_id());
+       notify_cpu_starting(cpu);
        if (topology_cpu_dedicated(cpu))
                set_cpu_flag(CIF_DEDICATED_CPU);
        else
                clear_cpu_flag(CIF_DEDICATED_CPU);
-       set_cpu_online(smp_processor_id(), true);
+       set_cpu_online(cpu, true);
+       update_cpu_masks();
        inc_irq_stat(CPU_RST);
        local_irq_enable();
        cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
@@ -935,6 +936,7 @@ int __cpu_disable(void)
        /* Handle possible pending IPIs */
        smp_handle_ext_call();
        set_cpu_online(smp_processor_id(), false);
+       update_cpu_masks();
        /* Disable pseudo page faults on this cpu. */
        pfault_fini();
        /* Disable interrupt sources via control register. */
index ec1bffe..09711d5 100644 (file)
@@ -88,6 +88,7 @@ static cpumask_t cpu_group_map(struct mask_info *info, unsigned int cpu)
                cpumask_copy(&mask, cpumask_of(cpu));
                break;
        }
+       cpumask_and(&mask, &mask, cpu_online_mask);
        return mask;
 }
 
@@ -103,6 +104,7 @@ static cpumask_t cpu_thread_map(unsigned int cpu)
        for (i = 0; i <= smp_cpu_mtid; i++)
                if (cpu_present(cpu + i))
                        cpumask_set_cpu(cpu + i, &mask);
+       cpumask_and(&mask, &mask, cpu_online_mask);
        return mask;
 }
 
@@ -241,7 +243,7 @@ int topology_set_cpu_management(int fc)
        return rc;
 }
 
-static void update_cpu_masks(void)
+void update_cpu_masks(void)
 {
        struct cpu_topology_s390 *topo;
        int cpu, id;