qemu-e2k/hw/watchdog
Sascha Silbe fe345a3d5d watchdog/diag288: avoid race condition on expired watchdog
When configured to inject an NMI, watchdog_perform_action() may cause
the BQL to be temporarily relinquished (inject_nmi() → ... →
s390_nmi() → s390_cpu_restart() → run_on_cpu()). When the guest issues
diag 288 again in response to the NMI, the diag 288 operation will
race against wdt_diag288_reset(). Depending on scheduler behaviour,
wdt_diag288_reset() may be run after the guest issued a diag 288
Init. As a result, we will cancel the timer the guest just set up. The
effect observed by the guest is that a second expiry does not trigger
the watchdog action and diag 288 Change operations fail.

Fix this by resetting the timer _before_ invoking the action.

Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Acked-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
2016-03-01 12:15:28 +01:00
..
Makefile.objs s390x/watchdog: introduce diag288 watchdog device 2015-06-11 17:45:49 +02:00
watchdog.c hw: Clean up includes 2016-01-29 15:07:25 +00:00
wdt_diag288.c watchdog/diag288: avoid race condition on expired watchdog 2016-03-01 12:15:28 +01:00
wdt_i6300esb.c hw: Clean up includes 2016-01-29 15:07:25 +00:00
wdt_ib700.c hw: Clean up includes 2016-01-29 15:07:25 +00:00