FAILED: patch "[PATCH] kernel/watchdog: Prevent false positives with turbo modes" failed to apply to 4.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
7edaeb6841dfb27e362288ab8466ebdc4972e867Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <[email protected]>
Date: Tue, 15 Aug 2017 09:50:13 +0200
Subject: [PATCH] kernel/watchdog: Prevent false positives with turbo modes
The hardlockup detector on x86 uses a performance counter based on unhalted CPU cycles and a periodic hrtimer. The hrtimer period is about 2/5 of the performance counter period, so the hrtimer should fire 2-3 times before the performance counter NMI fires. The NMI code checks whether the hrtimer fired since the last invocation. If not, it assumess a hard lockup.
The calculation of those periods is based on the nominal CPU frequency. Turbo modes increase the CPU clock frequency and therefore shorten the period of the perf/NMI watchdog. With extreme Turbo-modes (3x nominal frequency) the perf/NMI period is shorter than the hrtimer period which leads to false positives.
A simple fix would be to shorten the hrtimer period, but that comes with the side effect of more frequent hrtimer and softlockup thread wakeups, which is not desired.
Implement a low pass filter, which checks the perf/NMI period against kernel time. If the perf/NMI fires before 4/5 of the watchdog period has elapsed then the event is ignored and postponed to the next perf/NMI.
That solves the problem and avoids the overhead of shorter hrtimer periods and more frequent softlockup thread wakeups.
arch/x86/Kconfig +1 -0
@@ -100,6 +100,7 @@ config X86 select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNLEN_USER select GENERIC_TIME_VSYSCALL + select HARDLOCKUP_CHECK_TIMESTAMP if X86_64 select HAVE_ACPI_APEI if ACPI select HAVE_ACPI_APEI_NMI if ACPI select HAVE_ALIGNED_STRUCT_PAGE if SLUB
include/linux/nmi.h +8 -0
@@ -168,6 +168,14 @@ extern int sysctl_hardlockup_all_cpu_backtrace;#define sysctl_softlockup_all_cpu_backtrace 0#define sysctl_hardlockup_all_cpu_backtrace 0#endif + +#if defined(CONFIG_HARDLOCKUP_CHECK_TIMESTAMP ) && \ + defined(CONFIG_HARDLOCKUP_DETECTOR ) +void watchdog_update_hrtimer_threshold (u64 period); +#else +static inline void watchdog_update_hrtimer_threshold (u64 period) { } +#endif +extern bool is_hardlockup (void );struct ctl_table ; extern int proc_watchdog(struct ctl_table *, int ,
kernel/watchdog.c +1 -0
@@ -240,6 +240,7 @@ static void set_sample_period(void)* hardlockup detector generates a warning */ sample_period =get_softlockup_thresh () * ((u64 )NSEC_PER_SEC /5 ); +watchdog_update_hrtimer_threshold (sample_period); }/* Commands for resetting the watchdog */
kernel/watchdog_hld.c +59 -0
71 lines not on this page · raw message
lib/Kconfig.debug +7 -0
@@ -797,6 +797,13 @@ config HARDLOCKUP_DETECTOR_PERF bool select SOFTLOCKUP_DETECTOR +# +# Enables a timestamp based low pass filter to compensate for perf based +# hard lockup detection which runs too fast due to turbo modes. +# +config HARDLOCKUP_CHECK_TIMESTAMP + bool + # # arch/ can define HAVE_HARDLOCKUP_DETECTOR_ARCH to provide their own hard # lockup detector rather than the perf based detector.