mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
watchdog/hardlockup: make the config checks more straightforward
There are four possible variants of hardlockup detectors: + buddy: available when SMP is set. + perf: available when HAVE_HARDLOCKUP_DETECTOR_PERF is set. + arch-specific: available when HAVE_HARDLOCKUP_DETECTOR_ARCH is set. + sparc64 special variant: available when HAVE_NMI_WATCHDOG is set and HAVE_HARDLOCKUP_DETECTOR_ARCH is not set. The check for the sparc64 variant is more complicated because HAVE_NMI_WATCHDOG is used to #ifdef code used by both arch-specific and sparc64 specific variant. Therefore it is automatically selected with HAVE_HARDLOCKUP_DETECTOR_ARCH. This complexity is partly hidden in HAVE_HARDLOCKUP_DETECTOR_NON_ARCH. It reduces the size of some checks but it makes them harder to follow. Finally, the other temporary variable HARDLOCKUP_DETECTOR_NON_ARCH is used to re-compute HARDLOCKUP_DETECTOR_PERF/BUDDY when the global HARDLOCKUP_DETECTOR switch is enabled/disabled. Make the logic more straightforward by the following changes: + Better explain the role of HAVE_HARDLOCKUP_DETECTOR_ARCH and HAVE_NMI_WATCHDOG in comments. + Add HAVE_HARDLOCKUP_DETECTOR_BUDDY so that there is separate HAVE_* for all four hardlockup detector variants. Use it in the other conditions instead of SMP. It makes it clear that it is about the buddy detector. + Open code HAVE_HARDLOCKUP_DETECTOR_NON_ARCH in HARDLOCKUP_DETECTOR and HARDLOCKUP_DETECTOR_PREFER_BUDDY. It helps to understand the conditions between the four hardlockup detector variants. + Define the exact conditions when HARDLOCKUP_DETECTOR_PERF/BUDDY can be enabled. It explains the dependency on the other hardlockup detector variants. Also it allows to remove HARDLOCKUP_DETECTOR_NON_ARCH by using "imply". It triggers re-evaluating HARDLOCKUP_DETECTOR_PERF/BUDDY when the global HARDLOCKUP_DETECTOR switch is changed. + Add dependency on HARDLOCKUP_DETECTOR so that the affected variables disappear when the hardlockup detectors are disabled. Another nice side effect is that HARDLOCKUP_DETECTOR_PREFER_BUDDY value is not preserved when the global switch is disabled. The user has to make the decision again when it gets re-enabled. Link: https://lkml.kernel.org/r/20230616150618.6073-3-pmladek@suse.com Signed-off-by: Petr Mladek <pmladek@suse.com> Reviewed-by: Douglas Anderson <dianders@chromium.org> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: "David S. Miller" <davem@davemloft.net> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
4917a25f83
commit
1356d0b966
23
arch/Kconfig
23
arch/Kconfig
@@ -404,17 +404,28 @@ config HAVE_NMI_WATCHDOG
|
|||||||
depends on HAVE_NMI
|
depends on HAVE_NMI
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
The arch provides a low level NMI watchdog. It provides
|
The arch provides its own hardlockup detector implementation instead
|
||||||
asm/nmi.h, and defines its own watchdog_hardlockup_probe() and
|
of the generic ones.
|
||||||
arch_touch_nmi_watchdog().
|
|
||||||
|
Sparc64 defines this variable without HAVE_HARDLOCKUP_DETECTOR_ARCH.
|
||||||
|
It is the last arch-specific implementation which was developed before
|
||||||
|
adding the common infrastructure for handling hardlockup detectors.
|
||||||
|
It is always built. It does _not_ use the common command line
|
||||||
|
parameters and sysctl interface, except for
|
||||||
|
/proc/sys/kernel/nmi_watchdog.
|
||||||
|
|
||||||
config HAVE_HARDLOCKUP_DETECTOR_ARCH
|
config HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||||
bool
|
bool
|
||||||
select HAVE_NMI_WATCHDOG
|
select HAVE_NMI_WATCHDOG
|
||||||
help
|
help
|
||||||
The arch chooses to provide its own hardlockup detector, which is
|
The arch provides its own hardlockup detector implementation instead
|
||||||
a superset of the HAVE_NMI_WATCHDOG. It also conforms to config
|
of the generic ones.
|
||||||
interfaces and parameters provided by hardlockup detector subsystem.
|
|
||||||
|
It uses the same command line parameters, and sysctl interface,
|
||||||
|
as the generic hardlockup detectors.
|
||||||
|
|
||||||
|
HAVE_NMI_WATCHDOG is selected to build the code shared with
|
||||||
|
the sparc64 specific implementation.
|
||||||
|
|
||||||
config HAVE_PERF_REGS
|
config HAVE_PERF_REGS
|
||||||
bool
|
bool
|
||||||
|
@@ -1035,16 +1035,33 @@ config BOOTPARAM_SOFTLOCKUP_PANIC
|
|||||||
|
|
||||||
Say N if unsure.
|
Say N if unsure.
|
||||||
|
|
||||||
|
config HAVE_HARDLOCKUP_DETECTOR_BUDDY
|
||||||
|
bool
|
||||||
|
depends on SMP
|
||||||
|
default y
|
||||||
|
|
||||||
#
|
#
|
||||||
# arch/ can define HAVE_HARDLOCKUP_DETECTOR_ARCH to provide their own hard
|
# Global switch whether to build a hardlockup detector at all. It is available
|
||||||
# lockup detector rather than the perf based detector.
|
# only when the architecture supports at least one implementation. There are
|
||||||
|
# two exceptions. The hardlockup detector is never enabled on:
|
||||||
|
#
|
||||||
|
# s390: it reported many false positives there
|
||||||
|
#
|
||||||
|
# sparc64: has a custom implementation which is not using the common
|
||||||
|
# hardlockup command line options and sysctl interface.
|
||||||
|
#
|
||||||
|
# Note that HAVE_NMI_WATCHDOG is used to distinguish the sparc64 specific
|
||||||
|
# implementaion. It is automatically enabled also for other arch-specific
|
||||||
|
# variants which set HAVE_HARDLOCKUP_DETECTOR_ARCH. It makes the check
|
||||||
|
# of avaialable and supported variants quite tricky.
|
||||||
#
|
#
|
||||||
config HARDLOCKUP_DETECTOR
|
config HARDLOCKUP_DETECTOR
|
||||||
bool "Detect Hard Lockups"
|
bool "Detect Hard Lockups"
|
||||||
depends on DEBUG_KERNEL && !S390
|
depends on DEBUG_KERNEL && !S390
|
||||||
depends on HAVE_HARDLOCKUP_DETECTOR_NON_ARCH || HAVE_HARDLOCKUP_DETECTOR_ARCH
|
depends on ((HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_BUDDY) && !HAVE_NMI_WATCHDOG) || HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||||
|
imply HARDLOCKUP_DETECTOR_PERF
|
||||||
|
imply HARDLOCKUP_DETECTOR_BUDDY
|
||||||
select LOCKUP_DETECTOR
|
select LOCKUP_DETECTOR
|
||||||
select HARDLOCKUP_DETECTOR_NON_ARCH if HAVE_HARDLOCKUP_DETECTOR_NON_ARCH
|
|
||||||
|
|
||||||
help
|
help
|
||||||
Say Y here to enable the kernel to act as a watchdog to detect
|
Say Y here to enable the kernel to act as a watchdog to detect
|
||||||
@@ -1055,9 +1072,14 @@ config HARDLOCKUP_DETECTOR
|
|||||||
chance to run. The current stack trace is displayed upon detection
|
chance to run. The current stack trace is displayed upon detection
|
||||||
and the system will stay locked up.
|
and the system will stay locked up.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Note that arch-specific variants are always preferred.
|
||||||
|
#
|
||||||
config HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
config HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
||||||
bool "Prefer the buddy CPU hardlockup detector"
|
bool "Prefer the buddy CPU hardlockup detector"
|
||||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF && SMP
|
depends on HARDLOCKUP_DETECTOR
|
||||||
|
depends on HAVE_HARDLOCKUP_DETECTOR_PERF && HAVE_HARDLOCKUP_DETECTOR_BUDDY
|
||||||
|
depends on !HAVE_NMI_WATCHDOG
|
||||||
help
|
help
|
||||||
Say Y here to prefer the buddy hardlockup detector over the perf one.
|
Say Y here to prefer the buddy hardlockup detector over the perf one.
|
||||||
|
|
||||||
@@ -1071,39 +1093,27 @@ config HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
|||||||
|
|
||||||
config HARDLOCKUP_DETECTOR_PERF
|
config HARDLOCKUP_DETECTOR_PERF
|
||||||
bool
|
bool
|
||||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF
|
depends on HARDLOCKUP_DETECTOR
|
||||||
|
depends on HAVE_HARDLOCKUP_DETECTOR_PERF && !HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
||||||
|
depends on !HAVE_NMI_WATCHDOG
|
||||||
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
||||||
|
|
||||||
config HARDLOCKUP_DETECTOR_BUDDY
|
config HARDLOCKUP_DETECTOR_BUDDY
|
||||||
bool
|
bool
|
||||||
depends on SMP
|
depends on HARDLOCKUP_DETECTOR
|
||||||
|
depends on HAVE_HARDLOCKUP_DETECTOR_BUDDY
|
||||||
|
depends on !HAVE_HARDLOCKUP_DETECTOR_PERF || HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
||||||
|
depends on !HAVE_NMI_WATCHDOG
|
||||||
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
||||||
|
|
||||||
|
#
|
||||||
# Both the "perf" and "buddy" hardlockup detectors count hrtimer
|
# Both the "perf" and "buddy" hardlockup detectors count hrtimer
|
||||||
# interrupts. This config enables functions managing this common code.
|
# interrupts. This config enables functions managing this common code.
|
||||||
|
#
|
||||||
config HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
config HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
||||||
bool
|
bool
|
||||||
select SOFTLOCKUP_DETECTOR
|
select SOFTLOCKUP_DETECTOR
|
||||||
|
|
||||||
# For hardlockup detectors you can have one directly provided by the arch
|
|
||||||
# or use a "non-arch" one. If you're using a "non-arch" one that is
|
|
||||||
# further divided the perf hardlockup detector (which, confusingly, needs
|
|
||||||
# arch-provided perf support) and the buddy hardlockup detector (which just
|
|
||||||
# needs SMP). In either case, using the "non-arch" code conflicts with
|
|
||||||
# the NMI watchdog code (which is sometimes used directly and sometimes used
|
|
||||||
# by the arch-provided hardlockup detector).
|
|
||||||
config HAVE_HARDLOCKUP_DETECTOR_NON_ARCH
|
|
||||||
bool
|
|
||||||
depends on (HAVE_HARDLOCKUP_DETECTOR_PERF || SMP) && !HAVE_NMI_WATCHDOG
|
|
||||||
default y
|
|
||||||
|
|
||||||
# This will select the appropriate non-arch hardlockdup detector
|
|
||||||
config HARDLOCKUP_DETECTOR_NON_ARCH
|
|
||||||
bool
|
|
||||||
depends on HAVE_HARDLOCKUP_DETECTOR_NON_ARCH
|
|
||||||
select HARDLOCKUP_DETECTOR_BUDDY if !HAVE_HARDLOCKUP_DETECTOR_PERF || HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
|
||||||
select HARDLOCKUP_DETECTOR_PERF if HAVE_HARDLOCKUP_DETECTOR_PERF && !HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Enables a timestamp based low pass filter to compensate for perf based
|
# Enables a timestamp based low pass filter to compensate for perf based
|
||||||
# hard lockup detection which runs too fast due to turbo modes.
|
# hard lockup detection which runs too fast due to turbo modes.
|
||||||
|
Reference in New Issue
Block a user