diff options
author | fan.du <fan.du@windriver.com> | 2013-01-23 03:06:11 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-12-01 22:14:50 -0500 |
commit | c041cfa2af1ccb8d0346dc576144a1085e9b4d4b (patch) | |
tree | b1845d3b2be314dbfa6358fb100680e659a86e3e | |
parent | 0ce636700c5bad54eda0e62903a1803f6d67b31d (diff) |
powerpc: Make irq_stat.timers_irqs counting more specific
Current irq_stat.timers_irqs counting doesn't discriminate timer event handler
and other timer interrupt(like arch_irq_work_raise). Sometimes we need to know
exactly how much interrupts timer event handler fired, so let's be more specific
on this.
Signed-off-by: Fan Du <fan.du@windriver.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/include/asm/hardirq.h | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/time.c | 3 |
3 files changed, 13 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/hardirq.h b/arch/powerpc/include/asm/hardirq.h index 3bdcfce2c42a..418fb654370d 100644 --- a/arch/powerpc/include/asm/hardirq.h +++ b/arch/powerpc/include/asm/hardirq.h | |||
@@ -6,7 +6,8 @@ | |||
6 | 6 | ||
7 | typedef struct { | 7 | typedef struct { |
8 | unsigned int __softirq_pending; | 8 | unsigned int __softirq_pending; |
9 | unsigned int timer_irqs; | 9 | unsigned int timer_irqs_event; |
10 | unsigned int timer_irqs_others; | ||
10 | unsigned int pmu_irqs; | 11 | unsigned int pmu_irqs; |
11 | unsigned int mce_exceptions; | 12 | unsigned int mce_exceptions; |
12 | unsigned int spurious_irqs; | 13 | unsigned int spurious_irqs; |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index ba0165615215..9729b23bfb0a 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -354,8 +354,13 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
354 | 354 | ||
355 | seq_printf(p, "%*s: ", prec, "LOC"); | 355 | seq_printf(p, "%*s: ", prec, "LOC"); |
356 | for_each_online_cpu(j) | 356 | for_each_online_cpu(j) |
357 | seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs); | 357 | seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_event); |
358 | seq_printf(p, " Local timer interrupts\n"); | 358 | seq_printf(p, " Local timer interrupts for timer event device\n"); |
359 | |||
360 | seq_printf(p, "%*s: ", prec, "LOC"); | ||
361 | for_each_online_cpu(j) | ||
362 | seq_printf(p, "%10u ", per_cpu(irq_stat, j).timer_irqs_others); | ||
363 | seq_printf(p, " Local timer interrupts for others\n"); | ||
359 | 364 | ||
360 | seq_printf(p, "%*s: ", prec, "SPU"); | 365 | seq_printf(p, "%*s: ", prec, "SPU"); |
361 | for_each_online_cpu(j) | 366 | for_each_online_cpu(j) |
@@ -389,11 +394,12 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
389 | */ | 394 | */ |
390 | u64 arch_irq_stat_cpu(unsigned int cpu) | 395 | u64 arch_irq_stat_cpu(unsigned int cpu) |
391 | { | 396 | { |
392 | u64 sum = per_cpu(irq_stat, cpu).timer_irqs; | 397 | u64 sum = per_cpu(irq_stat, cpu).timer_irqs_event; |
393 | 398 | ||
394 | sum += per_cpu(irq_stat, cpu).pmu_irqs; | 399 | sum += per_cpu(irq_stat, cpu).pmu_irqs; |
395 | sum += per_cpu(irq_stat, cpu).mce_exceptions; | 400 | sum += per_cpu(irq_stat, cpu).mce_exceptions; |
396 | sum += per_cpu(irq_stat, cpu).spurious_irqs; | 401 | sum += per_cpu(irq_stat, cpu).spurious_irqs; |
402 | sum += per_cpu(irq_stat, cpu).timer_irqs_others; | ||
397 | #ifdef CONFIG_PPC_DOORBELL | 403 | #ifdef CONFIG_PPC_DOORBELL |
398 | sum += per_cpu(irq_stat, cpu).doorbell_irqs; | 404 | sum += per_cpu(irq_stat, cpu).doorbell_irqs; |
399 | #endif | 405 | #endif |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index b3b144121cc9..afb1b56ef4fa 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -510,7 +510,6 @@ void timer_interrupt(struct pt_regs * regs) | |||
510 | */ | 510 | */ |
511 | may_hard_irq_enable(); | 511 | may_hard_irq_enable(); |
512 | 512 | ||
513 | __get_cpu_var(irq_stat).timer_irqs++; | ||
514 | 513 | ||
515 | #if defined(CONFIG_PPC32) && defined(CONFIG_PMAC) | 514 | #if defined(CONFIG_PPC32) && defined(CONFIG_PMAC) |
516 | if (atomic_read(&ppc_n_lost_interrupts) != 0) | 515 | if (atomic_read(&ppc_n_lost_interrupts) != 0) |
@@ -532,10 +531,12 @@ void timer_interrupt(struct pt_regs * regs) | |||
532 | *next_tb = ~(u64)0; | 531 | *next_tb = ~(u64)0; |
533 | if (evt->event_handler) | 532 | if (evt->event_handler) |
534 | evt->event_handler(evt); | 533 | evt->event_handler(evt); |
534 | __get_cpu_var(irq_stat).timer_irqs_event++; | ||
535 | } else { | 535 | } else { |
536 | now = *next_tb - now; | 536 | now = *next_tb - now; |
537 | if (now <= DECREMENTER_MAX) | 537 | if (now <= DECREMENTER_MAX) |
538 | set_dec((int)now); | 538 | set_dec((int)now); |
539 | __get_cpu_var(irq_stat).timer_irqs_others++; | ||
539 | } | 540 | } |
540 | 541 | ||
541 | #ifdef CONFIG_PPC64 | 542 | #ifdef CONFIG_PPC64 |