Skip to content

Commit

Permalink
powerpc: tracing: Add powerpc tracepoints for timer entry and exit
Browse files Browse the repository at this point in the history
We can monitor the effectiveness of our power management of both the
kernel and hypervisor by probing the timer interrupt. For example, on
this box we see 10.37s timer interrupts on an idle core:

<idle>-0     [010]  3900.671297: timer_interrupt_entry: pt_regs=c0000000ce1e7b10
<idle>-0     [010]  3900.671302: timer_interrupt_exit: pt_regs=c0000000ce1e7b10

<idle>-0     [010]  3911.042963: timer_interrupt_entry: pt_regs=c0000000ce1e7b10
<idle>-0     [010]  3911.042968: timer_interrupt_exit: pt_regs=c0000000ce1e7b10

<idle>-0     [010]  3921.414630: timer_interrupt_entry: pt_regs=c0000000ce1e7b10
<idle>-0     [010]  3921.414635: timer_interrupt_exit: pt_regs=c0000000ce1e7b10

Since we have a 207MHz decrementer it will go negative and fire every 10.37s
even if Linux is completely idle.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Anton Blanchard authored and Paul Mackerras committed Oct 28, 2009
1 parent 1bf4af1 commit 6795b85
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
34 changes: 34 additions & 0 deletions arch/powerpc/include/asm/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,40 @@ TRACE_EVENT(irq_exit,
TP_printk("pt_regs=%p", __entry->regs)
);

TRACE_EVENT(timer_interrupt_entry,

TP_PROTO(struct pt_regs *regs),

TP_ARGS(regs),

TP_STRUCT__entry(
__field(struct pt_regs *, regs)
),

TP_fast_assign(
__entry->regs = regs;
),

TP_printk("pt_regs=%p", __entry->regs)
);

TRACE_EVENT(timer_interrupt_exit,

TP_PROTO(struct pt_regs *regs),

TP_ARGS(regs),

TP_STRUCT__entry(
__field(struct pt_regs *, regs)
),

TP_fast_assign(
__entry->regs = regs;
),

TP_printk("pt_regs=%p", __entry->regs)
);

#endif /* _TRACE_POWERPC_H */

#undef TRACE_INCLUDE_PATH
Expand Down
6 changes: 6 additions & 0 deletions arch/powerpc/kernel/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/perf_event.h>
#include <asm/trace.h>

#include <asm/io.h>
#include <asm/processor.h>
Expand Down Expand Up @@ -571,6 +572,8 @@ void timer_interrupt(struct pt_regs * regs)
struct clock_event_device *evt = &decrementer->event;
u64 now;

trace_timer_interrupt_entry(regs);

/* Ensure a positive value is written to the decrementer, or else
* some CPUs will continuue to take decrementer exceptions */
set_dec(DECREMENTER_MAX);
Expand All @@ -590,6 +593,7 @@ void timer_interrupt(struct pt_regs * regs)
now = decrementer->next_tb - now;
if (now <= DECREMENTER_MAX)
set_dec((int)now);
trace_timer_interrupt_exit(regs);
return;
}
old_regs = set_irq_regs(regs);
Expand Down Expand Up @@ -620,6 +624,8 @@ void timer_interrupt(struct pt_regs * regs)

irq_exit();
set_irq_regs(old_regs);

trace_timer_interrupt_exit(regs);
}

void wakeup_decrementer(void)
Expand Down

0 comments on commit 6795b85

Please sign in to comment.