Loading arch/x86/oprofile/init.c +5 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ extern int op_nmi_timer_init(struct oprofile_operations *ops); extern void op_nmi_exit(void); 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) { Loading @@ -31,8 +32,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) #ifdef CONFIG_X86_LOCAL_APIC ret = op_nmi_init(ops); #endif nmi_timer = (ret != 0); #ifdef CONFIG_X86_IO_APIC if (ret < 0) if (nmi_timer) ret = op_nmi_timer_init(ops); #endif ops->backtrace = x86_backtrace; Loading @@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) void oprofile_arch_exit(void) { #ifdef CONFIG_X86_LOCAL_APIC if (!nmi_timer) op_nmi_exit(); #endif } drivers/oprofile/oprof.c +24 −5 Original line number Diff line number Diff line Loading @@ -239,25 +239,44 @@ int oprofile_set_ulong(unsigned long *addr, unsigned long val) return err; } static int timer_mode; static int __init oprofile_init(void) { int err; /* always init architecture to setup backtrace support */ err = oprofile_arch_init(&oprofile_ops); if (err < 0 || timer) { printk(KERN_INFO "oprofile: using timer interrupt.\n"); timer_mode = err || timer; /* fall back to timer mode on errors */ if (timer_mode) { if (!err) oprofile_arch_exit(); err = oprofile_timer_init(&oprofile_ops); if (err) return err; } return oprofilefs_register(); err = oprofilefs_register(); if (!err) return 0; /* failed */ if (timer_mode) oprofile_timer_exit(); else oprofile_arch_exit(); return err; } static void __exit oprofile_exit(void) { oprofile_timer_exit(); oprofilefs_unregister(); if (timer_mode) oprofile_timer_exit(); else oprofile_arch_exit(); } Loading drivers/oprofile/timer_int.c +1 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ int oprofile_timer_init(struct oprofile_operations *ops) ops->start = oprofile_hrtimer_start; ops->stop = oprofile_hrtimer_stop; ops->cpu_type = "timer"; printk(KERN_INFO "oprofile: using timer interrupt.\n"); return 0; } Loading Loading
arch/x86/oprofile/init.c +5 −2 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ extern int op_nmi_timer_init(struct oprofile_operations *ops); extern void op_nmi_exit(void); 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) { Loading @@ -31,8 +32,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) #ifdef CONFIG_X86_LOCAL_APIC ret = op_nmi_init(ops); #endif nmi_timer = (ret != 0); #ifdef CONFIG_X86_IO_APIC if (ret < 0) if (nmi_timer) ret = op_nmi_timer_init(ops); #endif ops->backtrace = x86_backtrace; Loading @@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) void oprofile_arch_exit(void) { #ifdef CONFIG_X86_LOCAL_APIC if (!nmi_timer) op_nmi_exit(); #endif }
drivers/oprofile/oprof.c +24 −5 Original line number Diff line number Diff line Loading @@ -239,25 +239,44 @@ int oprofile_set_ulong(unsigned long *addr, unsigned long val) return err; } static int timer_mode; static int __init oprofile_init(void) { int err; /* always init architecture to setup backtrace support */ err = oprofile_arch_init(&oprofile_ops); if (err < 0 || timer) { printk(KERN_INFO "oprofile: using timer interrupt.\n"); timer_mode = err || timer; /* fall back to timer mode on errors */ if (timer_mode) { if (!err) oprofile_arch_exit(); err = oprofile_timer_init(&oprofile_ops); if (err) return err; } return oprofilefs_register(); err = oprofilefs_register(); if (!err) return 0; /* failed */ if (timer_mode) oprofile_timer_exit(); else oprofile_arch_exit(); return err; } static void __exit oprofile_exit(void) { oprofile_timer_exit(); oprofilefs_unregister(); if (timer_mode) oprofile_timer_exit(); else oprofile_arch_exit(); } Loading
drivers/oprofile/timer_int.c +1 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ int oprofile_timer_init(struct oprofile_operations *ops) ops->start = oprofile_hrtimer_start; ops->stop = oprofile_hrtimer_stop; ops->cpu_type = "timer"; printk(KERN_INFO "oprofile: using timer interrupt.\n"); return 0; } Loading