linux/arch/mips/kernel
Matt Redfearn 8f46cca1e6 MIPS: SMP: Fix possibility of deadlock when bringing CPUs online
This patch fixes the possibility of a deadlock when bringing up
secondary CPUs.
The deadlock occurs because the set_cpu_online() is called before
synchronise_count_slave(). This can cause a deadlock if the boot CPU,
having scheduled another thread, attempts to send an IPI to the
secondary CPU, which it sees has been marked online. The secondary is
blocked in synchronise_count_slave() waiting for the boot CPU to enter
synchronise_count_master(), but the boot cpu is blocked in
smp_call_function_many() waiting for the secondary to respond to it's
IPI request.

Fix this by marking the CPU online in cpu_callin_map and synchronising
counters before declaring the CPU online and calculating the maps for
IPIs.

Signed-off-by: Matt Redfearn <matt.redfearn@imgtec.com>
Reported-by: Justin Chen <justinpopo6@gmail.com>
Tested-by: Justin Chen <justinpopo6@gmail.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: stable@vger.kernel.org # v4.1+
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/14302/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2016-09-25 01:43:52 +02:00
..
.gitignore
8250-platform.c mips: remove needless include of module.h from core kernel files. 2011-10-31 19:30:57 -04:00
Makefile MIPS: Factor o32 specific code into signal_o32.c 2016-08-02 11:02:35 +02:00
asm-offsets.c MIPS: KVM: Drop now unused asm offsets 2016-07-05 16:08:48 +02:00
binfmt_elfn32.c MIPS: ELF: Unify ABI classification macros 2016-05-13 15:30:25 +02:00
binfmt_elfo32.c MIPS: ELF: Unify ABI classification macros 2016-05-13 15:30:25 +02:00
bmips_5xxx_init.S MIPS: BMIPS: Make whitespacely correct. 2016-05-09 12:00:01 +02:00
bmips_vec.S MIPS: BMIPS: Add Whirlwind (BMIPS5200) initialization code 2016-05-09 12:00:01 +02:00
branch.c MIPS: inst.h: Rename cbcond{0,1}_op to pop{1,3}0_op 2016-07-05 16:09:07 +02:00
cevt-bcm1480.c MIPS: cevt-bcm1480: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-ds1287.c MIPS: cevt-ds1287: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-gt641xx.c MIPS: cevt-gt641xx: Migrate to new 'set-state' interface 2015-09-03 12:07:51 +02:00
cevt-r4k.c MIPS: Fix r4k clockevents registration 2016-07-24 11:59:48 +02:00
cevt-sb1250.c MIPS: cevt-sb1250: Migrate to new 'set-state' interface 2015-09-03 12:07:52 +02:00
cevt-txx9.c MIPS: cevt-txx9: Migrate to new 'set-state' interface 2015-09-03 12:07:53 +02:00
cps-vec-ns16550.S MIPS: CPS: Early debug using an ns16550-compatible UART 2015-11-11 08:34:25 +01:00
cps-vec.S MIPS: CPS: Copy EVA configuration when starting secondary VPs. 2016-05-28 12:35:05 +02:00
cpu-bugs64.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
cpu-probe.c MIPS: Fix incomplete separation of XPA CPU feature 2016-05-28 12:35:03 +02:00
crash.c MIPS: Fix crash registers on non-crashing CPUs 2016-05-09 12:00:00 +02:00
crash_dump.c mips: Convert pr_warning to pr_warn 2014-11-24 07:44:51 +01:00
csrc-bcm1480.c MIPS: csrc-bcm1480: Implement read_sched_clock 2015-04-01 17:21:27 +02:00
csrc-ioasic.c MIPS: csrc-ioasic: Implement read_sched_clock 2015-04-01 17:21:28 +02:00
csrc-r4k.c MIPS: Don't register r4k sched clock when CPUFREQ enabled 2016-07-24 12:00:15 +02:00
csrc-sb1250.c MIPS: csrc-sb1250: Implement read_sched_clock 2015-04-01 17:21:33 +02:00
early_printk.c early_printk: consolidate random copies of identical code 2013-04-29 18:28:13 -07:00
early_printk_8250.c MIPS: Add 8250/16550 serial early printk driver 2013-10-29 21:24:36 +01:00
elf.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-08-06 09:13:11 -04:00
entry.S MIPS: kernel: entry.S: Set correct ISA level for mips_ihb 2015-04-10 15:41:46 +02:00
ftrace.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2014-08-07 08:47:00 -07:00
genex.S MIPS: genex: Indent delay slots & clean whitespace 2016-05-13 14:02:20 +02:00
gpio_txx9.c MIPS: txx9: switch to gpiochip_add_data() 2016-02-19 09:51:44 +01:00
head.S MIPS: store the appended dtb address in a variable 2016-08-02 14:00:16 +02:00
i8253.c MIPS: irq: Remove IRQF_DISABLED 2011-12-07 22:03:45 +00:00
idle.c MIPS: Loongson: Add Loongson-3A R2 basic support 2016-05-13 14:02:14 +02:00
irq-gt641xx.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
irq-msc01.c MIPS: MSC: Prevent out-of-bounds writes to MIPS SC ioremap'd region 2014-06-26 10:48:23 +01:00
irq-rm7000.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
irq.c MIPS: Clear Status IPL field when using EIC 2016-05-28 12:35:02 +02:00
irq_txx9.c MIPS: Whitespace cleanup. 2013-02-01 10:00:22 +01:00
jump_label.c jump_label: Rename JUMP_LABEL_{EN,DIS}ABLE to JUMP_LABEL_{JMP,NOP} 2015-08-03 11:34:12 +02:00
kgdb.c MIPS: Get rid of 'kgdb_early_setup' cruft. 2015-06-21 21:54:10 +02:00
kprobes.c mips: Replace __get_cpu_var uses 2014-08-26 13:45:51 -04:00
linux32.c unify compat fanotify_mark(2), switch to COMPAT_SYSCALL_DEFINE 2013-05-09 13:46:38 -04:00
machine_kexec.c MIPS: kdump: Set correct value to kexec_indirection_page variable 2014-08-25 16:33:44 +02:00
mcount.S MIPS: mcount: Adjust stack pointer for static trace in MIPS32 2014-09-26 11:41:17 +02:00
mips-cm.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
mips-cpc.c MIPS: CM, CPC: Ensure core-other GCRs reflect the correct core 2015-11-11 08:35:18 +01:00
mips-mt-fpaff.c MIPS: Fix sched_getaffinity with MT FPAFF enabled 2015-08-03 09:25:02 +02:00
mips-mt.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
mips-r2-to-r6-emul.c MIPS: Fix pre-r6 emulation FPU initialisation 2016-09-23 18:21:38 +02:00
mips_ksyms.c MIPS: uaccess: Take EVA into account in [__]clear_user 2015-12-22 11:58:43 +01:00
mips_machine.c MIPS: move mips_{set,get}_machine_name() to a more generic place 2013-05-08 01:19:07 +02:00
module-rela.c MIPS: module: fix incorrect IS_ERR_VALUE macro usages 2016-05-13 14:02:11 +02:00
module.c MIPS: module: fix incorrect IS_ERR_VALUE macro usages 2016-05-13 14:02:11 +02:00
octeon_switch.S MIPS: Fix octeon FP context switch handling 2015-10-02 19:16:06 +02:00
perf_event.c perf core: Add a 'nr' field to perf_event_callchain_context 2016-05-16 23:11:51 -03:00
perf_event_mipsxx.c MIPS: perf: Fix I6400 event numbers 2016-05-17 11:05:07 +02:00
pm-cps.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
pm.c MIPS: Fix watchpoint restoration 2016-05-09 12:00:02 +02:00
proc.c MIPS: Detect DSP v3 support 2016-05-13 14:01:57 +02:00
process.c MIPS: Avoid a BUG warning during prctl(PR_SET_FP_MODE, ...) 2016-09-19 16:18:05 +02:00
prom.c MIPS: Fix build with CONFIG_OF=y for non OF-enabled targets 2015-08-03 09:25:00 +02:00
ptrace.c MIPS/ptrace: run seccomp after ptrace 2016-06-14 10:54:44 -07:00
ptrace32.c MIPS: Remove asm/user.h 2014-08-02 00:06:37 +02:00
r4k_fpu.S MIPS: Use copy_s.fmt rather than copy_u.fmt 2016-05-09 12:00:04 +02:00
r4k_switch.S MIPS: Remove redundant asm/pgtable-bits.h inclusions 2016-05-13 15:30:25 +02:00
r2300_fpu.S MIPS: Avoid variant of .type unsupported by LLVM Assembler 2016-02-29 11:23:49 +01:00
r2300_switch.S MIPS: Fix R2300 FP context switch handling 2015-10-02 19:16:46 +02:00
r6000_fpu.S MIPS: Fix build with binutils 2.24.51+ 2014-11-07 15:07:36 +01:00
relocate.c MIPS: Kernel: Implement KASLR using CONFIG_RELOCATABLE 2016-05-13 14:02:03 +02:00
relocate_kernel.S MIPS: Replace add and sub instructions in relocate_kernel.S with addiu 2015-08-03 15:26:30 +02:00
reset.c MIPS: Provide fallback reboot/poweroff/halt implementations 2015-04-01 17:21:58 +02:00
rtlx-cmp.c MIPS: APRP: Fix an issue when device_create() fails. 2014-08-01 17:30:35 +02:00
rtlx-mt.c MIPS: APRP: Fix an issue when device_create() fails. 2014-08-01 17:30:35 +02:00
rtlx.c MIPS: rtlx: Remove KERN_DEBUG from pr_debug() arguments in rtlx.c 2014-11-24 07:44:04 +01:00
scall32-o32.S MIPS: scall: Handle seccomp filters which redirect syscalls 2016-05-13 14:02:00 +02:00
scall64-64.S MIPS: scall: Handle seccomp filters which redirect syscalls 2016-05-13 14:02:00 +02:00
scall64-n32.S KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace 2016-07-28 11:56:48 +02:00
scall64-o32.S KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace 2016-07-28 11:56:48 +02:00
segment.c MIPS: Print segment physical address when EU=1 2016-07-28 11:44:30 +02:00
setup.c MIPS: Fix memory regions reaching top of physical 2016-09-13 14:13:26 +02:00
signal-common.h MIPS: Save MSA extended context around signals 2015-09-03 12:07:59 +02:00
signal.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-08-06 09:13:11 -04:00
signal32.c MIPS: Factor o32 specific code into signal_o32.c 2016-08-02 11:02:35 +02:00
signal_n32.c MIPS: Initial implementation of a VDSO 2015-11-11 08:36:36 +01:00
signal_o32.c MIPS: Factor o32 specific code into signal_o32.c 2016-08-02 11:02:35 +02:00
smp-bmips.c MIPS: SMP: Update cpu_foreign_map on CPU disable 2016-07-29 10:19:28 +02:00
smp-cmp.c MIPS: Make smp CMP, CPS and MT use the new generic IPI functions 2016-02-25 10:56:58 +01:00
smp-cps.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-08-06 09:13:11 -04:00
smp-gic.c MIPS: CM: make use of mips_cm_{lock,unlock}_other 2015-11-11 08:35:17 +01:00
smp-mt.c MIPS: Make smp CMP, CPS and MT use the new generic IPI functions 2016-02-25 10:56:58 +01:00
smp-up.c MIPS: SMP: Remove plat_smp_ops cpus_done method. 2014-05-27 11:06:42 +02:00
smp.c MIPS: SMP: Fix possibility of deadlock when bringing CPUs online 2016-09-25 01:43:52 +02:00
spinlock_test.c MIPS: Declare mips_debugfs_dir in a header 2015-10-26 09:49:42 +01:00
spram.c MIPS: Add P6600 cases to CPU switch statements 2016-05-13 14:01:52 +02:00
stacktrace.c MIPS: Add LATENCYTOP support 2015-11-11 08:36:46 +01:00
sync-r4k.c MIPS: sync-r4k: reduce skew while synchronization 2016-01-24 01:31:51 +01:00
syscall.c MIPS: kernel: syscall: Set the appropriate ISA level for MIPS R6 2015-02-17 15:37:29 +00:00
sysrq.c MIPS: Refactor dumping of TLB registers for r3k/r4k 2015-09-03 12:07:45 +02:00
time.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
topology.c MIPS: Add arch generic CPU hotplug 2009-06-24 18:34:40 +01:00
traps.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-08-06 09:13:11 -04:00
unaligned.c tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
uprobes.c MIPS: uprobes: fix incorrect uprobe brk handling 2016-09-13 14:13:26 +02:00
vdso.c MIPS: vDSO: Fix Malta EVA mapping to vDSO page structs 2016-09-21 15:56:10 +02:00
vmlinux.lds.S MIPS: Reserve space for relocation table 2016-05-13 14:02:02 +02:00
vpe-cmp.c MIPS: APRP: Add VPE loader support for CMP platforms. 2014-01-22 20:19:02 +01:00
vpe-mt.c MIPS: MT: Remove SMTC support 2014-05-24 00:07:01 +02:00
vpe.c module: use a structure to encapsulate layout. 2015-12-04 22:46:25 +01:00
watch.c MIPS: Add and use watch register field definitions 2016-05-13 14:02:13 +02:00