linux/drivers/s390/char
Gerald Schaefer b7cb707c37 s390/smp: fix CPU hotplug deadlock with CPU rescan
smp_rescan_cpus() is called without the device_hotplug_lock, which can lead
to a dedlock when a new CPU is found and immediately set online by a udev
rule.

This was observed on an older kernel version, where the cpu_hotplug_begin()
loop was still present, and it resulted in hanging chcpu and systemd-udev
processes. This specific deadlock will not show on current kernels. However,
there may be other possible deadlocks, and since smp_rescan_cpus() can still
trigger a CPU hotplug operation, the device_hotplug_lock should be held.

For reference, this was the deadlock with the old cpu_hotplug_begin() loop:

        chcpu (rescan)                       systemd-udevd

 echo 1 > /sys/../rescan
 -> smp_rescan_cpus()
 -> (*) get_online_cpus()
    (increases refcount)
 -> smp_add_present_cpu()
    (new CPU found)
 -> register_cpu()
 -> device_add()
 -> udev "add" event triggered -----------> udev rule sets CPU online
                                         -> echo 1 > /sys/.../online
                                         -> lock_device_hotplug_sysfs()
                                            (this is missing in rescan path)
                                         -> device_online()
                                         -> (**) device_lock(new CPU dev)
                                         -> cpu_up()
                                         -> cpu_hotplug_begin()
                                            (loops until refcount == 0)
                                            -> deadlock with (*)
 -> bus_probe_device()
 -> device_attach()
 -> device_lock(new CPU dev)
    -> deadlock with (**)

Fix this by taking the device_hotplug_lock in the CPU rescan path.

Cc: <stable@vger.kernel.org>
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2019-01-11 17:12:02 +01:00
..
con3215.c s390/sclp: Convert timers to use timer_setup() 2017-11-14 11:01:39 +01:00
con3270.c s390/sclp: Convert timers to use timer_setup() 2017-11-14 11:01:39 +01:00
ctrlchar.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ctrlchar.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
defkeymap.c s390/defkeymap: fix global init to zero 2018-03-18 23:02:02 -07:00
defkeymap.map s390: add a few more SPDX identifiers 2017-12-05 07:51:09 +01:00
diag_ftp.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
diag_ftp.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
fs3270.c mm: remove include/linux/bootmem.h 2018-10-31 08:54:16 -07:00
hmcdrv_cache.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_cache.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_dev.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_dev.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_ftp.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_ftp.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
hmcdrv_mod.c s390: char: add SPDX identifiers to the remaining files 2017-11-24 14:28:42 +01:00
Kconfig s390: add a few more SPDX identifiers 2017-12-05 07:51:09 +01:00
keyboard.c TTY/Serial driver patches for 4.19-rc1 2018-08-18 10:50:41 -07:00
keyboard.h s390/char : Rename EBCDIC keymap variables 2018-03-18 23:01:56 -07:00
Makefile s390/kasan: avoid instrumentation of early C code 2018-10-09 11:21:17 +02:00
monreader.c vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
monwriter.c s390/monwriter: do not use stack buffers for hardware data 2018-10-09 11:20:53 +02:00
raw3270.c s390: char: add SPDX identifiers to the remaining files 2017-11-24 14:28:42 +01:00
raw3270.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_async.c s390/sclp_async: replace callhome proc handler with generic one 2018-07-06 08:47:53 +02:00
sclp_cmd.c s390/mem_detect: introduce SCLP storage info 2018-10-09 11:21:09 +02:00
sclp_con.c s390/sclp: Convert timers to use timer_setup() 2017-11-14 11:01:39 +01:00
sclp_config.c s390/smp: fix CPU hotplug deadlock with CPU rescan 2019-01-11 17:12:02 +01:00
sclp_cpi_sys.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_cpi_sys.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_ctl.c compat: Move compat_timespec/ timeval to compat_time.h 2018-04-19 13:29:54 +02:00
sclp_diag.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_early_core.c s390/sclp: introduce sclp_early_get_hsa_size 2018-10-09 11:21:13 +02:00
sclp_early.c s390/sclp: move sclp_early_read_info to sclp_early_core.c 2018-10-09 11:21:07 +02:00
sclp_ftp.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_ftp.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_ocf.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_pci.c s390/sclp: Allow to request adapter reset 2018-09-20 13:20:27 +02:00
sclp_quiesce.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_rw.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_rw.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_sd.c treewide: Use array_size() in vzalloc() 2018-06-12 16:19:22 -07:00
sclp_sdias.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_sdias.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_tty.c s390/sclp_tty: enable line mode tty even if there is an ascii console 2018-03-18 23:02:00 -07:00
sclp_tty.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sclp_vt220.c s390/sclp: Convert timers to use timer_setup() 2017-11-14 11:01:39 +01:00
sclp.c s390/sclp: 32 bit event mask compatibility mode 2018-02-22 15:31:24 +01:00
sclp.h s390/mem_detect: introduce SCLP storage info 2018-10-09 11:21:09 +02:00
tape_34xx.c s390: char: add SPDX identifiers to the remaining files 2017-11-24 14:28:42 +01:00
tape_3590.c s390/tape: fix spelling mistake "partion" -> "partition" 2018-09-20 13:20:28 +02:00
tape_3590.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tape_char.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tape_class.c s390/tape: replace PTR_RET with PTR_ERR_OR_ZERO 2018-07-19 16:37:37 +02:00
tape_class.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tape_core.c s390: char: add SPDX identifiers to the remaining files 2017-11-24 14:28:42 +01:00
tape_proc.c s390/drivers: fix proc/debugfs file permissions 2018-12-13 10:42:24 +01:00
tape_std.c Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2017-11-13 17:56:58 -08:00
tape_std.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tape.h Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2017-11-13 17:56:58 -08:00
tty3270.c mm: remove include/linux/bootmem.h 2018-10-31 08:54:16 -07:00
tty3270.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
vmcp.c mm/cma: remove unsupported gfp_mask parameter from cma_alloc() 2018-08-17 16:20:32 -07:00
vmlogrdr.c s390: vmlogrdr: Use ARRAY_SIZE instead of reimplementing its function 2018-09-20 13:20:28 +02:00
vmur.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
vmur.h Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2017-11-13 11:47:01 -08:00
zcore.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00