lockup_detector: Introduce CONFIG_HARDLOCKUP_DETECTOR
This new config is deemed to simplify even more the lockup detector dependencies and can make it easier to bring a smooth sorting between archs that support the new generic lockup detector and those that still have their own, especially for those that are in the middle of this migration. Instead of checking whether we have CONFIG_LOCKUP_DETECTOR + CONFIG_PERF_EVENTS_NMI each time an arch wants to know if it needs to build its own lockup detector, take a shortcut with this new config. It is enabled only if the hardlockup detection part of the whole lockup detector is on. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Don Zickus <dzickus@redhat.com> Cc: Cyrill Gorcunov <gorcunov@gmail.com>
This commit is contained in:
parent
c01d432330
commit
23637d477c
|
@ -147,5 +147,9 @@ config HAVE_USER_RETURN_NOTIFIER
|
||||||
|
|
||||||
config HAVE_PERF_EVENTS_NMI
|
config HAVE_PERF_EVENTS_NMI
|
||||||
bool
|
bool
|
||||||
|
help
|
||||||
|
System hardware can generate an NMI using the perf event
|
||||||
|
subsystem. Also has support for calculating CPU cycle events
|
||||||
|
to determine how many clock cycles in a given period.
|
||||||
|
|
||||||
source "kernel/gcov/Kconfig"
|
source "kernel/gcov/Kconfig"
|
||||||
|
|
|
@ -942,13 +942,6 @@ config PERF_USE_VMALLOC
|
||||||
help
|
help
|
||||||
See tools/perf/design.txt for details
|
See tools/perf/design.txt for details
|
||||||
|
|
||||||
config PERF_EVENTS_NMI
|
|
||||||
def_bool PERF_EVENTS && HAVE_PERF_EVENTS_NMI
|
|
||||||
help
|
|
||||||
System hardware can generate an NMI using the perf event
|
|
||||||
subsystem. Also has support for calculating CPU cycle events
|
|
||||||
to determine how many clock cycles in a given period.
|
|
||||||
|
|
||||||
menu "Kernel Performance Events And Counters"
|
menu "Kernel Performance Events And Counters"
|
||||||
|
|
||||||
config PERF_EVENTS
|
config PERF_EVENTS
|
||||||
|
|
|
@ -37,7 +37,7 @@ static DEFINE_PER_CPU(struct hrtimer, watchdog_hrtimer);
|
||||||
static DEFINE_PER_CPU(bool, softlockup_touch_sync);
|
static DEFINE_PER_CPU(bool, softlockup_touch_sync);
|
||||||
static DEFINE_PER_CPU(bool, hard_watchdog_warn);
|
static DEFINE_PER_CPU(bool, hard_watchdog_warn);
|
||||||
static DEFINE_PER_CPU(bool, soft_watchdog_warn);
|
static DEFINE_PER_CPU(bool, soft_watchdog_warn);
|
||||||
#ifdef CONFIG_PERF_EVENTS_NMI
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts);
|
static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts);
|
||||||
static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);
|
static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);
|
||||||
static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);
|
static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);
|
||||||
|
@ -51,7 +51,7 @@ static int __initdata no_watchdog;
|
||||||
/*
|
/*
|
||||||
* Should we panic when a soft-lockup or hard-lockup occurs:
|
* Should we panic when a soft-lockup or hard-lockup occurs:
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_PERF_EVENTS_NMI
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
static int hardlockup_panic;
|
static int hardlockup_panic;
|
||||||
|
|
||||||
static int __init hardlockup_panic_setup(char *str)
|
static int __init hardlockup_panic_setup(char *str)
|
||||||
|
@ -152,7 +152,7 @@ void touch_softlockup_watchdog_sync(void)
|
||||||
__raw_get_cpu_var(watchdog_touch_ts) = 0;
|
__raw_get_cpu_var(watchdog_touch_ts) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PERF_EVENTS_NMI
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
/* watchdog detector functions */
|
/* watchdog detector functions */
|
||||||
static int is_hardlockup(int cpu)
|
static int is_hardlockup(int cpu)
|
||||||
{
|
{
|
||||||
|
@ -189,7 +189,7 @@ static struct notifier_block panic_block = {
|
||||||
.notifier_call = watchdog_panic,
|
.notifier_call = watchdog_panic,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_PERF_EVENTS_NMI
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
static struct perf_event_attr wd_hw_attr = {
|
static struct perf_event_attr wd_hw_attr = {
|
||||||
.type = PERF_TYPE_HARDWARE,
|
.type = PERF_TYPE_HARDWARE,
|
||||||
.config = PERF_COUNT_HW_CPU_CYCLES,
|
.config = PERF_COUNT_HW_CPU_CYCLES,
|
||||||
|
@ -239,7 +239,7 @@ static void watchdog_interrupt_count(void)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void watchdog_interrupt_count(void) { return; }
|
static inline void watchdog_interrupt_count(void) { return; }
|
||||||
#endif /* CONFIG_PERF_EVENTS_NMI */
|
#endif /* CONFIG_HARDLOCKUP_DETECTOR */
|
||||||
|
|
||||||
/* watchdog kicker functions */
|
/* watchdog kicker functions */
|
||||||
static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
|
static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
|
||||||
|
@ -342,7 +342,7 @@ static int watchdog(void *__bind_cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PERF_EVENTS_NMI
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
||||||
static int watchdog_nmi_enable(int cpu)
|
static int watchdog_nmi_enable(int cpu)
|
||||||
{
|
{
|
||||||
struct perf_event_attr *wd_attr;
|
struct perf_event_attr *wd_attr;
|
||||||
|
@ -393,7 +393,7 @@ static void watchdog_nmi_disable(int cpu)
|
||||||
#else
|
#else
|
||||||
static int watchdog_nmi_enable(int cpu) { return 0; }
|
static int watchdog_nmi_enable(int cpu) { return 0; }
|
||||||
static void watchdog_nmi_disable(int cpu) { return; }
|
static void watchdog_nmi_disable(int cpu) { return; }
|
||||||
#endif /* CONFIG_PERF_EVENTS_NMI */
|
#endif /* CONFIG_HARDLOCKUP_DETECTOR */
|
||||||
|
|
||||||
/* prepare/enable/disable routines */
|
/* prepare/enable/disable routines */
|
||||||
static int watchdog_prepare_cpu(int cpu)
|
static int watchdog_prepare_cpu(int cpu)
|
||||||
|
|
|
@ -174,6 +174,9 @@ config LOCKUP_DETECTOR
|
||||||
generate interrupts and kick the watchdog task every 10-12 seconds.
|
generate interrupts and kick the watchdog task every 10-12 seconds.
|
||||||
An NMI is generated every 60 seconds or so to check for hardlockups.
|
An NMI is generated every 60 seconds or so to check for hardlockups.
|
||||||
|
|
||||||
|
config HARDLOCKUP_DETECTOR
|
||||||
|
def_bool LOCKUP_DETECTOR && PERF_EVENTS && HAVE_PERF_EVENTS_NMI
|
||||||
|
|
||||||
config BOOTPARAM_SOFTLOCKUP_PANIC
|
config BOOTPARAM_SOFTLOCKUP_PANIC
|
||||||
bool "Panic (Reboot) On Soft Lockups"
|
bool "Panic (Reboot) On Soft Lockups"
|
||||||
depends on LOCKUP_DETECTOR
|
depends on LOCKUP_DETECTOR
|
||||||
|
|
Loading…
Reference in New Issue