Skip to content

Commit

Permalink
powerpc: Rework /proc/interrupts
Browse files Browse the repository at this point in the history
On a large machine I noticed the columns of /proc/interrupts failed to line up
with the header after CPU9. At sufficiently large numbers of CPUs it becomes
impossible to line up the CPU number with the counts.

While fixing this I noticed x86 has a number of updates that we may as well
pull in. On PowerPC we currently omit an interrupt completely if there is no
active handler, whereas on x86 it is printed if there is a non zero count.

The x86 code also spaces the first column correctly based on nr_irqs.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Anton Blanchard authored and Benjamin Herrenschmidt committed Feb 17, 2010
1 parent fda9d86 commit c86845e
Showing 1 changed file with 46 additions and 33 deletions.
79 changes: 46 additions & 33 deletions arch/powerpc/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,65 +183,78 @@ notrace void raw_local_irq_restore(unsigned long en)
EXPORT_SYMBOL(raw_local_irq_restore);
#endif /* CONFIG_PPC64 */

static int show_other_interrupts(struct seq_file *p, int prec)
{
int j;

#if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
if (tau_initialized) {
seq_printf(p, "%*s: ", prec, "TAU");
for_each_online_cpu(j)
seq_printf(p, "%10u ", tau_interrupts(j));
seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
}
#endif /* CONFIG_PPC32 && CONFIG_TAU_INT */

seq_printf(p, "%*s: %10u\n", prec, "BAD", ppc_spurious_interrupts);

return 0;
}

int show_interrupts(struct seq_file *p, void *v)
{
int i = *(loff_t *)v, j;
unsigned long flags, any_count = 0;
int i = *(loff_t *) v, j, prec;
struct irqaction *action;
struct irq_desc *desc;
unsigned long flags;

if (i > nr_irqs)
return 0;

for (prec = 3, j = 1000; prec < 10 && j <= nr_irqs; ++prec)
j *= 10;

if (i == nr_irqs)
return show_other_interrupts(p, prec);

/* print header */
if (i == 0) {
seq_puts(p, " ");
seq_printf(p, "%*s", prec + 8, "");
for_each_online_cpu(j)
seq_printf(p, "CPU%d ", j);
seq_printf(p, "CPU%-8d", j);
seq_putc(p, '\n');
} else if (i == nr_irqs) {
#if defined(CONFIG_PPC32) && defined(CONFIG_TAU_INT)
if (tau_initialized){
seq_puts(p, "TAU: ");
for_each_online_cpu(j)
seq_printf(p, "%10u ", tau_interrupts(j));
seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
}
#endif /* CONFIG_PPC32 && CONFIG_TAU_INT*/
seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);

return 0;
}

desc = irq_to_desc(i);
if (!desc)
return 0;

raw_spin_lock_irqsave(&desc->lock, flags);

for_each_online_cpu(j)
any_count |= kstat_irqs_cpu(i, j);
action = desc->action;
if (!action || !action->handler)
goto skip;
if (!action && !any_count)
goto out;

seq_printf(p, "%3d: ", i);
#ifdef CONFIG_SMP
seq_printf(p, "%*d: ", prec, i);
for_each_online_cpu(j)
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
#else
seq_printf(p, "%10u ", kstat_irqs(i));
#endif /* CONFIG_SMP */

if (desc->chip)
seq_printf(p, " %s ", desc->chip->name);
seq_printf(p, " %-16s", desc->chip->name);
else
seq_puts(p, " None ");
seq_printf(p, " %-16s", "None");
seq_printf(p, " %-8s", (desc->status & IRQ_LEVEL) ? "Level" : "Edge");

seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge ");
seq_printf(p, " %s", action->name);
if (action) {
seq_printf(p, " %s", action->name);
while ((action = action->next) != NULL)
seq_printf(p, ", %s", action->name);
}

for (action = action->next; action; action = action->next)
seq_printf(p, ", %s", action->name);
seq_putc(p, '\n');

skip:
out:
raw_spin_unlock_irqrestore(&desc->lock, flags);

return 0;
}

Expand Down

0 comments on commit c86845e

Please sign in to comment.