x86, NMI: Add priorities to handlers
In order to consolidate the NMI die_chain events, we need to setup the priorities for the die notifiers. I started by defining a bunch of common priorities that can be used by the notifier blocks. Then I modified the notifier blocks to use the newly created priorities. Now that the priorities are straightened out, it should be easier to remove the event DIE_NMI_IPI. Signed-off-by: Don Zickus <dzickus@redhat.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <1294348732-15030-4-git-send-email-dzickus@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
673a6092ce
commit
166d751479
|
@ -23,6 +23,26 @@ void arch_trigger_all_cpu_backtrace(void);
|
||||||
#define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
|
#define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
|
||||||
void stop_nmi(void);
|
void stop_nmi(void);
|
||||||
void restart_nmi(void);
|
void restart_nmi(void);
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ arch_trigger_all_cpu_backtrace_handler(struct notifier_block *self,
|
||||||
static __read_mostly struct notifier_block backtrace_notifier = {
|
static __read_mostly struct notifier_block backtrace_notifier = {
|
||||||
.notifier_call = arch_trigger_all_cpu_backtrace_handler,
|
.notifier_call = arch_trigger_all_cpu_backtrace_handler,
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
.priority = 1
|
.priority = NMI_LOCAL_LOW_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init register_trigger_all_cpu_backtrace(void)
|
static int __init register_trigger_all_cpu_backtrace(void)
|
||||||
|
|
|
@ -95,7 +95,7 @@ static int mce_raise_notify(struct notifier_block *self,
|
||||||
|
|
||||||
static struct notifier_block mce_raise_nb = {
|
static struct notifier_block mce_raise_nb = {
|
||||||
.notifier_call = mce_raise_notify,
|
.notifier_call = mce_raise_notify,
|
||||||
.priority = 1000,
|
.priority = NMI_LOCAL_NORMAL_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Inject mce on current CPU */
|
/* Inject mce on current CPU */
|
||||||
|
|
|
@ -1318,7 +1318,7 @@ perf_event_nmi_handler(struct notifier_block *self,
|
||||||
static __read_mostly struct notifier_block perf_event_nmi_notifier = {
|
static __read_mostly struct notifier_block perf_event_nmi_notifier = {
|
||||||
.notifier_call = perf_event_nmi_handler,
|
.notifier_call = perf_event_nmi_handler,
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
.priority = 1
|
.priority = NMI_LOCAL_LOW_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct event_constraint unconstrained;
|
static struct event_constraint unconstrained;
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include <asm/apicdef.h>
|
#include <asm/apicdef.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
|
#include <asm/nmi.h>
|
||||||
|
|
||||||
struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] =
|
struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] =
|
||||||
{
|
{
|
||||||
|
@ -606,7 +607,7 @@ static struct notifier_block kgdb_notifier = {
|
||||||
/*
|
/*
|
||||||
* Lowest-prio notifier priority, we want to be notified last:
|
* Lowest-prio notifier priority, we want to be notified last:
|
||||||
*/
|
*/
|
||||||
.priority = -INT_MAX,
|
.priority = NMI_LOCAL_LOW_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -778,6 +778,8 @@ static void smp_send_nmi_allbutself(void)
|
||||||
|
|
||||||
static struct notifier_block crash_nmi_nb = {
|
static struct notifier_block crash_nmi_nb = {
|
||||||
.notifier_call = crash_nmi_callback,
|
.notifier_call = crash_nmi_callback,
|
||||||
|
/* we want to be the first one called */
|
||||||
|
.priority = NMI_LOCAL_HIGH_PRIOR+1,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Halt all other CPUs, calling the specified function on each of them
|
/* Halt all other CPUs, calling the specified function on each of them
|
||||||
|
|
|
@ -361,7 +361,7 @@ static void nmi_cpu_setup(void *dummy)
|
||||||
static struct notifier_block profile_exceptions_nb = {
|
static struct notifier_block profile_exceptions_nb = {
|
||||||
.notifier_call = profile_exceptions_notify,
|
.notifier_call = profile_exceptions_notify,
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
.priority = 2
|
.priority = NMI_LOCAL_LOW_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void nmi_cpu_restore_registers(struct op_msrs *msrs)
|
static void nmi_cpu_restore_registers(struct op_msrs *msrs)
|
||||||
|
|
|
@ -38,7 +38,7 @@ static int profile_timer_exceptions_notify(struct notifier_block *self,
|
||||||
static struct notifier_block profile_timer_exceptions_nb = {
|
static struct notifier_block profile_timer_exceptions_nb = {
|
||||||
.notifier_call = profile_timer_exceptions_notify,
|
.notifier_call = profile_timer_exceptions_notify,
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
.priority = 0
|
.priority = NMI_LOW_PRIOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int timer_start(void)
|
static int timer_start(void)
|
||||||
|
|
Loading…
Reference in New Issue