4583a64892
commit 98937707fea8375e8acea0aaa0b68a956dd52719 upstream. Nick Bowler reported: When using newer kernels on my Ultra 60 with dual 450MHz UltraSPARC-II CPUs, I noticed that only CPU 0 comes up, while older kernels (including 4.7) are working fine with both CPUs. I bisected the failure to this commit: 9b2f753ec23710aa32c0d837d2499db92fe9115b is the first bad commit commit 9b2f753ec23710aa32c0d837d2499db92fe9115b Author: Atish Patra <atish.patra@oracle.com> Date: Thu Sep 15 14:54:40 2016 -0600 sparc64: Fix cpu_possible_mask if nr_cpus is set This is a small change that reverts very easily on top of 5.18: there is just one trivial conflict. Once reverted, both CPUs work again. Maybe this is related to the fact that the CPUs on this system are numbered CPU0 and CPU2 (there is no CPU1)? The current code that adjust cpu_possible based on nr_cpu_ids do not take into account that CPU's may not come one after each other. Move the chech to the function that setup the cpu_possible mask so there is no need to adjust it later. Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Fixes: 9b2f753ec237 ("sparc64: Fix cpu_possible_mask if nr_cpus is set") Reported-by: Nick Bowler <nbowler@draconx.ca> Tested-by: Nick Bowler <nbowler@draconx.ca> Link: https://lore.kernel.org/sparclinux/20201009161924.c8f031c079dd852941307870@gmx.de/ Link: https://lore.kernel.org/all/CADyTPEwt=ZNams+1bpMB1F9w_vUdPsGCt92DBQxxq_VtaLoTdw@mail.gmail.com/ Cc: stable@vger.kernel.org # v4.8+ Cc: Andreas Larsson <andreas@gaisler.com> Cc: David S. Miller <davem@davemloft.net> Cc: Atish Patra <atish.patra@oracle.com> Cc: Bob Picco <bob.picco@oracle.com> Cc: Vijay Kumar <vijay.ac.kumar@oracle.com> Cc: David S. Miller <davem@davemloft.net> Reviewed-by: Andreas Larsson <andreas@gaisler.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Link: https://lore.kernel.org/r/20240330-sparc64-warnings-v1-9-37201023ee2f@ravnborg.org Signed-off-by: Andreas Larsson <andreas@gaisler.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
84 lines
1.7 KiB
C
Executable file
84 lines
1.7 KiB
C
Executable file
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* smp.h: Sparc64 specific SMP stuff.
|
|
*
|
|
* Copyright (C) 1996, 2008 David S. Miller (davem@davemloft.net)
|
|
*/
|
|
|
|
#ifndef _SPARC64_SMP_H
|
|
#define _SPARC64_SMP_H
|
|
|
|
#include <linux/threads.h>
|
|
#include <asm/asi.h>
|
|
#include <asm/starfire.h>
|
|
#include <asm/spitfire.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/cpumask.h>
|
|
#include <linux/cache.h>
|
|
|
|
#endif /* !(__ASSEMBLY__) */
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/*
|
|
* Private routines/data
|
|
*/
|
|
|
|
#include <linux/bitops.h>
|
|
#include <linux/atomic.h>
|
|
#include <asm/percpu.h>
|
|
|
|
DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
|
|
extern cpumask_t cpu_core_map[NR_CPUS];
|
|
|
|
void smp_init_cpu_poke(void);
|
|
void scheduler_poke(void);
|
|
|
|
void arch_send_call_function_single_ipi(int cpu);
|
|
void arch_send_call_function_ipi_mask(const struct cpumask *mask);
|
|
|
|
/*
|
|
* General functions that each host system must provide.
|
|
*/
|
|
|
|
int hard_smp_processor_id(void);
|
|
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
|
|
|
void smp_fill_in_sib_core_maps(void);
|
|
void cpu_play_dead(void);
|
|
|
|
void smp_fetch_global_regs(void);
|
|
void smp_fetch_global_pmu(void);
|
|
|
|
struct seq_file;
|
|
void smp_bogo(struct seq_file *);
|
|
void smp_info(struct seq_file *);
|
|
|
|
void smp_callin(void);
|
|
void cpu_panic(void);
|
|
void smp_synchronize_tick_client(void);
|
|
void smp_capture(void);
|
|
void smp_release(void);
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
int __cpu_disable(void);
|
|
void __cpu_die(unsigned int cpu);
|
|
#endif
|
|
|
|
#endif /* !(__ASSEMBLY__) */
|
|
|
|
#else
|
|
|
|
#define hard_smp_processor_id() 0
|
|
#define smp_fill_in_sib_core_maps() do { } while (0)
|
|
#define smp_fetch_global_regs() do { } while (0)
|
|
#define smp_fetch_global_pmu() do { } while (0)
|
|
#define smp_init_cpu_poke() do { } while (0)
|
|
#define scheduler_poke() do { } while (0)
|
|
|
|
#endif /* !(CONFIG_SMP) */
|
|
|
|
#endif /* !(_SPARC64_SMP_H) */
|