From ab6b18103ac0d34902fa4c9503067c2cb1074b72 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Mon, 29 Dec 2003 05:46:23 -0800 Subject: [PATCH] [PATCH] seq_file version of /proc/interrupts From: corbet@lwn.net (Jonathan Corbet) This converts all architectures' /proc/interrupts implementation over to seq_file. We need this for SMP machines with ridiculous numbers of CPUs and if you convert one arch, you have to convert them all... --- arch/alpha/kernel/irq.c | 31 +++++++++-------- arch/arm/kernel/irq.c | 12 +++---- arch/arm26/kernel/irq.c | 10 +++--- arch/cris/kernel/irq.c | 4 +-- arch/h8300/platform/h8300h/ints.c | 4 +-- arch/h8300/platform/h8s/ints.c | 4 +-- arch/i386/kernel/irq.c | 46 ++++++++++++++----------- arch/ia64/kernel/irq.c | 43 +++++++++++++----------- arch/m68k/kernel/ints.c | 9 +++-- arch/m68knommu/platform/5307/ints.c | 6 ++-- arch/m68knommu/platform/68328/ints.c | 7 ++-- arch/m68knommu/platform/68360/ints.c | 7 ++-- arch/mips/kernel/irq.c | 22 ++++++------ arch/parisc/kernel/irq.c | 21 ++++++------ arch/ppc/kernel/irq.c | 41 ++++++++++++----------- arch/ppc64/kernel/irq.c | 20 ++++++----- arch/s390/kernel/setup.c | 18 +++++----- arch/sh/kernel/irq.c | 16 +++++---- arch/sparc/kernel/irq.c | 4 +-- arch/sparc/kernel/sun4d_irq.c | 4 +-- arch/sparc64/kernel/irq.c | 4 +-- arch/v850/kernel/irq.c | 18 +++++----- arch/x86_64/kernel/irq.c | 43 +++++++++++++----------- fs/proc/proc_misc.c | 50 ++++++++++++++++++---------- 24 files changed, 244 insertions(+), 200 deletions(-) diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index f165203fc459e..ed25ea3e0e094 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -529,19 +529,21 @@ show_interrupts(struct seq_file *p, void *v) #ifdef CONFIG_SMP int j; #endif - int i; + int i = *(loff_t *) v; struct irqaction * action; unsigned long flags; #ifdef CONFIG_SMP - seq_puts(p, " "); - for (i = 0; i < NR_CPUS; i++) - if (cpu_online(i)) - seq_printf(p, "CPU%d ", i); - seq_putc(p, '\n'); + if (i == 0) { + seq_puts(p, " "); + for (i = 0; i < NR_CPUS; i++) + if (cpu_online(i)) + seq_printf(p, "CPU%d ", i); + seq_putc(p, '\n'); + } #endif - for (i = 0; i < ACTUAL_NR_IRQS; i++) { + if (i < ACTUAL_NR_IRQS) { spin_lock_irqsave(&irq_desc[i].lock, flags); action = irq_desc[i].action; if (!action) @@ -568,15 +570,16 @@ show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); unlock: spin_unlock_irqrestore(&irq_desc[i].lock, flags); - } + } else if (i == ACTUAL_NR_IRQS) { #ifdef CONFIG_SMP - seq_puts(p, "IPI: "); - for (i = 0; i < NR_CPUS; i++) - if (cpu_online(i)) - seq_printf(p, "%10lu ", cpu_data[i].ipi_count); - seq_putc(p, '\n'); + seq_puts(p, "IPI: "); + for (i = 0; i < NR_CPUS; i++) + if (cpu_online(i)) + seq_printf(p, "%10lu ", cpu_data[i].ipi_count); + seq_putc(p, '\n'); #endif - seq_printf(p, "ERR: %10lu\n", irq_err_count); + seq_printf(p, "ERR: %10lu\n", irq_err_count); + } return 0; } diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index dc68c93d43f4f..4a9e1ea82e94d 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -169,11 +169,11 @@ void disable_irq_wake(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; struct irqaction * action; unsigned long flags; - for (i = 0 ; i < NR_IRQS ; i++) { + if (i < NR_IRQS) { spin_lock_irqsave(&irq_controller_lock, flags); action = irq_desc[i].action; if (!action) @@ -187,12 +187,12 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); unlock: spin_unlock_irqrestore(&irq_controller_lock, flags); - } - + } else if (i == NR_IRQS) { #ifdef CONFIG_ARCH_ACORN - show_fiq_list(p, v); + show_fiq_list(p, v); #endif - seq_printf(p, "Err: %10lu\n", irq_err_count); + seq_printf(p, "Err: %10lu\n", irq_err_count); + } return 0; } diff --git a/arch/arm26/kernel/irq.c b/arch/arm26/kernel/irq.c index 3322d98e677b4..d627cedab8055 100644 --- a/arch/arm26/kernel/irq.c +++ b/arch/arm26/kernel/irq.c @@ -135,10 +135,10 @@ void enable_irq(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; struct irqaction * action; - for (i = 0 ; i < NR_IRQS ; i++) { + if (i < NR_IRQS) { action = irq_desc[i].action; if (!action) continue; @@ -148,10 +148,10 @@ int show_interrupts(struct seq_file *p, void *v) seq_printf(p, ", %s", action->name); } seq_putc(p, '\n'); + } else if (i == NR_IRQS) { + show_fiq_list(p, v); + seq_printf(p, "Err: %10lu\n", irq_err_count); } - - show_fiq_list(p, v); - seq_printf(p, "Err: %10lu\n", irq_err_count); return 0; } diff --git a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c index d61fa25474637..5eba7c18415cd 100644 --- a/arch/cris/kernel/irq.c +++ b/arch/cris/kernel/irq.c @@ -89,11 +89,11 @@ static struct irqaction *irq_action[NR_IRQS]; int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; struct irqaction * action; unsigned long flags; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { local_irq_save(flags); action = irq_action[i]; if (!action) diff --git a/arch/h8300/platform/h8300h/ints.c b/arch/h8300/platform/h8300h/ints.c index e62375f7a5ccd..1c9e2915af319 100644 --- a/arch/h8300/platform/h8300h/ints.c +++ b/arch/h8300/platform/h8300h/ints.c @@ -228,9 +228,9 @@ asmlinkage void process_int(int vec, struct pt_regs *fp) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { if (irq_list[i]) { seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); seq_printf(p, "%s\n", irq_list[i]->devname); diff --git a/arch/h8300/platform/h8s/ints.c b/arch/h8300/platform/h8s/ints.c index 84ab5adb946a6..d8d776065289a 100644 --- a/arch/h8300/platform/h8s/ints.c +++ b/arch/h8300/platform/h8s/ints.c @@ -280,9 +280,9 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { if (irq_list[i]) { seq_printf(p, "%3d: %10u ",i,irq_list[i]->count); seq_printf(p, "%s\n", irq_list[i]->devname); diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c index 3ff7d7a29be38..d9d0f888a5873 100644 --- a/arch/i386/kernel/irq.c +++ b/arch/i386/kernel/irq.c @@ -138,17 +138,19 @@ atomic_t irq_mis_count; int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; struct irqaction * action; unsigned long flags; - seq_printf(p, " "); - for (j=0; jlock, flags); action = idesc->action; @@ -194,25 +196,26 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); skip: spin_unlock_irqrestore(&idesc->lock, flags); - } - seq_puts(p, "NMI: "); - for (j = 0; j < NR_CPUS; j++) - if (cpu_online(j)) - seq_printf(p, "%10u ", nmi_count(j)); - seq_putc(p, '\n'); + } else if (i == NR_IRQS) { + seq_puts(p, "NMI: "); + for (j = 0; j < NR_CPUS; j++) + if (cpu_online(j)) + seq_printf(p, "%10u ", nmi_count(j)); + seq_putc(p, '\n'); #ifdef CONFIG_X86_LOCAL_APIC - seq_puts(p, "LOC: "); - for (j = 0; j < NR_CPUS; j++) - if (cpu_online(j)) - seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs); - seq_putc(p, '\n'); + seq_puts(p, "LOC: "); + for (j = 0; j < NR_CPUS; j++) + if (cpu_online(j)) + seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs); + seq_putc(p, '\n'); #endif - seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); + seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); #ifdef CONFIG_X86_IO_APIC #ifdef APIC_MISMATCH_DEBUG - seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); + seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); #endif #endif + } return 0; } diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c index 7f42d001228ab..c174fde99662e 100644 --- a/arch/m68k/kernel/ints.c +++ b/arch/m68k/kernel/ints.c @@ -253,19 +253,18 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; /* autovector interrupts */ if (mach_default_handler) { - for (i = 0; i < SYS_IRQS; i++) { + if (i < SYS_IRQS) { seq_printf(p, "auto %2d: %10u ", i, i ? kstat_cpu(0).irqs[i] : num_spurious); seq_puts(p, " "); seq_printf(p, "%s\n", irq_list[i].devname); } - } - - mach_get_irq_list(p, v); + } else if (i == SYS_IRQS) + mach_get_irq_list(p, v); return 0; } diff --git a/arch/m68knommu/platform/5307/ints.c b/arch/m68knommu/platform/5307/ints.c index 1ccb7070fb8ba..ea56a1249330e 100644 --- a/arch/m68knommu/platform/5307/ints.c +++ b/arch/m68knommu/platform/5307/ints.c @@ -254,9 +254,9 @@ asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { if (irq_list[i].flags & IRQ_FLG_STD) continue; @@ -269,7 +269,7 @@ int show_interrupts(struct seq_file *p, void *v) seq_printf(p, "%s\n", irq_list[i].devname); } - if (mach_get_irq_list) + if (i == NR_IRQS && mach_get_irq_list) mach_get_irq_list(p, v); return(0); } diff --git a/arch/m68knommu/platform/68328/ints.c b/arch/m68knommu/platform/68328/ints.c index 15c72cadd3ef4..cd673ec8df8d1 100644 --- a/arch/m68knommu/platform/68328/ints.c +++ b/arch/m68knommu/platform/68328/ints.c @@ -198,9 +198,9 @@ EXPORT_SYMBOL(free_irq); int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { if (int_irq_list[i].flags & IRQ_FLG_STD) continue; @@ -211,7 +211,8 @@ int show_interrupts(struct seq_file *p, void *v) seq_printf(p, " "); seq_printf(p, "%s\n", int_irq_list[i].devname); } - seq_printf(p, " : %10u spurious\n", num_spurious); + if (i == NR_IRQS) + seq_printf(p, " : %10u spurious\n", num_spurious); return 0; } diff --git a/arch/m68knommu/platform/68360/ints.c b/arch/m68knommu/platform/68360/ints.c index bbcf966f4eefe..3023347a1c2ee 100644 --- a/arch/m68knommu/platform/68360/ints.c +++ b/arch/m68knommu/platform/68360/ints.c @@ -278,9 +278,9 @@ void M68360_disable_irq(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(loff_t *) v; - for (i = 0; i < NR_IRQS; i++) { + if (i < NR_IRQS) { if (int_irq_list[i].flags & IRQ_FLG_STD) continue; @@ -291,7 +291,8 @@ int show_interrupts(struct seq_file *p, void *v) seq_printf(p, " "); seq_printf(p, "%s\n", int_irq_list[i].devname); } - seq_printf(p, " : %10u spurious\n", num_spurious); + if (i == NR_IRQS) + seq_printf(p, " : %10u spurious\n", num_spurious); return 0; } diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index 85c40b9548b3c..2465ef82b094d 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c @@ -85,17 +85,19 @@ atomic_t irq_err_count; int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; struct irqaction * action; unsigned long flags; - seq_printf(p, " "); - for (j=0; jaction) - continue; + goto skip; for (i = 0; i <= MAX_CPU_IRQ; i++) { struct irqaction *action = ®ion->action[i]; @@ -286,9 +287,9 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); } } + skip: spin_unlock(&irq_lock); - seq_putc(p, '\n'); #endif /* CONFIG_PROC_FS */ return 0; } diff --git a/arch/ppc/kernel/irq.c b/arch/ppc/kernel/irq.c index e7bf1e5825b2d..706c24f323565 100644 --- a/arch/ppc/kernel/irq.c +++ b/arch/ppc/kernel/irq.c @@ -346,17 +346,19 @@ void enable_irq(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; struct irqaction * action; unsigned long flags; - seq_puts(p, " "); - for (j=0; jhandler ) @@ -381,22 +383,23 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); skip: spin_unlock_irqrestore(&irq_desc[i].lock, flags); - } + } else if (i == NR_IRQS) { #ifdef CONFIG_TAU_INT - if (tau_initialized){ - seq_puts(p, "TAU: "); - for (j = 0; j < NR_CPUS; j++) - if (cpu_online(j)) - seq_printf(p, "%10u ", tau_interrupts(j)); - seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n"); - } + if (tau_initialized){ + seq_puts(p, "TAU: "); + for (j = 0; j < NR_CPUS; j++) + if (cpu_online(j)) + seq_printf(p, "%10u ", tau_interrupts(j)); + seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n"); + } #endif #ifdef CONFIG_SMP - /* should this be per processor send/receive? */ - seq_printf(p, "IPI (recv/sent): %10u/%u\n", - atomic_read(&ipi_recv), atomic_read(&ipi_sent)); + /* should this be per processor send/receive? */ + seq_printf(p, "IPI (recv/sent): %10u/%u\n", + atomic_read(&ipi_recv), atomic_read(&ipi_sent)); #endif - seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); + seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); + } return 0; } diff --git a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c index 1d43005fbb19f..aad1e861a24e6 100644 --- a/arch/ppc64/kernel/irq.c +++ b/arch/ppc64/kernel/irq.c @@ -323,18 +323,20 @@ EXPORT_SYMBOL(enable_irq); int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; struct irqaction * action; unsigned long flags; - seq_printf(p, " "); - for (j=0; jhandler) @@ -359,8 +361,8 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); skip: spin_unlock_irqrestore(&irq_desc[i].lock, flags); - } - seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); + } else if (i == NR_IRQS) + seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts); return 0; } diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 3798020fbbd56..315380bb914d3 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c @@ -617,17 +617,17 @@ static const char *intrclass_names[] = { int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; - seq_puts(p, " "); - - for (j=0; jtypename; spin_lock_irqsave(&irq_desc[j].lock, flags); @@ -121,8 +123,8 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); skip: spin_unlock_irqrestore(&irq_desc[j].lock, flags); - } - seq_printf(p, "ERR: %10lu\n", irq_err_count); + } else if (i == NR_IRQS) + seq_printf(p, "ERR: %10lu\n", irq_err_count); return 0; } diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c index 3946c6d2ad05d..a385baf5df4fc 100644 --- a/arch/x86_64/kernel/irq.c +++ b/arch/x86_64/kernel/irq.c @@ -138,17 +138,19 @@ atomic_t irq_mis_count; int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(loff_t *) v, j; struct irqaction * action; unsigned long flags; - seq_printf(p, " "); - for (j=0; jprivate_data; - m->buf = buf; - m->size = size; - } else - kfree(buf); - return res; +static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos) +{ + (*pos)++; + if (*pos > NR_IRQS) + return NULL; + return pos; +} + +static void int_seq_stop(struct seq_file *f, void *v) +{ + /* Nothing to do */ } + + +extern int show_interrupts(struct seq_file *f, void *v); /* In arch code */ +static struct seq_operations int_seq_ops = { + .start = int_seq_start, + .next = int_seq_next, + .stop = int_seq_stop, + .show = show_interrupts +}; + +int interrupts_open(struct inode *inode, struct file *filp) +{ + return seq_open(filp, &int_seq_ops); +} + static struct file_operations proc_interrupts_operations = { .open = interrupts_open, .read = seq_read, .llseek = seq_lseek, - .release = single_release, + .release = seq_release, }; static int filesystems_read_proc(char *page, char **start, off_t off, -- 2.53.0