2008-10-23 07:26:29 +02:00
|
|
|
#ifndef _ASM_X86_NMI_H
|
|
|
|
#define _ASM_X86_NMI_H
|
2008-03-19 18:25:36 +01: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 20:00:03 +01:00
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
2008-03-19 18:25:36 +01: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-24 00:57:19 +02:00
|
|
|
extern int proc_nmi_enabled(struct ctl_table *, int ,
|
2008-03-19 18:25:36 +01:00
|
|
|
void __user *, size_t *, loff_t *);
|
|
|
|
extern int unknown_nmi_panic;
|
|
|
|
|
2009-08-03 09:31:54 +02:00
|
|
|
void arch_trigger_all_cpu_backtrace(void);
|
|
|
|
#define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
|
2008-03-19 18:25:36 +01:00
|
|
|
#endif
|
|
|
|
|
2011-09-30 21:06:20 +02:00
|
|
|
#define NMI_FLAG_FIRST 1
|
|
|
|
|
|
|
|
enum {
|
|
|
|
NMI_LOCAL=0,
|
|
|
|
NMI_UNKNOWN,
|
2012-03-29 22:11:16 +02:00
|
|
|
NMI_SERR,
|
|
|
|
NMI_IO_CHECK,
|
2011-09-30 21:06:20 +02:00
|
|
|
NMI_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
#define NMI_DONE 0
|
|
|
|
#define NMI_HANDLED 1
|
|
|
|
|
|
|
|
typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *);
|
|
|
|
|
2012-03-29 22:11:17 +02:00
|
|
|
struct nmiaction {
|
|
|
|
struct list_head list;
|
|
|
|
nmi_handler_t handler;
|
2012-04-27 22:40:55 +02:00
|
|
|
unsigned long flags;
|
2012-03-29 22:11:17 +02:00
|
|
|
const char *name;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define register_nmi_handler(t, fn, fg, n) \
|
|
|
|
({ \
|
|
|
|
static struct nmiaction fn##_na = { \
|
|
|
|
.handler = (fn), \
|
|
|
|
.name = (n), \
|
|
|
|
.flags = (fg), \
|
|
|
|
}; \
|
|
|
|
__register_nmi_handler((t), &fn##_na); \
|
|
|
|
})
|
|
|
|
|
2012-06-06 16:05:42 +02:00
|
|
|
/*
|
|
|
|
* For special handlers that register/unregister in the
|
|
|
|
* init section only. This should be considered rare.
|
|
|
|
*/
|
|
|
|
#define register_nmi_handler_initonly(t, fn, fg, n) \
|
|
|
|
({ \
|
|
|
|
static struct nmiaction fn##_na __initdata = { \
|
|
|
|
.handler = (fn), \
|
|
|
|
.name = (n), \
|
|
|
|
.flags = (fg), \
|
|
|
|
}; \
|
|
|
|
__register_nmi_handler((t), &fn##_na); \
|
|
|
|
})
|
|
|
|
|
2012-03-29 22:11:17 +02:00
|
|
|
int __register_nmi_handler(unsigned int, struct nmiaction *);
|
2011-09-30 21:06:20 +02:00
|
|
|
|
|
|
|
void unregister_nmi_handler(unsigned int, const char *);
|
|
|
|
|
2008-03-19 18:25:36 +01:00
|
|
|
void stop_nmi(void);
|
|
|
|
void restart_nmi(void);
|
2011-09-30 21:06:22 +02:00
|
|
|
void local_touch_nmi(void);
|
2008-03-19 18:25:36 +01:00
|
|
|
|
2008-10-23 07:26:29 +02:00
|
|
|
#endif /* _ASM_X86_NMI_H */
|