FAILED: patch "[PATCH] s390/topology: fix topology information when calling cpu" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a052096bdd6809eeab809202726634d1ac975aa1 Mon Sep 17 00:00:00 2001
From: Sven Schnelle <[email protected]>
Date: Fri, 27 Aug 2021 20:21:05 +0200
Subject: [PATCH] s390/topology: fix topology information when calling cpu
hotplug notifiers
The cpu hotplug notifiers are called without updating the core/thread masks when a new CPU is added. This causes problems with code setting up data structures in a cpu hotplug notifier, and relying on that later in normal code.
This caused a crash in the new core scheduling code (SCHED_CORE), where rq->core was set up in a notifier depending on cpu masks.
To fix this, add a cpu_setup_mask which is used in update_cpu_masks() instead of the cpu_online_mask to determine whether the cpu masks should be set for a certain cpu. Also move update_cpu_masks() to update the masks before calling notify_cpu_starting() so that the notifiers are seeing the updated masks.
arch/s390/include/asm/smp.h +1 -0
@@ -18,6 +18,7 @@ extern struct mutex smp_cpu_state_mutex;extern unsigned int smp_cpu_mt_shift;extern unsigned int smp_cpu_mtid;extern __vector128 __initdata boot_cpu_vector_save_area[__NUM_VXRS]; +extern cpumask_t cpu_setup_mask;extern int __cpu_up (unsigned int cpu,struct task_struct *tidle);
arch/s390/kernel/smp.c +7 -2
@@ -95,6 +95,7 @@ __vector128 __initdata boot_cpu_vector_save_area[__NUM_VXRS];#endif static unsigned int smp_max_threads__initdata =-1U ; +cpumask_t cpu_setup_mask;static int __init early_nosmt (char *s) {
@@ -902,13 +903,14 @@ static void smp_start_secondary(void *cpuvoid)vtime_init ();vdso_getcpu_init ();pfault_init (); +cpumask_set_cpu (cpu, &cpu_setup_mask); +update_cpu_masks ();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 (cpu, true); -update_cpu_masks ();inc_irq_stat (CPU_RST );local_irq_enable ();cpu_startup_entry (CPUHP_AP_ONLINE_IDLE );
@@ -950,10 +952,13 @@ early_param("possible_cpus", _setup_possible_cpus);int __cpu_disable (void ) {unsigned long cregs[16 ]; +int cpu;/* Handle possible pending IPIs */ smp_handle_ext_call (); -set_cpu_online (smp_processor_id (), false); + cpu =smp_processor_id (); +set_cpu_online (cpu, false); +cpumask_clear_cpu (cpu, &cpu_setup_mask);update_cpu_masks ();/* Disable pseudo page faults on this cpu. */ pfault_fini ();
arch/s390/kernel/topology.c +7 -6
@@ -67,7 +67,7 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int cstatic cpumask_t mask;cpumask_clear (&mask); -if (!cpu_online (cpu)) +if (!cpumask_test_cpu (cpu, &cpu_setup_mask)) goto out;cpumask_set_cpu (cpu, &mask);switch (topology_mode) {
@@ -88,7 +88,7 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int ccase TOPOLOGY_MODE_SINGLE :break ; } -cpumask_and (&mask, &mask, cpu_online_mask); +cpumask_and (&mask, &mask, &cpu_setup_mask); out:cpumask_copy (dst, &mask); }
@@ -99,16 +99,16 @@ static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)int i;cpumask_clear (&mask); -if (!cpu_online (cpu)) +if (!cpumask_test_cpu (cpu, &cpu_setup_mask)) goto out;cpumask_set_cpu (cpu, &mask);if (topology_mode !=TOPOLOGY_MODE_HW ) goto out; cpu -= cpu % (smp_cpu_mtid +1 ); -for (i =0 ; i <= smp_cpu_mtid; i++) -if (cpu_present (cpu + i)) +for (i =0 ; i <= smp_cpu_mtid; i++) { +if (cpumask_test_cpu (cpu + i, &cpu_setup_mask))cpumask_set_cpu (cpu + i, &mask); -cpumask_and (&mask, &mask, cpu_online_mask); + } out:cpumask_copy (dst, &mask); }
@@ -569,6 +569,7 @@ void __init topology_init_early(void)alloc_masks (info, &book_info,2 );alloc_masks (info, &drawer_info,3 ); out: +cpumask_set_cpu (0 , &cpu_setup_mask);__arch_update_cpu_topology ();__arch_update_dedicated_flag (NULL ); }