forked from luck/tmp_suning_uos_patched
x86_64: make /proc/interrupts work with dyn irq_desc
loop with irq_desc list Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a2f9f43858
commit
52b17329d6
|
@ -70,9 +70,27 @@ static inline void stack_overflow_check(struct pt_regs *regs)
|
|||
|
||||
int show_interrupts(struct seq_file *p, void *v)
|
||||
{
|
||||
int i = *(loff_t *) v, j;
|
||||
int i, j;
|
||||
struct irqaction * action;
|
||||
unsigned long flags;
|
||||
unsigned int entries;
|
||||
struct irq_desc *desc;
|
||||
int tail = 0;
|
||||
|
||||
#ifdef CONFIG_HAVE_SPARSE_IRQ
|
||||
desc = (struct irq_desc *)v;
|
||||
entries = -1U;
|
||||
i = desc->irq;
|
||||
if (!desc->next)
|
||||
tail = 1;
|
||||
#else
|
||||
entries = nr_irqs - 1;
|
||||
i = *(loff_t *) v;
|
||||
if (i == nr_irqs)
|
||||
tail = 1;
|
||||
else
|
||||
desc = irq_to_desc(i);
|
||||
#endif
|
||||
|
||||
if (i == 0) {
|
||||
seq_printf(p, " ");
|
||||
|
@ -81,12 +99,8 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
seq_putc(p, '\n');
|
||||
}
|
||||
|
||||
if (i < nr_irqs) {
|
||||
if (i <= entries) {
|
||||
unsigned any_count = 0;
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
|
||||
if (!desc)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
#ifndef CONFIG_SMP
|
||||
|
@ -116,7 +130,9 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
seq_putc(p, '\n');
|
||||
skip:
|
||||
spin_unlock_irqrestore(&desc->lock, flags);
|
||||
} else if (i == nr_irqs) {
|
||||
}
|
||||
|
||||
if (tail) {
|
||||
seq_printf(p, "NMI: ");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
|
||||
|
@ -155,6 +171,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
seq_printf(p, " Spurious interrupts\n");
|
||||
seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -645,15 +645,36 @@ static const struct file_operations proc_stat_operations = {
|
|||
*/
|
||||
static void *int_seq_start(struct seq_file *f, loff_t *pos)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_SPARSE_IRQ
|
||||
struct irq_desc *desc;
|
||||
int irq;
|
||||
int count = *pos;
|
||||
|
||||
for_each_irq_desc(irq, desc) {
|
||||
if (count-- == 0)
|
||||
return desc;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
#else
|
||||
return (*pos <= nr_irqs) ? pos : NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_SPARSE_IRQ
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = ((struct irq_desc *)v)->next;
|
||||
(*pos)++;
|
||||
if (*pos > nr_irqs)
|
||||
return NULL;
|
||||
return pos;
|
||||
|
||||
return desc;
|
||||
#else
|
||||
(*pos)++;
|
||||
return (*pos <= nr_irqs) ? pos : NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void int_seq_stop(struct seq_file *f, void *v)
|
||||
|
@ -661,7 +682,6 @@ static void int_seq_stop(struct seq_file *f, void *v)
|
|||
/* Nothing to do */
|
||||
}
|
||||
|
||||
|
||||
static const struct seq_operations int_seq_ops = {
|
||||
.start = int_seq_start,
|
||||
.next = int_seq_next,
|
||||
|
|
Loading…
Reference in New Issue
Block a user