Skip to content

Commit

Permalink
Merge branch 'urgent' of git://amd64.org/linux/rric into perf/urgent
Browse files Browse the repository at this point in the history
  • Loading branch information
Ingo Molnar committed Nov 15, 2011
2 parents ed13ec5 + 97f7f81 commit 4a1dba7
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
7 changes: 5 additions & 2 deletions arch/x86/oprofile/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
Expand All @@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
void oprofile_arch_exit(void)
{
#ifdef CONFIG_X86_LOCAL_APIC
op_nmi_exit();
if (!nmi_timer)
op_nmi_exit();
#endif
}
29 changes: 24 additions & 5 deletions drivers/oprofile/oprof.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,26 +239,45 @@ 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();
oprofile_arch_exit();
if (timer_mode)
oprofile_timer_exit();
else
oprofile_arch_exit();
}


Expand Down
1 change: 1 addition & 0 deletions drivers/oprofile/timer_int.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 4a1dba7

Please sign in to comment.