• Mikulas Patocka's avatar
    parisc: fix a crash with multicore scheduler · 6ba68836
    Mikulas Patocka authored
    With the kernel 5.18, the system will hang on boot if it is compiled with
    CONFIG_SCHED_MC. The last printed message is "Brought up 1 node, 1 CPU".
    
    The crash happens in sd_init
    tl->mask (which is cpu_coregroup_mask) returns an empty mask. This happens
    	because cpu_topology[0].core_sibling is empty.
    Consequently, sd_span is set to an empty mask
    sd_id = cpumask_first(sd_span) sets sd_id == NR_CPUS (because the mask is
    	empty)
    sd->shared = *per_cpu_ptr(sdd->sds, sd_id); sets sd->shared to NULL
    	because sd_id is out of range
    atomic_inc(&sd->shared->ref); crashes without printing anything
    
    We can fix it by calling reset_cpu_topology() from init_cpu_topology() -
    this will initialize the sibling masks on CPUs, so that they're not empty.
    
    This patch also removes the variable "dualcores_found", it is useless,
    because during boot, init_cpu_topology is called before
    store_cpu_topology. Thus, set_sched_topology(parisc_mc_topology) is never
    called. We don't need to call it at all because default_topology in
    kernel/sched/topology.c contains the same items as parisc_mc_topology.
    
    Note that we should not call store_cpu_topology() from init_per_cpu()
    because it is called too early in the kernel initialization process and it
    results in the message "Failure to register CPU0 device". Before this
    patch, store_cpu_topology() would exit immediatelly because
    cpuid_topo->core id was uninitialized and it was 0.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org	# v5.18
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    6ba68836
processor.c 13.2 KB