linux/drivers/power/reset
Sudeep Holla 97294c24f8 power: vexpress: fix corruption in notifier registration
[ Upstream commit 09bebb1adb ]

Vexpress platforms provide two different restart handlers: SYS_REBOOT
that restart the entire system, while DB_RESET only restarts the
daughter board containing the CPU. DB_RESET is overridden by SYS_REBOOT
if it exists.

notifier_chain_register used in register_restart_handler by design
relies on notifiers to be registered once only, however vexpress restart
notifier can get registered twice. When this happen it corrupts list
of notifiers, as result some notifiers can be not called on proper
event, traverse on list can be cycled forever, and second unregister
can access already freed memory.

So far, since this was the only restart handler in the system, no issue
was observed even if the same notifier was registered twice. However
commit 6c5c0d48b6 ("watchdog: sp805: add restart handler") added
support for SP805 restart handlers and since the system under test
contains two vexpress restart and two SP805 watchdog instances, it was
observed that during the boot traversing the restart handler list looped
forever as there's a cycle in that list resulting in boot hang.

This patch fixes the issues by ensuring that the notifier is installed
only once.

Cc: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Fixes: 46c99ac662 ("power/reset: vexpress: Register with kernel restart handler")
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-10-10 08:52:04 +02:00
..
arm-versatile-reboot.c power/reset: arm-versatile: Register with kernel restart handler 2015-01-25 22:12:45 +01:00
as3722-poweroff.c power: reset: drop owner assignment from platform_drivers 2014-10-20 16:21:28 +02:00
at91-poweroff.c power: reset: at91-poweroff: timely shutdown LPDDR memories 2017-04-08 09:53:32 +02:00
at91-reset.c power: reset: at91-reset/trivial: driver applies to SAMA5 family as well 2015-09-22 15:45:39 +02:00
axxia-reset.c power/reset: axxia: Register with kernel restart handler 2014-11-17 03:07:10 +01:00
brcmstb-reboot.c power/reset: brcmstb: Add support for old 65nm chips 2015-01-22 02:25:32 +01:00
gpio-poweroff.c power: reset: gpio-poweroff: let devm_gpiod_get set direction of gpio 2015-05-23 20:03:30 +02:00
gpio-restart.c power: reset: gpio-restart: increase priority slightly 2015-06-02 20:59:03 +02:00
hisi-reboot.c power: reset: hisi-reboot: Unmap region obtained by of_iomap 2016-09-30 10:18:38 +02:00
imx-snvs-poweroff.c power: reset: imx-snvs-poweroff: add power off driver for i.mx6 2014-11-23 14:57:11 +08:00
Kconfig power/reset: at91-poweroff: allow compiling as a module 2015-09-22 15:18:53 +02:00
keystone-reset.c power: constify of_device_id array 2015-03-20 13:23:06 +01:00
ltc2952-poweroff.c power supply and reset changes for the v4.2 series 2015-06-23 16:10:27 -07:00
Makefile power/reset: zx: Register restart handler 2015-07-24 17:29:17 +02:00
msm-poweroff.c power: reset: use restart_notifier mechanism for msm-poweroff 2014-09-26 19:54:33 +02:00
qnap-poweroff.c power: reset: drop owner assignment from platform_drivers 2014-10-20 16:21:28 +02:00
restart-poweroff.c power/reset: restart-poweroff: Remove arm dependencies 2015-01-25 22:13:18 +01:00
rmobile-reset.c power: reset: Add reset driver for R-Mobile platforms 2015-01-21 16:32:05 +01:00
st-poweroff.c power: constify of_device_id array 2015-03-20 13:23:06 +01:00
syscon-poweroff.c power: reset: Add generic SYSCON register mapped poweroff. 2015-04-06 18:49:48 +02:00
syscon-reboot.c drivers/power: Convert non-modular syscon-reboot to use builtin_platform_driver 2015-06-16 14:12:38 -04:00
vexpress-poweroff.c power: vexpress: fix corruption in notifier registration 2018-10-10 08:52:04 +02:00
xgene-reboot.c power: constify of_device_id array 2015-03-20 13:23:06 +01:00
zx-reboot.c power: reset: zx-reboot: add missing MODULE_DESCRIPTION/AUTHOR/LICENSE 2018-02-03 17:04:25 +01:00