|
@@ -21,6 +21,7 @@ extern int op_nmi_timer_init(struct oprofile_operations *ops);
|
|
extern void op_nmi_exit(void);
|
|
extern void op_nmi_exit(void);
|
|
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);
|
|
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);
|
|
|
|
|
|
|
|
+static int nmi_timer;
|
|
|
|
|
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
{
|
|
{
|
|
@@ -31,8 +32,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
ret = op_nmi_init(ops);
|
|
ret = op_nmi_init(ops);
|
|
#endif
|
|
#endif
|
|
|
|
+ nmi_timer = (ret != 0);
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
#ifdef CONFIG_X86_IO_APIC
|
|
- if (ret < 0)
|
|
|
|
|
|
+ if (nmi_timer)
|
|
ret = op_nmi_timer_init(ops);
|
|
ret = op_nmi_timer_init(ops);
|
|
#endif
|
|
#endif
|
|
ops->backtrace = x86_backtrace;
|
|
ops->backtrace = x86_backtrace;
|
|
@@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
void oprofile_arch_exit(void)
|
|
void oprofile_arch_exit(void)
|
|
{
|
|
{
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
- op_nmi_exit();
|
|
|
|
|
|
+ if (!nmi_timer)
|
|
|
|
+ op_nmi_exit();
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|