https://github.com/torvalds/linux
Revision 8f46cca1e6c06a058374816887059bcc017b382f authored by Matt Redfearn on 22 September 2016, 16:15:47 UTC, committed by Ralf Baechle on 24 September 2016, 23:43:52 UTC
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>
1 parent 7e95630
History
Tip revision: 8f46cca1e6c06a058374816887059bcc017b382f authored by Matt Redfearn on 22 September 2016, 16:15:47 UTC
MIPS: SMP: Fix possibility of deadlock when bringing CPUs online
Tip revision: 8f46cca
File Mode Size
9p
adfs
affs
afs
autofs4
befs
bfs
btrfs
cachefiles
ceph
cifs
coda
configfs
cramfs
crypto
debugfs
devpts
dlm
ecryptfs
efivarfs
efs
exofs
exportfs
ext2
ext4
f2fs
fat
freevxfs
fscache
fuse
gfs2
hfs
hfsplus
hostfs
hpfs
hugetlbfs
isofs
jbd2
jffs2
jfs
kernfs
lockd
logfs
minix
ncpfs
nfs
nfs_common
nfsd
nilfs2
nls
notify
ntfs
ocfs2
omfs
openpromfs
orangefs
overlayfs
proc
pstore
qnx4
qnx6
quota
ramfs
reiserfs
romfs
squashfs
sysfs
sysv
tracefs
ubifs
udf
ufs
xfs
Kconfig -rw-r--r-- 7.1 KB
Kconfig.binfmt -rw-r--r-- 7.1 KB
Makefile -rw-r--r-- 4.3 KB
aio.c -rw-r--r-- 43.0 KB
anon_inodes.c -rw-r--r-- 4.9 KB
attr.c -rw-r--r-- 8.5 KB
bad_inode.c -rw-r--r-- 4.7 KB
binfmt_aout.c -rw-r--r-- 10.7 KB
binfmt_elf.c -rw-r--r-- 60.8 KB
binfmt_elf_fdpic.c -rw-r--r-- 46.9 KB
binfmt_em86.c -rw-r--r-- 2.8 KB
binfmt_flat.c -rw-r--r-- 27.8 KB
binfmt_misc.c -rw-r--r-- 18.3 KB
binfmt_script.c -rw-r--r-- 3.0 KB
block_dev.c -rw-r--r-- 47.9 KB
buffer.c -rw-r--r-- 90.4 KB
char_dev.c -rw-r--r-- 13.4 KB
compat.c -rw-r--r-- 37.3 KB
compat_binfmt_elf.c -rw-r--r-- 3.7 KB
compat_ioctl.c -rw-r--r-- 45.7 KB
coredump.c -rw-r--r-- 20.6 KB
dax.c -rw-r--r-- 34.6 KB
dcache.c -rw-r--r-- 93.5 KB
dcookies.c -rw-r--r-- 6.9 KB
direct-io.c -rw-r--r-- 38.5 KB
drop_caches.c -rw-r--r-- 1.6 KB
eventfd.c -rw-r--r-- 12.9 KB
eventpoll.c -rw-r--r-- 60.1 KB
exec.c -rw-r--r-- 43.6 KB
fcntl.c -rw-r--r-- 16.7 KB
fhandle.c -rw-r--r-- 6.5 KB
file.c -rw-r--r-- 23.5 KB
file_table.c -rw-r--r-- 8.5 KB
filesystems.c -rw-r--r-- 6.4 KB
fs-writeback.c -rw-r--r-- 70.4 KB
fs_pin.c -rw-r--r-- 2.0 KB
fs_struct.c -rw-r--r-- 3.3 KB
inode.c -rw-r--r-- 53.3 KB
internal.h -rw-r--r-- 4.1 KB
ioctl.c -rw-r--r-- 17.1 KB
iomap.c -rw-r--r-- 12.4 KB
libfs.c -rw-r--r-- 30.7 KB
locks.c -rw-r--r-- 71.5 KB
mbcache.c -rw-r--r-- 11.9 KB
mount.h -rw-r--r-- 3.5 KB
mpage.c -rw-r--r-- 20.6 KB
namei.c -rw-r--r-- 119.6 KB
namespace.c -rw-r--r-- 81.6 KB
no-block.c -rw-r--r-- 688 bytes
nsfs.c -rw-r--r-- 3.7 KB
open.c -rw-r--r-- 27.0 KB
pipe.c -rw-r--r-- 26.6 KB
pnode.c -rw-r--r-- 11.3 KB
pnode.h -rw-r--r-- 1.8 KB
posix_acl.c -rw-r--r-- 20.5 KB
proc_namespace.c -rw-r--r-- 7.8 KB
read_write.c -rw-r--r-- 39.3 KB
readdir.c -rw-r--r-- 7.3 KB
select.c -rw-r--r-- 25.5 KB
seq_file.c -rw-r--r-- 22.5 KB
signalfd.c -rw-r--r-- 9.2 KB
splice.c -rw-r--r-- 46.2 KB
stack.c -rw-r--r-- 2.5 KB
stat.c -rw-r--r-- 11.9 KB
statfs.c -rw-r--r-- 5.3 KB
super.c -rw-r--r-- 36.6 KB
sync.c -rw-r--r-- 9.9 KB
timerfd.c -rw-r--r-- 13.2 KB
userfaultfd.c -rw-r--r-- 35.3 KB
utimes.c -rw-r--r-- 5.9 KB
xattr.c -rw-r--r-- 23.5 KB

back to top