From: Jonathan Corbet Here, I believe, is a patch which should let you remove the "breaks lots of archs" comment from the seq_file /proc/interrupts patch. I haven't been able to test any of these, of course, but my confidence is reasonably high. The ia_64 version worked first time, and the changes are truly mechanical and the same for each - with one or two small exceptions. 25-akpm/arch/alpha/kernel/irq.c | 31 +++++++++++--------- 25-akpm/arch/arm/kernel/irq.c | 12 +++---- 25-akpm/arch/arm26/kernel/irq.c | 10 +++--- 25-akpm/arch/cris/kernel/irq.c | 4 +- 25-akpm/arch/h8300/platform/h8300h/ints.c | 4 +- 25-akpm/arch/h8300/platform/h8s/ints.c | 4 +- 25-akpm/arch/m68k/kernel/ints.c | 9 ++--- 25-akpm/arch/m68knommu/platform/5307/ints.c | 6 +-- 25-akpm/arch/m68knommu/platform/68328/ints.c | 7 ++-- 25-akpm/arch/m68knommu/platform/68360/ints.c | 7 ++-- 25-akpm/arch/mips/kernel/irq.c | 22 +++++++------- 25-akpm/arch/parisc/kernel/irq.c | 21 +++++++------ 25-akpm/arch/ppc/kernel/irq.c | 41 ++++++++++++++------------- 25-akpm/arch/s390/kernel/setup.c | 18 +++++------ 25-akpm/arch/sh/kernel/irq.c | 16 +++++----- 25-akpm/arch/sparc/kernel/irq.c | 4 +- 25-akpm/arch/sparc/kernel/sun4d_irq.c | 4 +- 25-akpm/arch/sparc64/kernel/irq.c | 4 +- 25-akpm/arch/v850/kernel/irq.c | 18 ++++++----- 19 files changed, 128 insertions(+), 114 deletions(-) diff -puN arch/alpha/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/alpha/kernel/irq.c --- 25/arch/alpha/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/alpha/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -529,19 +529,21 @@ show_interrupts(struct seq_file *p, void #ifdef CONFIG_SMP int j; #endif - int i; + int i = *(int *) 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 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 -puN arch/arm26/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/arm26/kernel/irq.c --- 25/arch/arm26/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/arm26/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -135,10 +135,10 @@ void enable_irq(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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, 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 -puN arch/arm/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/arm/kernel/irq.c --- 25/arch/arm/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/arm/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -169,11 +169,11 @@ void disable_irq_wake(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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, 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 -puN arch/cris/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/cris/kernel/irq.c --- 25/arch/cris/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/cris/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -89,11 +89,11 @@ static struct irqaction *irq_action[NR_I int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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 -puN arch/h8300/platform/h8300h/ints.c~proc-interrupts-use-seq_file-2 arch/h8300/platform/h8300h/ints.c --- 25/arch/h8300/platform/h8300h/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/h8300/platform/h8300h/ints.c Fri Nov 21 10:52:50 2003 @@ -228,9 +228,9 @@ asmlinkage void process_int(int vec, str int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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 -puN arch/h8300/platform/h8s/ints.c~proc-interrupts-use-seq_file-2 arch/h8300/platform/h8s/ints.c --- 25/arch/h8300/platform/h8s/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/h8300/platform/h8s/ints.c Fri Nov 21 10:52:50 2003 @@ -280,9 +280,9 @@ asmlinkage void process_int(unsigned lon int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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 -puN arch/m68k/kernel/ints.c~proc-interrupts-use-seq_file-2 arch/m68k/kernel/ints.c --- 25/arch/m68k/kernel/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/m68k/kernel/ints.c Fri Nov 21 10:52:50 2003 @@ -253,19 +253,18 @@ asmlinkage void process_int(unsigned lon int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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 -puN arch/m68knommu/platform/5307/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/5307/ints.c --- 25/arch/m68knommu/platform/5307/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/m68knommu/platform/5307/ints.c Fri Nov 21 10:52:50 2003 @@ -254,9 +254,9 @@ asmlinkage void process_int(unsigned lon int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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, 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 -puN arch/m68knommu/platform/68328/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/68328/ints.c --- 25/arch/m68knommu/platform/68328/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/m68knommu/platform/68328/ints.c Fri Nov 21 10:52:50 2003 @@ -198,9 +198,9 @@ EXPORT_SYMBOL(free_irq); int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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, 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 -puN arch/m68knommu/platform/68360/ints.c~proc-interrupts-use-seq_file-2 arch/m68knommu/platform/68360/ints.c --- 25/arch/m68knommu/platform/68360/ints.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/m68knommu/platform/68360/ints.c Fri Nov 21 10:52:50 2003 @@ -278,9 +278,9 @@ void M68360_disable_irq(unsigned int irq int show_interrupts(struct seq_file *p, void *v) { - int i; + int i = *(int *) 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, 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 -puN arch/mips/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/mips/kernel/irq.c --- 25/arch/mips/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/mips/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -85,17 +85,19 @@ atomic_t irq_err_count; int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(int *) 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, seq_putc(p, '\n'); } } + skip: spin_unlock(&irq_lock); - seq_putc(p, '\n'); #endif /* CONFIG_PROC_FS */ return 0; } diff -puN arch/ppc/kernel/irq.c~proc-interrupts-use-seq_file-2 arch/ppc/kernel/irq.c --- 25/arch/ppc/kernel/irq.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/ppc/kernel/irq.c Fri Nov 21 10:52:50 2003 @@ -346,17 +346,19 @@ void enable_irq(unsigned int irq) int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(int *) 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, 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 -puN arch/s390/kernel/setup.c~proc-interrupts-use-seq_file-2 arch/s390/kernel/setup.c --- 25/arch/s390/kernel/setup.c~proc-interrupts-use-seq_file-2 Fri Nov 21 10:52:50 2003 +++ 25-akpm/arch/s390/kernel/setup.c Fri Nov 21 10:52:50 2003 @@ -617,17 +617,17 @@ static const char *intrclass_names[] = { int show_interrupts(struct seq_file *p, void *v) { - int i, j; + int i = *(int *) v, j; - seq_puts(p, " "); + if (i == 0) { + 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, 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; } _