dcfce4a095
The legacy x86 nmi watchdog code was removed with the implementation of the perf based nmi watchdog. This broke Oprofile's nmi timer mode. To run nmi timer mode we relied on a continuous ticking nmi source which the nmi watchdog provided. The nmi tick was no longer available and current watchdog can not be used anymore since it runs with very long periods in the range of seconds. This patch reimplements the nmi timer mode using a perf counter nmi source. V2: * removing pr_info() * fix undefined reference to `__udivdi3' for 32 bit build * fix section mismatch of .cpuinit.data:nmi_timer_cpu_nb * removed nmi timer setup in arch/x86 * implemented function stubs for op_nmi_init/exit() * made code more readable in oprofile_init() V3: * fix architectural initialization in oprofile_init() * fix CONFIG_OPROFILE_NMI_TIMER dependencies Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Robert Richter <robert.richter@amd.com>
38 lines
836 B
C
38 lines
836 B
C
/**
|
|
* @file init.c
|
|
*
|
|
* @remark Copyright 2002 OProfile authors
|
|
* @remark Read the file COPYING
|
|
*
|
|
* @author John Levon <levon@movementarian.org>
|
|
*/
|
|
|
|
#include <linux/oprofile.h>
|
|
#include <linux/init.h>
|
|
#include <linux/errno.h>
|
|
|
|
/*
|
|
* We support CPUs that have performance counters like the Pentium Pro
|
|
* with the NMI mode driver.
|
|
*/
|
|
|
|
#ifdef CONFIG_X86_LOCAL_APIC
|
|
extern int op_nmi_init(struct oprofile_operations *ops);
|
|
extern void op_nmi_exit(void);
|
|
#else
|
|
static int op_nmi_init(struct oprofile_operations *ops) { return -ENODEV; }
|
|
static void op_nmi_exit(void) { }
|
|
#endif
|
|
|
|
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);
|
|
|
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
{
|
|
ops->backtrace = x86_backtrace;
|
|
return op_nmi_init(ops);
|
|
}
|
|
|
|
void oprofile_arch_exit(void)
|
|
{
|
|
op_nmi_exit();
|
|
}
|