2008-10-22 22:26:29 -07:00
|
|
|
#ifndef _ASM_X86_NMI_H
|
|
|
|
#define _ASM_X86_NMI_H
|
2008-03-19 10:25:36 -07:00
|
|
|
|
|
|
|
#include <linux/pm.h>
|
|
|
|
#include <asm/irq.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
|
x86, nmi_watchdog: Remove ARCH_HAS_NMI_WATCHDOG and rely on CONFIG_HARDLOCKUP_DETECTOR
The x86 arch has shifted its use of the nmi_watchdog from a
local implementation to the global one provide by
kernel/watchdog.c. This shift has caused a whole bunch of
compile problems under different config options. I attempt to
simplify things with the patch below.
In order to simplify things, I had to come to terms with the
meaning of two terms ARCH_HAS_NMI_WATCHDOG and
CONFIG_HARDLOCKUP_DETECTOR. Basically they mean the same thing,
the former on a local level and the latter on a global level.
With the old x86 nmi watchdog gone, there is no need to rely on
defining the ARCH_HAS_NMI_WATCHDOG variable because it doesn't
make sense any more. x86 will now use the global
implementation.
The changes below do a few things. First it changes the few
places that relied on ARCH_HAS_NMI_WATCHDOG to use
CONFIG_X86_LOCAL_APIC (the former was an alias for the latter
anyway, so nothing unusual here). Those pieces of code were
relying more on local apic functionality the nmi watchdog
functionality, so the change should make sense.
Second, I removed the x86 implementation of
touch_nmi_watchdog(). It isn't need now, instead x86 will rely
on kernel/watchdog.c's implementation.
Third, I removed the #define ARCH_HAS_NMI_WATCHDOG itself from
x86. And tweaked the include/linux/nmi.h file to tell users to
look for an externally defined touch_nmi_watchdog in the case of
ARCH_HAS_NMI_WATCHDOG _or_ CONFIG_HARDLOCKUP_DETECTOR. This
changes removes some of the ugliness in that file.
Finally, I added a Kconfig dependency for
CONFIG_HARDLOCKUP_DETECTOR that said you can't have
ARCH_HAS_NMI_WATCHDOG _and_ CONFIG_HARDLOCKUP_DETECTOR. You can
only have one nmi_watchdog.
Tested with
ARCH=i386: allnoconfig, defconfig, allyesconfig, (various broken
configs) ARCH=x86_64: allnoconfig, defconfig, allyesconfig,
(various broken configs)
Hopefully, after this patch I won't get any more compile broken
emails. :-)
v3:
changed a couple of 'linux/nmi.h' -> 'asm/nmi.h' to pick-up correct function
prototypes when CONFIG_HARDLOCKUP_DETECTOR is not set.
Signed-off-by: Don Zickus <dzickus@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: fweisbec@gmail.com
LKML-Reference: <1293044403-14117-1-git-send-email-dzickus@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2010-12-22 12:00:03 -07:00
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
2008-03-19 10:25:36 -07:00
|
|
|
|
2008-05-24 08:36:31 -07:00
|
|
|
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
|
2008-03-19 10:25:36 -07:00
|
|
|
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
|
|
|
|
extern int reserve_perfctr_nmi(unsigned int);
|
|
|
|
extern void release_perfctr_nmi(unsigned int);
|
|
|
|
extern int reserve_evntsel_nmi(unsigned int);
|
|
|
|
extern void release_evntsel_nmi(unsigned int);
|
|
|
|
|
|
|
|
struct ctl_table;
|
2009-09-23 15:57:19 -07:00
|
|
|
extern int proc_nmi_enabled(struct ctl_table *, int ,
|
2008-03-19 10:25:36 -07:00
|
|
|
void __user *, size_t *, loff_t *);
|
|
|
|
extern int unknown_nmi_panic;
|
|
|
|
|
2009-08-03 00:31:54 -07:00
|
|
|
void arch_trigger_all_cpu_backtrace(void);
|
|
|
|
#define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
|
2008-03-19 10:25:36 -07:00
|
|
|
#endif
|
|
|
|
|
2011-01-06 14:18:49 -07:00
|
|
|
/*
|
|
|
|
* Define some priorities for the nmi notifier call chain.
|
|
|
|
*
|
|
|
|
* Create a local nmi bit that has a higher priority than
|
|
|
|
* external nmis, because the local ones are more frequent.
|
|
|
|
*
|
|
|
|
* Also setup some default high/normal/low settings for
|
|
|
|
* subsystems to registers with. Using 4 bits to seperate
|
|
|
|
* the priorities. This can go alot higher if needed be.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NMI_LOCAL_SHIFT 16 /* randomly picked */
|
|
|
|
#define NMI_LOCAL_BIT (1ULL << NMI_LOCAL_SHIFT)
|
|
|
|
#define NMI_HIGH_PRIOR (1ULL << 8)
|
|
|
|
#define NMI_NORMAL_PRIOR (1ULL << 4)
|
|
|
|
#define NMI_LOW_PRIOR (1ULL << 0)
|
|
|
|
#define NMI_LOCAL_HIGH_PRIOR (NMI_LOCAL_BIT | NMI_HIGH_PRIOR)
|
|
|
|
#define NMI_LOCAL_NORMAL_PRIOR (NMI_LOCAL_BIT | NMI_NORMAL_PRIOR)
|
|
|
|
#define NMI_LOCAL_LOW_PRIOR (NMI_LOCAL_BIT | NMI_LOW_PRIOR)
|
|
|
|
|
2008-03-19 10:25:36 -07:00
|
|
|
void stop_nmi(void);
|
|
|
|
void restart_nmi(void);
|
|
|
|
|
2008-10-22 22:26:29 -07:00
|
|
|
#endif /* _ASM_X86_NMI_H */
|