watchdog/hardlockup: make HAVE_NMI_WATCHDOG sparc64-specific
There are several hardlockup detector implementations and several Kconfig values which allow selection and build of the preferred one. CONFIG_HARDLOCKUP_DETECTOR was introduced by the commit23637d477c
("lockup_detector: Introduce CONFIG_HARDLOCKUP_DETECTOR") in v2.6.36. It was a preparation step for introducing the new generic perf hardlockup detector. The existing arch-specific variants did not support the to-be-created generic build configurations, sysctl interface, etc. This distinction was made explicit by the commit4a7863cc2e
("x86, nmi_watchdog: Remove ARCH_HAS_NMI_WATCHDOG and rely on CONFIG_HARDLOCKUP_DETECTOR") in v2.6.38. CONFIG_HAVE_NMI_WATCHDOG was introduced by the commitd314d74c69
("nmi watchdog: do not use cpp symbol in Kconfig") in v3.4-rc1. It replaced the above mentioned ARCH_HAS_NMI_WATCHDOG. At that time, it was still used by three architectures, namely blackfin, mn10300, and sparc. The support for blackfin and mn10300 architectures has been completely dropped some time ago. And sparc is the only architecture with the historic NMI watchdog at the moment. And the old sparc implementation is really special. It is always built on sparc64. It used to be always enabled until the commit7a5c8b57ce
("sparc: implement watchdog_nmi_enable and watchdog_nmi_disable") added in v4.10-rc1. There are only few locations where the sparc64 NMI watchdog interacts with the generic hardlockup detectors code: + implements arch_touch_nmi_watchdog() which is called from the generic touch_nmi_watchdog() + implements watchdog_hardlockup_enable()/disable() to support /proc/sys/kernel/nmi_watchdog + is always preferred over other generic watchdogs, see CONFIG_HARDLOCKUP_DETECTOR + includes asm/nmi.h into linux/nmi.h because some sparc-specific functions are needed in sparc-specific code which includes only linux/nmi.h. The situation became more complicated after the commit05a4a95279
("kernel/watchdog: split up config options") and commit2104180a53
("powerpc/64s: implement arch-specific hardlockup watchdog") in v4.13-rc1. They introduced HAVE_HARDLOCKUP_DETECTOR_ARCH. It was used for powerpc specific hardlockup detector. It was compatible with the perf one regarding the general boot, sysctl, and programming interfaces. HAVE_HARDLOCKUP_DETECTOR_ARCH was defined as a superset of HAVE_NMI_WATCHDOG. It made some sense because all arch-specific detectors had some common requirements, namely: + implemented arch_touch_nmi_watchdog() + included asm/nmi.h into linux/nmi.h + defined the default value for /proc/sys/kernel/nmi_watchdog But it actually has made things pretty complicated when the generic buddy hardlockup detector was added. Before the generic perf detector was newer supported together with an arch-specific one. But the buddy detector could work on any SMP system. It means that an architecture could support both the arch-specific and buddy detector. As a result, there are few tricky dependencies. For example, CONFIG_HARDLOCKUP_DETECTOR depends on: ((HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_BUDDY) && !HAVE_NMI_WATCHDOG) || HAVE_HARDLOCKUP_DETECTOR_ARCH The problem is that the very special sparc implementation is defined as: HAVE_NMI_WATCHDOG && !HAVE_HARDLOCKUP_DETECTOR_ARCH Another problem is that the meaning of HAVE_NMI_WATCHDOG is far from clear without reading understanding the history. Make the logic less tricky and more self-explanatory by making HAVE_NMI_WATCHDOG specific for the sparc64 implementation. And rename it to HAVE_HARDLOCKUP_DETECTOR_SPARC64. Note that HARDLOCKUP_DETECTOR_PREFER_BUDDY, HARDLOCKUP_DETECTOR_PERF, and HARDLOCKUP_DETECTOR_BUDDY may conflict only with HAVE_HARDLOCKUP_DETECTOR_ARCH. They depend on HARDLOCKUP_DETECTOR and it is not longer enabled when HAVE_NMI_WATCHDOG is set. Link: https://lkml.kernel.org/r/20230616150618.6073-5-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:
parent
0c68bda696
commit
a5fcc2367e
18
arch/Kconfig
18
arch/Kconfig
@ -400,23 +400,8 @@ config HAVE_HARDLOCKUP_DETECTOR_PERF
|
||||
The arch chooses to use the generic perf-NMI-based hardlockup
|
||||
detector. Must define HAVE_PERF_EVENTS_NMI.
|
||||
|
||||
config HAVE_NMI_WATCHDOG
|
||||
depends on HAVE_NMI
|
||||
bool
|
||||
help
|
||||
The arch provides its own hardlockup detector implementation instead
|
||||
of the generic ones.
|
||||
|
||||
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
|
||||
bool
|
||||
select HAVE_NMI_WATCHDOG
|
||||
help
|
||||
The arch provides its own hardlockup detector implementation instead
|
||||
of the generic ones.
|
||||
@ -424,9 +409,6 @@ config HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
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
|
||||
bool
|
||||
help
|
||||
|
@ -33,7 +33,7 @@ config SPARC
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select GENERIC_PCI_IOMAP
|
||||
select HAS_IOPORT
|
||||
select HAVE_NMI_WATCHDOG if SPARC64
|
||||
select HAVE_HARDLOCKUP_DETECTOR_SPARC64 if SPARC64
|
||||
select HAVE_CBPF_JIT if SPARC32
|
||||
select HAVE_EBPF_JIT if SPARC64
|
||||
select HAVE_DEBUG_BUGVERBOSE
|
||||
|
@ -14,3 +14,12 @@ config FRAME_POINTER
|
||||
bool
|
||||
depends on MCOUNT
|
||||
default y
|
||||
|
||||
config HAVE_HARDLOCKUP_DETECTOR_SPARC64
|
||||
depends on HAVE_NMI
|
||||
bool
|
||||
help
|
||||
Sparc64 hardlockup detector is the last one 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.
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <asm/irq.h>
|
||||
|
||||
/* Arch specific watchdogs might need to share extra watchdog-related APIs. */
|
||||
#if defined(CONFIG_HAVE_NMI_WATCHDOG)
|
||||
#if defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH) || defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_SPARC64)
|
||||
#include <asm/nmi.h>
|
||||
#endif
|
||||
|
||||
@ -90,8 +90,7 @@ static inline void hardlockup_detector_disable(void) {}
|
||||
#endif
|
||||
|
||||
/* Sparc64 has special implemetantion that is always enabled. */
|
||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR) || \
|
||||
(defined(CONFIG_HAVE_NMI_WATCHDOG) && !defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH))
|
||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR) || defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_SPARC64)
|
||||
void arch_touch_nmi_watchdog(void);
|
||||
#else
|
||||
static inline void arch_touch_nmi_watchdog(void) { }
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
static DEFINE_MUTEX(watchdog_mutex);
|
||||
|
||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR) || defined(CONFIG_HAVE_NMI_WATCHDOG)
|
||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR) || defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_SPARC64)
|
||||
# define WATCHDOG_HARDLOCKUP_DEFAULT 1
|
||||
#else
|
||||
# define WATCHDOG_HARDLOCKUP_DEFAULT 0
|
||||
|
@ -1050,15 +1050,10 @@ config HAVE_HARDLOCKUP_DETECTOR_BUDDY
|
||||
# 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
|
||||
bool "Detect Hard Lockups"
|
||||
depends on DEBUG_KERNEL && !S390
|
||||
depends on ((HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_BUDDY) && !HAVE_NMI_WATCHDOG) || HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
depends on DEBUG_KERNEL && !S390 && !HAVE_HARDLOCKUP_DETECTOR_SPARC64
|
||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF || HAVE_HARDLOCKUP_DETECTOR_BUDDY || HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
imply HARDLOCKUP_DETECTOR_PERF
|
||||
imply HARDLOCKUP_DETECTOR_BUDDY
|
||||
select LOCKUP_DETECTOR
|
||||
@ -1079,7 +1074,7 @@ config HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
||||
bool "Prefer the buddy CPU hardlockup detector"
|
||||
depends on HARDLOCKUP_DETECTOR
|
||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF && HAVE_HARDLOCKUP_DETECTOR_BUDDY
|
||||
depends on !HAVE_NMI_WATCHDOG
|
||||
depends on !HAVE_HARLOCKUP_DETECTOR_ARCH
|
||||
help
|
||||
Say Y here to prefer the buddy hardlockup detector over the perf one.
|
||||
|
||||
@ -1095,7 +1090,7 @@ config HARDLOCKUP_DETECTOR_PERF
|
||||
bool
|
||||
depends on HARDLOCKUP_DETECTOR
|
||||
depends on HAVE_HARDLOCKUP_DETECTOR_PERF && !HARDLOCKUP_DETECTOR_PREFER_BUDDY
|
||||
depends on !HAVE_NMI_WATCHDOG
|
||||
depends on !HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
||||
|
||||
config HARDLOCKUP_DETECTOR_BUDDY
|
||||
@ -1103,7 +1098,7 @@ config HARDLOCKUP_DETECTOR_BUDDY
|
||||
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
|
||||
depends on !HAVE_HARDLOCKUP_DETECTOR_ARCH
|
||||
select HARDLOCKUP_DETECTOR_COUNTS_HRTIMER
|
||||
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user