[CFT][PATCH] /proc/interrupts fixes

From: Alexander Viro (viro@math.psu.edu)
Date: Thu Nov 22 2001 - 18:36:44 EST


        Patch below switches /proc/interrupts to seq_file. Due to the
ugly (and heavily platform-dependent) layout there's not much of "seq"
here - we simply use the buffering and overflow-prevention provided by
seq_file.

        Patch works on x86 and should work on every architecture where
it manages to build. Hopefully - all of them. IOW, I've done the
conversion for all architectures, but there could be typos. Patch
is very straightforward - see yourself.

        Folks, please check if it compiles (and works). IMO it's
worth applying; the question being, at which point... Linus?

diff -urN S15-pre9/arch/alpha/kernel/irq.c S15-pre9-current/arch/alpha/kernel/irq.c
--- S15-pre9/arch/alpha/kernel/irq.c Sun Sep 23 16:11:55 2001
+++ S15-pre9-current/arch/alpha/kernel/irq.c Thu Nov 22 13:59:41 2001
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -514,64 +515,63 @@
 }
 
 int
-get_irq_list(char *buf)
+show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_SMP
         int j;
 #endif
         int i;
         struct irqaction * action;
- char *p = buf;
 
 #ifdef CONFIG_SMP
- p += sprintf(p, " ");
+ seq_puts(p, " ");
         for (i = 0; i < smp_num_cpus; i++)
- p += sprintf(p, "CPU%d ", i);
+ seq_printf(p, "CPU%d ", i);
 #ifdef DO_BROADCAST_INTS
         for (i = 0; i < smp_num_cpus; i++)
- p += sprintf(p, "TRY%d ", i);
+ seq_printf(p, "TRY%d ", i);
 #endif
- *p++ = '\n';
+ seq_putc(p, '\n');
 #endif
 
         for (i = 0; i < NR_IRQS; i++) {
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: ",i);
+ seq_printf(p, "%3d: ",i);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                                      kstat.irqs[cpu_logical_map(j)][i]);
 #ifdef DO_BROADCAST_INTS
                 for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10lu ",
+ seq_printf(p, "%10lu ",
                                      irq_attempt(cpu_logical_map(j), i));
 #endif
 #endif
- p += sprintf(p, " %14s", irq_desc[i].handler->typename);
- p += sprintf(p, " %c%s",
+ seq_printf(p, " %14s", irq_desc[i].handler->typename);
+ seq_printf(p, " %c%s",
                              (action->flags & SA_INTERRUPT)?'+':' ',
                              action->name);
 
                 for (action=action->next; action; action = action->next) {
- p += sprintf(p, ", %c%s",
+ seq_printf(p, ", %c%s",
                                      (action->flags & SA_INTERRUPT)?'+':' ',
                                      action->name);
                 }
- *p++ = '\n';
+ seq_putc(p, '\n');
         }
 #if CONFIG_SMP
- p += sprintf(p, "IPI: ");
+ seq_puts(p, "IPI: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10lu ",
+ seq_printf(p, "%10lu ",
                              cpu_data[cpu_logical_map(j)].ipi_count);
- p += sprintf(p, "\n");
+ seq_putc(p, '\n');
 #endif
- p += sprintf(p, "ERR: %10lu\n", irq_err_count);
- return p - buf;
+ seq_printf(p, "ERR: %10lu\n", irq_err_count);
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/arm/kernel/fiq.c S15-pre9-current/arch/arm/kernel/fiq.c
--- S15-pre9/arch/arm/kernel/fiq.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/arm/kernel/fiq.c Thu Nov 22 14:00:03 2001
@@ -40,6 +40,7 @@
 #include <linux/mm.h>
 #include <linux/mman.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/fiq.h>
 #include <asm/io.h>
@@ -92,15 +93,12 @@
 
 static struct fiq_handler *current_fiq = &default_owner;
 
-int get_fiq_list(char *buf)
+int show_fiq_list(struct seq_file *p, void *v)
 {
- char *p = buf;
-
         if (current_fiq != &default_owner)
- p += sprintf(p, "FIQ: %s\n",
- current_fiq->name);
+ seq_printf(p, "FIQ: %s\n", current_fiq->name);
 
- return p - buf;
+ return 0;
 }
 
 void set_fiq_handler(void *start, unsigned int length)
diff -urN S15-pre9/arch/arm/kernel/irq.c S15-pre9-current/arch/arm/kernel/irq.c
--- S15-pre9/arch/arm/kernel/irq.c Sun Jul 29 01:54:41 2001
+++ S15-pre9-current/arch/arm/kernel/irq.c Thu Nov 22 14:00:17 2001
@@ -28,6 +28,7 @@
 #include <linux/random.h>
 #include <linux/smp.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/system.h>
@@ -95,29 +96,28 @@
         spin_unlock_irqrestore(&irq_controller_lock, flags);
 }
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i;
         struct irqaction * action;
- char *p = buf;
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                     action = irq_desc[i].action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: %10u ", i, kstat_irqs(i));
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, "%3d: %10u ", i, kstat_irqs(i));
+ seq_printf(p, " %s", action->name);
                 for (action = action->next; action; action = action->next) {
- p += sprintf(p, ", %s", action->name);
+ seq_printf(p, ", %s", action->name);
                 }
- *p++ = '\n';
+ seq_putc(p, '\n');
         }
 
 #ifdef CONFIG_ARCH_ACORN
- p += get_fiq_list(p);
+ show_fiq_list(p);
 #endif
- p += sprintf(p, "Err: %10lu\n", irq_err_count);
- return p - buf;
+ seq_printf(p, "Err: %10lu\n", irq_err_count);
+ return 0;
 }
 
 /*
diff -urN S15-pre9/arch/cris/kernel/irq.c S15-pre9-current/arch/cris/kernel/irq.c
--- S15-pre9/arch/cris/kernel/irq.c Sat Aug 11 14:59:20 2001
+++ S15-pre9-current/arch/cris/kernel/irq.c Thu Nov 22 14:00:28 2001
@@ -33,6 +33,7 @@
 #include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -223,27 +224,27 @@
         NULL, NULL, NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction * action;
 
         for (i = 0; i < NR_IRQS; i++) {
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %10u %c %s",
+ seq_printf(p, "%2d: %10u %c %s",
                         i, kstat.irqs[0][i],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action = action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 /* called by the assembler IRQ entry functions defined in irq.h
diff -urN S15-pre9/arch/i386/kernel/irq.c S15-pre9-current/arch/i386/kernel/irq.c
--- S15-pre9/arch/i386/kernel/irq.c Tue Nov 6 11:36:30 2001
+++ S15-pre9-current/arch/i386/kernel/irq.c Thu Nov 22 10:40:44 2001
@@ -32,6 +32,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/atomic.h>
 #include <asm/io.h>
@@ -131,57 +132,53 @@
  * Generic, controller-independent functions:
  */
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i, j;
         struct irqaction * action;
- char *p = buf;
 
- p += sprintf(p, " ");
+ seq_printf(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
- *p++ = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: ",i);
+ seq_printf(p, "%3d: ",i);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                                 kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- p += sprintf(p, " %14s", irq_desc[i].handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, " %14s", irq_desc[i].handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
- p += sprintf(p, ", %s", action->name);
- *p++ = '\n';
+ seq_printf(p, ", %s", action->name);
+ seq_putc(p, '\n');
         }
- p += sprintf(p, "NMI: ");
+ seq_printf(p, "NMI: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
- nmi_count(cpu_logical_map(j)));
- p += sprintf(p, "\n");
+ seq_printf(p, "%10u ", nmi_count(cpu_logical_map(j)));
+ seq_putc(p, '\n');
 #if CONFIG_X86_LOCAL_APIC
- p += sprintf(p, "LOC: ");
+ seq_printf(p, "LOC: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
- apic_timer_irqs[cpu_logical_map(j)]);
- p += sprintf(p, "\n");
+ seq_printf(p, "%10u ", apic_timer_irqs[cpu_logical_map(j)]);
+ seq_putc(p, '\n');
 #endif
- p += sprintf(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
- p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
 #endif
- return p - buf;
+ return 0;
 }
-
 
 /*
  * Global interrupt locks for SMP. Allow interrupts to come in on any
diff -urN S15-pre9/arch/ia64/kernel/irq.c S15-pre9-current/arch/ia64/kernel/irq.c
--- S15-pre9/arch/ia64/kernel/irq.c Thu Nov 22 03:56:13 2001
+++ S15-pre9-current/arch/ia64/kernel/irq.c Thu Nov 22 14:00:50 2001
@@ -32,6 +32,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/atomic.h>
 #include <asm/io.h>
@@ -131,55 +132,54 @@
  * Generic, controller-independent functions:
  */
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i, j;
         struct irqaction * action;
         irq_desc_t *idesc;
- char *p = buf;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
- *p++ = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 idesc = irq_desc(i);
                 action = idesc->action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: ",i);
+ seq_printf(p, "%3d: ",i);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                                 kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- p += sprintf(p, " %14s", idesc->handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, " %14s", idesc->handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
- p += sprintf(p, ", %s", action->name);
- *p++ = '\n';
+ seq_printf(p, ", %s", action->name);
+ seq_putc('\n');
         }
- p += sprintf(p, "NMI: ");
+ seq_puts(p, "NMI: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                         nmi_count(cpu_logical_map(j)));
- p += sprintf(p, "\n");
+ seq_putc(p, '\n');
 #if defined(CONFIG_SMP) && defined(CONFIG_X86)
- p += sprintf(p, "LOC: ");
+ seq_puts(p, "LOC: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                         apic_timer_irqs[cpu_logical_map(j)]);
- p += sprintf(p, "\n");
+ seq_putc(p, '\n');
 #endif
- p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
 #if defined(CONFIG_X86) && defined(CONFIG_X86_IO_APIC) && defined(APIC_MISMATCH_DEBUG)
- p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
- return p - buf;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/amiga/amiints.c S15-pre9-current/arch/m68k/amiga/amiints.c
--- S15-pre9/arch/m68k/amiga/amiints.c Fri Feb 16 20:28:32 2001
+++ S15-pre9-current/arch/m68k/amiga/amiints.c Thu Nov 22 14:11:00 2001
@@ -40,6 +40,7 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/irq.h>
@@ -53,7 +54,7 @@
                            unsigned long flags, const char *devname, void *dev_id);
 extern void cia_free_irq(struct ciabase *base, unsigned int irq, void *dev_id);
 extern void cia_init_IRQ(struct ciabase *base);
-extern int cia_get_irq_list(struct ciabase *base, char *buf);
+extern int cia_get_irq_list(struct ciabase *base, struct seq_file *p);
 
 /* irq node variables for amiga interrupt sources */
 static irq_node_t *ami_irq_list[AMI_STD_IRQS];
@@ -468,28 +469,28 @@
         ami_int4, ami_int5, ami_badint, ami_int7
 };
 
-int amiga_get_irq_list(char *buf)
+int show_amiga_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         irq_node_t *node;
 
         for (i = 0; i < AMI_STD_IRQS; i++) {
                 if (!(node = ami_irq_list[i]))
                         continue;
- len += sprintf(buf+len, "ami %2d: %10u ", i,
+ seq_printf(p, "ami %2d: %10u ", i,
                                kstat.irqs[0][SYS_IRQS + i]);
                 do {
                         if (node->flags & SA_INTERRUPT)
- len += sprintf(buf+len, "F ");
+ seq_puts(p, "F ");
                         else
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", node->devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", node->devname);
                         if ((node = node->next))
- len += sprintf(buf+len, " ");
+ seq_puts(p, " ");
                 } while (node);
         }
 
- len += cia_get_irq_list(&ciaa_base, buf+len);
- len += cia_get_irq_list(&ciab_base, buf+len);
- return len;
+ cia_get_irq_list(&ciaa_base, p);
+ cia_get_irq_list(&ciab_base, p);
+ return 0;
 }
diff -urN S15-pre9/arch/m68k/amiga/cia.c S15-pre9-current/arch/m68k/amiga/cia.c
--- S15-pre9/arch/m68k/amiga/cia.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/amiga/cia.c Thu Nov 22 14:11:09 2001
@@ -16,6 +16,7 @@
 #include <linux/errno.h>
 #include <linux/kernel_stat.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/amigahw.h>
@@ -158,16 +159,16 @@
         custom.intena = IF_SETCLR | base->int_mask;
 }
 
-int cia_get_irq_list(struct ciabase *base, char *buf)
+int cia_get_irq_list(struct ciabase *base, struct seq_file *p)
 {
- int i, j, len = 0;
+ int i, j;
 
         j = base->cia_irq;
         for (i = 0; i < CIA_IRQS; i++) {
- len += sprintf(buf+len, "cia %2d: %10d ", j + i,
+ seq_printf(p, "cia %2d: %10d ", j + i,
                                kstat.irqs[0][SYS_IRQS + j + i]);
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", base->irq_list[i].devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", base->irq_list[i].devname);
         }
- return len;
+ return 0;
 }
diff -urN S15-pre9/arch/m68k/amiga/config.c S15-pre9-current/arch/m68k/amiga/config.c
--- S15-pre9/arch/m68k/amiga/config.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/m68k/amiga/config.c Thu Nov 22 11:39:29 2001
@@ -86,7 +86,7 @@
 extern void amiga_disable_irq (unsigned int);
 static void amiga_get_model(char *model);
 static int amiga_get_hardware_list(char *buffer);
-extern int amiga_get_irq_list (char *);
+extern int show_amiga_interrupts (struct seq_file *, void *);
 /* amiga specific timer functions */
 static unsigned long amiga_gettimeoffset (void);
 static void a3000_gettod (int *, int *, int *, int *, int *, int *);
@@ -403,7 +403,7 @@
   disable_irq = amiga_disable_irq;
   mach_get_model = amiga_get_model;
   mach_get_hardware_list = amiga_get_hardware_list;
- mach_get_irq_list = amiga_get_irq_list;
+ mach_get_irq_list = show_amiga_interrupts;
   mach_gettimeoffset = amiga_gettimeoffset;
   if (AMIGAHW_PRESENT(A3000_CLK)){
     mach_gettod = a3000_gettod;
diff -urN S15-pre9/arch/m68k/apollo/config.c S15-pre9-current/arch/m68k/apollo/config.c
--- S15-pre9/arch/m68k/apollo/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/apollo/config.c Thu Nov 22 12:26:43 2001
@@ -31,7 +31,7 @@
 extern void dn_free_irq(unsigned int irq, void *dev_id);
 extern void dn_enable_irq(unsigned int);
 extern void dn_disable_irq(unsigned int);
-extern int dn_get_irq_list(char *);
+extern int show_dn_interrupts(struct seq_file *, void *);
 extern unsigned long dn_gettimeoffset(void);
 extern void dn_gettod(int *, int *, int *, int *, int *, int *);
 extern int dn_dummy_hwclk(int, struct hwclk_time *);
@@ -173,7 +173,7 @@
         mach_free_irq = dn_free_irq;
         enable_irq = dn_enable_irq;
         disable_irq = dn_disable_irq;
- mach_get_irq_list = dn_get_irq_list;
+ mach_get_irq_list = show_dn_interrupts;
         mach_gettimeoffset = dn_gettimeoffset;
         mach_gettod = dn_gettod; /* */
         mach_max_dma_address = 0xffffffff;
diff -urN S15-pre9/arch/m68k/apollo/dn_ints.c S15-pre9-current/arch/m68k/apollo/dn_ints.c
--- S15-pre9/arch/m68k/apollo/dn_ints.c Tue Mar 13 00:34:06 2001
+++ S15-pre9-current/arch/m68k/apollo/dn_ints.c Thu Nov 22 12:27:07 2001
@@ -104,7 +104,7 @@
 
 }
 
-int dn_get_irq_list(char *buf) {
+int show_dn_interrupts(struct seq_file *p, void *v) {
 
   printk("dn get irq list\n");
 
diff -urN S15-pre9/arch/m68k/atari/ataints.c S15-pre9-current/arch/m68k/atari/ataints.c
--- S15-pre9/arch/m68k/atari/ataints.c Fri Feb 16 16:48:09 2001
+++ S15-pre9-current/arch/m68k/atari/ataints.c Thu Nov 22 14:11:21 2001
@@ -40,6 +40,7 @@
 #include <linux/ptrace.h>
 #include <linux/kernel_stat.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/traps.h>
@@ -609,37 +610,37 @@
 }
 
 
-int atari_get_irq_list(char *buf)
+int show_atari_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         for (i = 0; i < NUM_INT_SOURCES; ++i) {
                 if (vectors[IRQ_SOURCE_TO_VECTOR(i)] == bad_interrupt)
                         continue;
                 if (i < STMFP_SOURCE_BASE)
- len += sprintf(buf+len, "auto %2d: %10u ",
+ seq_printf(p,, "auto %2d: %10u ",
                                        i, kstat.irqs[0][i]);
                 else
- len += sprintf(buf+len, "vec $%02x: %10u ",
+ seq_printf(p,, "vec $%02x: %10u ",
                                        IRQ_SOURCE_TO_VECTOR(i),
                                        kstat.irqs[0][i]);
 
                 if (irq_handler[i].handler != atari_call_irq_list) {
- len += sprintf(buf+len, "%s\n", irq_param[i].devname);
+ seq_printf(p,, "%s\n", irq_param[i].devname);
                 }
                 else {
                         irq_node_t *p;
                         for( p = (irq_node_t *)irq_handler[i].dev_id; p; p = p->next ) {
- len += sprintf(buf+len, "%s\n", p->devname);
+ seq_printf(p,, "%s\n", p->devname);
                                 if (p->next)
- len += sprintf( buf+len, " " );
+ seq_puts(p,, " " );
                         }
                 }
         }
         if (num_spurious)
- len += sprintf(buf+len, "spurio.: %10u\n", num_spurious);
+ seq_printf(p, "spurio.: %10u\n", num_spurious);
         
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/atari/config.c S15-pre9-current/arch/m68k/atari/config.c
--- S15-pre9/arch/m68k/atari/config.c Fri Feb 16 20:28:32 2001
+++ S15-pre9-current/arch/m68k/atari/config.c Thu Nov 22 12:15:26 2001
@@ -70,7 +70,7 @@
 extern void atari_free_irq (unsigned int irq, void *dev_id);
 extern void atari_enable_irq (unsigned int);
 extern void atari_disable_irq (unsigned int);
-extern int atari_get_irq_list (char *buf);
+extern int show_atari_interrupts (struct seq_file *, void *);
 extern void atari_mksound( unsigned int count, unsigned int ticks );
 #ifdef CONFIG_HEARTBEAT
 static void atari_heartbeat( int on );
@@ -265,7 +265,7 @@
     disable_irq = atari_disable_irq;
     mach_get_model = atari_get_model;
     mach_get_hardware_list = atari_get_hardware_list;
- mach_get_irq_list = atari_get_irq_list;
+ mach_get_irq_list = show_atari_interrupts;
     mach_gettimeoffset = atari_gettimeoffset;
     mach_reset = atari_reset;
 #ifdef CONFIG_ATARI_FLOPPY
diff -urN S15-pre9/arch/m68k/bvme6000/bvmeints.c S15-pre9-current/arch/m68k/bvme6000/bvmeints.c
--- S15-pre9/arch/m68k/bvme6000/bvmeints.c Thu Feb 15 23:15:53 2001
+++ S15-pre9-current/arch/m68k/bvme6000/bvmeints.c Thu Nov 22 14:11:32 2001
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
@@ -127,17 +128,17 @@
         }
 }
 
-int bvme6000_get_irq_list (char *buf)
+int show_bvme6000_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         for (i = 0; i < 256; i++) {
                 if (irq_tab[i].count)
- len += sprintf (buf+len, "Vec 0x%02x: %8d %s\n",
+ seq_printf(p, "Vec 0x%02x: %8d %s\n",
                             i, irq_tab[i].count,
                             irq_tab[i].devname ? irq_tab[i].devname : "free");
         }
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/bvme6000/config.c S15-pre9-current/arch/m68k/bvme6000/config.c
--- S15-pre9/arch/m68k/bvme6000/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/bvme6000/config.c Thu Nov 22 12:14:02 2001
@@ -36,7 +36,7 @@
 extern void bvme6000_process_int (int level, struct pt_regs *regs);
 extern void bvme6000_init_IRQ (void);
 extern void bvme6000_free_irq (unsigned int, void *);
-extern int bvme6000_get_irq_list (char *);
+extern int show_bvme6000_interrupts(struct seq_file *, void *);
 extern void bvme6000_enable_irq (unsigned int);
 extern void bvme6000_disable_irq (unsigned int);
 static void bvme6000_get_model(char *model);
@@ -145,7 +145,7 @@
     mach_reset = bvme6000_reset;
     mach_free_irq = bvme6000_free_irq;
     mach_process_int = bvme6000_process_int;
- mach_get_irq_list = bvme6000_get_irq_list;
+ mach_get_irq_list = show_bvme6000_interrupts;
     mach_request_irq = bvme6000_request_irq;
     enable_irq = bvme6000_enable_irq;
     disable_irq = bvme6000_disable_irq;
diff -urN S15-pre9/arch/m68k/hp300/config.c S15-pre9-current/arch/m68k/hp300/config.c
--- S15-pre9/arch/m68k/hp300/config.c Fri Feb 16 01:52:42 2001
+++ S15-pre9-current/arch/m68k/hp300/config.c Thu Nov 22 12:10:50 2001
@@ -25,7 +25,7 @@
 
 extern void hp300_reset(void);
 extern void (*hp300_default_handler[])(int, void *, struct pt_regs *);
-extern int hp300_get_irq_list(char *buf);
+extern int show_hp300_interrupts(struct seq_file *, void *);
 
 #ifdef CONFIG_VT
 extern int hp300_keyb_init(void);
@@ -70,7 +70,7 @@
   mach_request_irq = hp300_request_irq;
   mach_free_irq = hp300_free_irq;
   mach_get_model = hp300_get_model;
- mach_get_irq_list = hp300_get_irq_list;
+ mach_get_irq_list = show_hp300_interrupts;
   mach_gettimeoffset = hp300_gettimeoffset;
   mach_default_handler = &hp300_default_handler;
 #if 0
diff -urN S15-pre9/arch/m68k/hp300/ints.c S15-pre9-current/arch/m68k/hp300/ints.c
--- S15-pre9/arch/m68k/hp300/ints.c Fri Feb 16 02:01:57 2001
+++ S15-pre9-current/arch/m68k/hp300/ints.c Thu Nov 22 12:10:06 2001
@@ -148,7 +148,7 @@
         spin_unlock_irqrestore(&irqlist_lock, flags);
 }
 
-int hp300_get_irq_list(char *buf)
+int show_hp300_interrupts(struct seq_file *p, void *v)
 {
         return 0;
 }
diff -urN S15-pre9/arch/m68k/kernel/ints.c S15-pre9-current/arch/m68k/kernel/ints.c
--- S15-pre9/arch/m68k/kernel/ints.c Tue Mar 13 00:34:10 2001
+++ S15-pre9-current/arch/m68k/kernel/ints.c Thu Nov 22 11:35:35 2001
@@ -242,22 +242,22 @@
         }
 }
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         /* autovector interrupts */
         if (mach_default_handler) {
                 for (i = 0; i < SYS_IRQS; i++) {
- len += sprintf(buf+len, "auto %2d: %10u ", i,
+ seq_printf(p, "auto %2d: %10u ", i,
                                        i ? kstat.irqs[0][i] : num_spurious);
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", irq_list[i].devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", irq_list[i].devname);
                 }
         }
 
- len += mach_get_irq_list(buf+len);
- return len;
+ mach_get_irq_list(p, v);
+ return 0;
 }
 
 void init_irq_proc(void)
diff -urN S15-pre9/arch/m68k/kernel/setup.c S15-pre9-current/arch/m68k/kernel/setup.c
--- S15-pre9/arch/m68k/kernel/setup.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/kernel/setup.c Thu Nov 22 11:39:53 2001
@@ -80,7 +80,7 @@
 void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
 void (*mach_get_model) (char *model) = NULL;
 int (*mach_get_hardware_list) (char *buffer) = NULL;
-int (*mach_get_irq_list) (char *) = NULL;
+int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
 void (*mach_process_int) (int, struct pt_regs *) = NULL;
 /* machine dependent timer functions */
 unsigned long (*mach_gettimeoffset) (void);
diff -urN S15-pre9/arch/m68k/mac/config.c S15-pre9-current/arch/m68k/mac/config.c
--- S15-pre9/arch/m68k/mac/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/mac/config.c Thu Nov 22 11:56:12 2001
@@ -66,7 +66,7 @@
 extern unsigned long mac_gettimeoffset (void);
 extern int mac_hwclk (int, struct hwclk_time *);
 extern int mac_set_clock_mmss (unsigned long);
-extern int mac_get_irq_list(char *);
+extern int show_mac_interrupts(struct seq_file *, void *);
 extern void iop_preinit(void);
 extern void iop_init(void);
 extern void via_init(void);
@@ -241,7 +241,7 @@
         disable_irq = mac_disable_irq;
         mach_get_model = mac_get_model;
         mach_default_handler = &mac_handlers;
- mach_get_irq_list = mac_get_irq_list;
+ mach_get_irq_list = show_mac_interrupts;
         mach_gettimeoffset = mac_gettimeoffset;
         mach_gettod = mac_gettod;
         mach_hwclk = mac_hwclk;
diff -urN S15-pre9/arch/m68k/mac/macints.c S15-pre9-current/arch/m68k/mac/macints.c
--- S15-pre9/arch/m68k/mac/macints.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/mac/macints.c Thu Nov 22 14:11:45 2001
@@ -120,6 +120,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/interrupt.h> /* for intr_count */
 #include <linux/delay.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/irq.h>
@@ -576,9 +577,9 @@
  * displayed for us as autovector irq 0.
  */
 
-int mac_get_irq_list (char *buf)
+int show_mac_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         irq_node_t *node;
         char *base;
 
@@ -618,25 +619,24 @@
                         case 8: base = "bbn";
                                 break;
                 }
- len += sprintf(buf+len, "%4s %2d: %10u ",
- base, i, kstat.irqs[0][i]);
+ seq_printf(p, "%4s %2d: %10u ", base, i, kstat.irqs[0][i]);
 
                 do {
                         if (node->flags & IRQ_FLG_FAST) {
- len += sprintf(buf+len, "F ");
+ seq_puts(p, "F ");
                         } else if (node->flags & IRQ_FLG_SLOW) {
- len += sprintf(buf+len, "S ");
+ seq_puts(p, "S ");
                         } else {
- len += sprintf(buf+len, " ");
+ seq_puts(p, " ");
                         }
- len += sprintf(buf+len, "%s\n", node->devname);
+ seq_printf(p, "%s\n", node->devname);
                         if ((node = node->next)) {
- len += sprintf(buf+len, " ");
+ seq_puts(p, " ");
                         }
                 } while(node);
 
         }
- return len;
+ return 0;
 }
 
 void mac_default_handler(int irq, void *dev_id, struct pt_regs *regs)
diff -urN S15-pre9/arch/m68k/mvme147/147ints.c S15-pre9-current/arch/m68k/mvme147/147ints.c
--- S15-pre9/arch/m68k/mvme147/147ints.c Thu Feb 15 23:15:54 2001
+++ S15-pre9-current/arch/m68k/mvme147/147ints.c Thu Nov 22 14:11:53 2001
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
@@ -112,17 +113,17 @@
         }
 }
 
-int mvme147_get_irq_list (char *buf)
+int show_mvme147_interrupts (struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         for (i = 0; i < 256; i++) {
                 if (irq_tab[i].count)
- len += sprintf (buf+len, "Vec 0x%02x: %8d %s\n",
+ seq_printf(p, "Vec 0x%02x: %8d %s\n",
                             i, irq_tab[i].count,
                             irq_tab[i].devname ? irq_tab[i].devname : "free");
         }
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/mvme147/config.c S15-pre9-current/arch/m68k/mvme147/config.c
--- S15-pre9/arch/m68k/mvme147/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/mvme147/config.c Thu Nov 22 11:51:51 2001
@@ -36,7 +36,7 @@
 extern void mvme147_process_int (int level, struct pt_regs *regs);
 extern void mvme147_init_IRQ (void);
 extern void mvme147_free_irq (unsigned int, void *);
-extern int mvme147_get_irq_list (char *);
+extern int show_mvme147_interrupts (struct seq_file *, void *);
 extern void mvme147_enable_irq (unsigned int);
 extern void mvme147_disable_irq (unsigned int);
 static void mvme147_get_model(char *model);
@@ -113,7 +113,7 @@
         mach_reset = mvme147_reset;
         mach_free_irq = mvme147_free_irq;
         mach_process_int = mvme147_process_int;
- mach_get_irq_list = mvme147_get_irq_list;
+ mach_get_irq_list = show_mvme147_interrupts;
         mach_request_irq = mvme147_request_irq;
         enable_irq = mvme147_enable_irq;
         disable_irq = mvme147_disable_irq;
diff -urN S15-pre9/arch/m68k/mvme16x/16xints.c S15-pre9-current/arch/m68k/mvme16x/16xints.c
--- S15-pre9/arch/m68k/mvme16x/16xints.c Thu Feb 15 23:15:54 2001
+++ S15-pre9-current/arch/m68k/mvme16x/16xints.c Thu Nov 22 14:12:01 2001
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/ptrace.h>
@@ -114,17 +115,17 @@
         }
 }
 
-int mvme16x_get_irq_list (char *buf)
+int show_mvme16x_interrupts (struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         for (i = 0; i < 192; i++) {
                 if (irq_tab[i].count)
- len += sprintf (buf+len, "Vec 0x%02x: %8d %s\n",
+ seq_printf(p, "Vec 0x%02x: %8d %s\n",
                             i+64, irq_tab[i].count,
                             irq_tab[i].devname ? irq_tab[i].devname : "free");
         }
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/mvme16x/config.c S15-pre9-current/arch/m68k/mvme16x/config.c
--- S15-pre9/arch/m68k/mvme16x/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/mvme16x/config.c Thu Nov 22 11:47:34 2001
@@ -40,7 +40,7 @@
 extern void mvme16x_process_int (int level, struct pt_regs *regs);
 extern void mvme16x_init_IRQ (void);
 extern void mvme16x_free_irq (unsigned int, void *);
-extern int mvme16x_get_irq_list (char *);
+extern int show_mvme16x_interrupts (struct seq_file *, void *);
 extern void mvme16x_enable_irq (unsigned int);
 extern void mvme16x_disable_irq (unsigned int);
 static void mvme16x_get_model(char *model);
@@ -156,7 +156,7 @@
     mach_reset = mvme16x_reset;
     mach_free_irq = mvme16x_free_irq;
     mach_process_int = mvme16x_process_int;
- mach_get_irq_list = mvme16x_get_irq_list;
+ mach_get_irq_list = show_mvme16x_interrupts;
     mach_request_irq = mvme16x_request_irq;
     enable_irq = mvme16x_enable_irq;
     disable_irq = mvme16x_disable_irq;
diff -urN S15-pre9/arch/m68k/q40/config.c S15-pre9-current/arch/m68k/q40/config.c
--- S15-pre9/arch/m68k/q40/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/q40/config.c Thu Nov 22 11:44:57 2001
@@ -45,7 +45,7 @@
 extern void (*q40_sys_default_handler[]) (int, void *, struct pt_regs *); /* added just for debugging */
 extern void q40_init_IRQ (void);
 extern void q40_free_irq (unsigned int, void *);
-extern int q40_get_irq_list (char *);
+extern int show_q40_interrupts (struct seq_file *, void *);
 extern void q40_enable_irq (unsigned int);
 extern void q40_disable_irq (unsigned int);
 static void q40_get_model(char *model);
@@ -236,7 +236,7 @@
     mach_reset = q40_reset;
     mach_free_irq = q40_free_irq;
     mach_process_int = q40_process_int;
- mach_get_irq_list = q40_get_irq_list;
+ mach_get_irq_list = show_q40_interrupts;
     mach_request_irq = q40_request_irq;
     enable_irq = q40_enable_irq;
     disable_irq = q40_disable_irq;
diff -urN S15-pre9/arch/m68k/q40/q40ints.c S15-pre9-current/arch/m68k/q40/q40ints.c
--- S15-pre9/arch/m68k/q40/q40ints.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/q40/q40ints.c Thu Nov 22 14:12:09 2001
@@ -17,6 +17,7 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/sched.h>
+#include <linux/seq_file.h>
 
 #include <asm/rtc.h>
 #include <asm/ptrace.h>
@@ -431,21 +432,20 @@
           }
 }
 
-int q40_get_irq_list (char *buf)
+int show_q40_interrupts (struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
- for (i = 0; i <= Q40_IRQ_MAX; i++)
- {
+ for (i = 0; i <= Q40_IRQ_MAX; i++) {
                 if (irq_tab[i].count)
- len += sprintf (buf+len, "%sIRQ %02d: %8d %s%s\n",
+ seq_printf(p, "%sIRQ %02d: %8d %s%s\n",
                               (i<=15) ? "ISA-" : " " ,
                             i, irq_tab[i].count,
                             irq_tab[i].devname[0] ? irq_tab[i].devname : "?",
                             irq_tab[i].handler == q40_defhand ?
                                         " (now unassigned)" : "");
         }
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/m68k/sun3/config.c S15-pre9-current/arch/m68k/sun3/config.c
--- S15-pre9/arch/m68k/sun3/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/sun3/config.c Thu Nov 22 11:41:29 2001
@@ -36,7 +36,7 @@
 char sun3_reserved_pmeg[SUN3_PMEGS_NUM];
 
 extern unsigned long sun3_gettimeoffset(void);
-extern int sun3_get_irq_list (char *);
+extern int show_sun3_interrupts (char *);
 extern void sun3_sched_init(void (*handler)(int, void *, struct pt_regs *));
 extern void sun3_get_model (char* model);
 extern void idprom_init (void);
@@ -145,7 +145,7 @@
         enable_irq = sun3_enable_irq;
         disable_irq = sun3_disable_irq;
         mach_process_int = sun3_process_int;
- mach_get_irq_list = sun3_get_irq_list;
+ mach_get_irq_list = show_sun3_interrupts;
         mach_gettod = sun3_gettod;
         mach_reset = sun3_reboot;
         mach_gettimeoffset = sun3_gettimeoffset;
diff -urN S15-pre9/arch/m68k/sun3/sun3ints.c S15-pre9-current/arch/m68k/sun3/sun3ints.c
--- S15-pre9/arch/m68k/sun3/sun3ints.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/sun3/sun3ints.c Thu Nov 22 14:12:17 2001
@@ -15,6 +15,7 @@
 #include <asm/intersil.h>
 #include <asm/oplib.h>
 #include <asm/sun3ints.h>
+#include <linux/seq_file.h>
 
 extern void sun3_leds (unsigned char);
 
@@ -62,7 +63,7 @@
         *sun3_intreg |= (1<<irq);
 }
 
-int sun3_get_irq_list(char *buf)
+int show_sun3_interrupts(struct seq_file *p, void *v)
 {
         return 0;
 }
diff -urN S15-pre9/arch/m68k/sun3x/config.c S15-pre9-current/arch/m68k/sun3x/config.c
--- S15-pre9/arch/m68k/sun3x/config.c Tue Jul 3 21:09:05 2001
+++ S15-pre9-current/arch/m68k/sun3x/config.c Thu Nov 22 11:41:37 2001
@@ -58,7 +58,7 @@
 
         sun3x_prom_init();
 
- mach_get_irq_list = sun3_get_irq_list;
+ mach_get_irq_list = show_sun3_interrupts;
         mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */
 
         mach_keyb_init = sun3x_keyb_init;
diff -urN S15-pre9/arch/mips/baget/irq.c S15-pre9-current/arch/mips/baget/irq.c
--- S15-pre9/arch/mips/baget/irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/baget/irq.c Thu Nov 22 14:12:37 2001
@@ -17,6 +17,7 @@
 #include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/delay.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -141,27 +142,27 @@
  */
 static struct irqaction *irq_action[BAGET_IRQ_NR] = { NULL, };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction * action;
 
         for (i = 0 ; i < BAGET_IRQ_NR ; i++) {
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         i, kstat.irqs[0][i],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/mips/dec/irq.c S15-pre9-current/arch/mips/dec/irq.c
--- S15-pre9/arch/mips/dec/irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/dec/irq.c Thu Nov 22 14:12:46 2001
@@ -15,6 +15,7 @@
 #include <linux/timex.h>
 #include <linux/slab.h>
 #include <linux/random.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -92,27 +93,27 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
- struct irqaction *action;
+ int i;
+ struct irqaction *action;
 
- for (i = 0; i < 32; i++) {
- action = irq_action[i];
- if (!action)
- continue;
- len += sprintf(buf + len, "%2d: %8d %c %s",
- i, kstat.irqs[0][i],
- (action->flags & SA_INTERRUPT) ? '+' : ' ',
- action->name);
- for (action = action->next; action; action = action->next) {
- len += sprintf(buf + len, ",%s %s",
- (action->flags & SA_INTERRUPT) ? " +" : "",
- action->name);
+ for (i = 0; i < 32; i++) {
+ action = irq_action[i];
+ if (!action)
+ continue;
+ seq_printf(p, "%2d: %8d %c %s",
+ i, kstat.irqs[0][i],
+ (action->flags & SA_INTERRUPT) ? '+' : ' ',
+ action->name);
+ for (action = action->next; action; action = action->next) {
+ seq_printf(p, ",%s %s",
+ (action->flags & SA_INTERRUPT) ? " +" : "",
+ action->name);
+ }
+ seq_putc(p, '\n');
         }
- len += sprintf(buf + len, "\n");
- }
- return len;
+ return 0;
 }
 
 /*
diff -urN S15-pre9/arch/mips/ite-boards/generic/irq.c S15-pre9-current/arch/mips/ite-boards/generic/irq.c
--- S15-pre9/arch/mips/ite-boards/generic/irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/ite-boards/generic/irq.c Thu Nov 22 14:12:53 2001
@@ -46,6 +46,7 @@
 #include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/serial_reg.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -217,34 +218,34 @@
 };
 
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0, j;
+ int i, j;
         struct irqaction * action;
 
- len += sprintf(buf+len, " ");
+ seq_printf(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- len += sprintf(buf+len, "CPU%d ",j);
- *(char *)(buf+len++) = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 action = irq_desc[i].action;
                 if ( !action || !action->handler )
                         continue;
- len += sprintf(buf+len, "%3d: ", i);
- len += sprintf(buf+len, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%3d: ", i);
+ seq_printf(p, "%10u ", kstat_irqs(i));
                 if ( irq_desc[i].handler )
- len += sprintf(buf+len, " %s ", irq_desc[i].handler->typename );
+ seq_printf(p, " %s ", irq_desc[i].handler->typename );
                 else
- len += sprintf(buf+len, " None ");
- len += sprintf(buf+len, " %s",action->name);
+ seq_puts(p, " None ");
+ seq_printf(p, " %s",action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ", %s", action->name);
+ seq_printf(p, ", %s", action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- len += sprintf(buf+len, "BAD: %10lu\n", spurious_count);
- return len;
+ seq_printf(p, "BAD: %10lu\n", spurious_count);
+ return 0;
 }
 
 asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
diff -urN S15-pre9/arch/mips/kernel/irq.c S15-pre9-current/arch/mips/kernel/irq.c
--- S15-pre9/arch/mips/kernel/irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/kernel/irq.c Thu Nov 22 14:13:20 2001
@@ -17,6 +17,7 @@
 #include <linux/mm.h>
 #include <linux/random.h>
 #include <linux/sched.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 
@@ -69,32 +70,31 @@
  * Generic, controller-independent functions:
  */
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         struct irqaction * action;
- char *p = buf;
         int i;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
         for (i=0; i < 1 /*smp_num_cpus*/; i++)
- p += sprintf(p, "CPU%d ", i);
- *p++ = '\n';
+ seq_printf(p, "CPU%d ", i);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: ",i);
- p += sprintf(p, "%10u ", kstat_irqs(i));
- p += sprintf(p, " %14s", irq_desc[i].handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, "%3d: ",i);
+ seq_printf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, " %14s", irq_desc[i].handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
- p += sprintf(p, ", %s", action->name);
- *p++ = '\n';
+ seq_printf(p, ", %s", action->name);
+ seq_putc(p, '\n');
         }
- p += sprintf(p, "ERR: %10lu\n", irq_err_count);
- return p - buf;
+ seq_printf(p, "ERR: %10lu\n", irq_err_count);
+ return 0;
 }
 
 /*
diff -urN S15-pre9/arch/mips/kernel/old-irq.c S15-pre9-current/arch/mips/kernel/old-irq.c
--- S15-pre9/arch/mips/kernel/old-irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/kernel/old-irq.c Thu Nov 22 14:13:26 2001
@@ -24,6 +24,7 @@
 #include <linux/timex.h>
 #include <linux/slab.h>
 #include <linux/random.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -123,27 +124,27 @@
         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction * action;
 
         for (i = 0 ; i < 32 ; i++) {
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         i, kstat.irqs[0][i],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 static inline void i8259_mask_and_ack_irq(int irq)
diff -urN S15-pre9/arch/mips/mips-boards/atlas/atlas_int.c S15-pre9-current/arch/mips/mips-boards/atlas/atlas_int.c
--- S15-pre9/arch/mips/mips-boards/atlas/atlas_int.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/mips-boards/atlas/atlas_int.c Thu Nov 22 14:13:33 2001
@@ -29,6 +29,7 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/kernel_stat.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/mips-boards/atlas.h>
@@ -93,9 +94,9 @@
         NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         int num = 0;
         struct irqaction *action;
 
@@ -103,18 +104,18 @@
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [hw0]\n");
+ seq_printf(p, " [hw0]\n");
         }
- return len;
+ return 0;
 }
 
 int request_irq(unsigned int irq,
diff -urN S15-pre9/arch/mips/philips/nino/irq.c S15-pre9-current/arch/mips/philips/nino/irq.c
--- S15-pre9/arch/mips/philips/nino/irq.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips/philips/nino/irq.c Thu Nov 22 14:13:42 2001
@@ -23,6 +23,7 @@
 #include <linux/timex.h>
 #include <linux/slab.h>
 #include <linux/random.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -114,27 +115,27 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
     struct irqaction *action;
 
     for (i = 0; i < NR_IRQS; i++) {
         action = irq_action[i];
         if (!action)
             continue;
- len += sprintf(buf + len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                        i, kstat.irqs[0][i],
                        (action->flags & SA_INTERRUPT) ? '+' : ' ',
                        action->name);
         for (action = action->next; action; action = action->next) {
- len += sprintf(buf + len, ",%s %s",
+ seq_printf(p, ",%s %s",
                            (action->flags & SA_INTERRUPT) ? " +" : "",
                            action->name);
         }
- len += sprintf(buf + len, "\n");
+ seq_putc(p, '\n');
     }
- return len;
+ return 0;
 }
 
 atomic_t __mips_bh_counter;
diff -urN S15-pre9/arch/mips64/mips-boards/atlas/atlas_int.c S15-pre9-current/arch/mips64/mips-boards/atlas/atlas_int.c
--- S15-pre9/arch/mips64/mips-boards/atlas/atlas_int.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips64/mips-boards/atlas/atlas_int.c Thu Nov 22 14:13:49 2001
@@ -29,6 +29,7 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/kernel_stat.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/mips-boards/atlas.h>
@@ -89,9 +90,9 @@
         NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         int num = 0;
         struct irqaction *action;
 
@@ -99,18 +100,18 @@
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [hw0]\n");
+ seq_puts(p, " [hw0]\n");
         }
- return len;
+ return 0;
 }
 
 int request_irq(unsigned int irq,
diff -urN S15-pre9/arch/mips64/mips-boards/malta/malta_int.c S15-pre9-current/arch/mips64/mips-boards/malta/malta_int.c
--- S15-pre9/arch/mips64/mips-boards/malta/malta_int.c Sun Sep 23 16:11:56 2001
+++ S15-pre9-current/arch/mips64/mips-boards/malta/malta_int.c Thu Nov 22 14:13:55 2001
@@ -32,6 +32,7 @@
 #include <linux/interrupt.h>
 #include <linux/kernel_stat.h>
 #include <linux/random.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -119,9 +120,9 @@
 }
 
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         int num = 0;
         struct irqaction *action;
 
@@ -129,33 +130,33 @@
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [on-chip]\n");
+ seq_puts(p, " [on-chip]\n");
         }
         for (i = 0; i < MALTAINT_END; i++, num++) {
                 action = hw0_irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [hw0]\n");
+ seq_puts(p, " [hw0]\n");
         }
- return len;
+ return 0;
 }
 
 int request_irq(unsigned int irq,
diff -urN S15-pre9/arch/mips64/sgi-ip22/ip22-int.c S15-pre9-current/arch/mips64/sgi-ip22/ip22-int.c
--- S15-pre9/arch/mips64/sgi-ip22/ip22-int.c Sun Sep 23 16:11:57 2001
+++ S15-pre9-current/arch/mips64/sgi-ip22/ip22-int.c Thu Nov 22 14:14:04 2001
@@ -8,6 +8,7 @@
  */
 #include <linux/config.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <linux/errno.h>
 #include <linux/kernel_stat.h>
@@ -231,9 +232,9 @@
         NULL, NULL, NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         int num = 0;
         struct irqaction * action;
 
@@ -241,33 +242,33 @@
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [on-chip]\n");
+ seq_puts(p, " [on-chip]\n");
         }
         for (i = 0 ; i < 24 ; i++, num++) {
                 action = local_irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s",
+ seq_printf(p, "%2d: %8d %c %s",
                         num, kstat.irqs[0][num],
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, " [local]\n");
+ seq_puts(p, " [local]\n");
         }
- return len;
+ return 0;
 }
 
 /*
diff -urN S15-pre9/arch/mips64/sgi-ip27/ip27-irq.c S15-pre9-current/arch/mips64/sgi-ip27/ip27-irq.c
--- S15-pre9/arch/mips64/sgi-ip27/ip27-irq.c Sun Sep 23 16:11:57 2001
+++ S15-pre9-current/arch/mips64/sgi-ip27/ip27-irq.c Thu Nov 22 14:14:10 2001
@@ -20,6 +20,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/delay.h>
 #include <linux/irq.h>
+#include <linux/seq_file.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -136,27 +137,27 @@
 /* This is stupid for an Origin which can have thousands of IRQs ... */
 static struct irqaction *irq_action[NR_IRQS];
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction * action;
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 action = irq_action[i];
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%2d: %8d %c %s", i, kstat.irqs[0][i],
+ seq_printf(p, "%2d: %8d %c %s", i, kstat.irqs[0][i],
                                (action->flags & SA_INTERRUPT) ? '+' : ' ',
                                action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                        (action->flags & SA_INTERRUPT)
                                         ? " +" : "",
                                         action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 /*
diff -urN S15-pre9/arch/parisc/kernel/irq.c S15-pre9-current/arch/parisc/kernel/irq.c
--- S15-pre9/arch/parisc/kernel/irq.c Fri Feb 16 22:54:22 2001
+++ S15-pre9-current/arch/parisc/kernel/irq.c Thu Nov 22 14:14:16 2001
@@ -39,6 +39,7 @@
 #include <linux/random.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/seq_file.h>
 
 #include <asm/cache.h>
 
@@ -160,19 +161,18 @@
                 BUG();
 }
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_PROC_FS
- char *p = buf;
         int i, j;
         int regnr, irq_no;
         struct irq_region *region;
         struct irqaction *action, *mainaction;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
- *p++ = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
             region = irq_region[regnr];
@@ -188,40 +188,34 @@
                 
                 irq_no = IRQ_FROM_REGION(regnr) + i;
                 
- p += sprintf(p, "%3d: ", irq_no);
+ seq_printf(p, "%3d: ", irq_no);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(irq_no));
+ seq_printf(p, "%10u ", kstat_irqs(irq_no));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                             kstat.irqs[cpu_logical_map(j)][irq_no]);
 #endif
- p += sprintf(p, " %14s",
+ seq_printf(p, " %14s",
                             region->data.name ? region->data.name : "N/A");
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
- p += sprintf(p, ", %s", action->name);
- *p++ = '\n';
+ seq_printf(p, ", %s", action->name);
+ seq_putc(p, '\n');
             }
         }
 
- p += sprintf(p, "\n");
+ seq_putc(p, '\n');
 #if CONFIG_SMP
- p += sprintf(p, "LOC: ");
+ seq_puts(p, "LOC: ");
         for (j = 0; j < smp_num_cpus; j++)
- p += sprintf(p, "%10u ",
+ seq_printf(p, "%10u ",
                         apic_timer_irqs[cpu_logical_map(j)]);
- p += sprintf(p, "\n");
+ seq_putc(p, '\n');
 #endif
-
- return p - buf;
-
-#else /* CONFIG_PROC_FS */
-
- return 0;
-
 #endif /* CONFIG_PROC_FS */
+ return 0;
 }
 
 
diff -urN S15-pre9/arch/ppc/amiga/amiints.c S15-pre9-current/arch/ppc/amiga/amiints.c
--- S15-pre9/arch/ppc/amiga/amiints.c Thu May 24 18:25:07 2001
+++ S15-pre9-current/arch/ppc/amiga/amiints.c Thu Nov 22 14:14:26 2001
@@ -44,6 +44,7 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/irq.h>
@@ -61,7 +62,7 @@
                            unsigned long flags, const char *devname, void *dev_id);
 extern void cia_free_irq(unsigned int irq, void *dev_id);
 extern void cia_init_IRQ(struct ciabase *base);
-extern int cia_get_irq_list(struct ciabase *base, char *buf);
+extern int cia_get_irq_list(struct ciabase *base, struct seq_file *p);
 
 /* irq node variables for amiga interrupt sources */
 static irq_node_t *ami_irq_list[AMI_STD_IRQS];
@@ -480,28 +481,28 @@
 };
 #endif
 
-int amiga_get_irq_list(char *buf)
+int show_amiga_intreeupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         irq_node_t *node;
 
         for (i = 0; i < AMI_STD_IRQS; i++) {
                 if (!(node = ami_irq_list[i]))
                         continue;
- len += sprintf(buf+len, "ami %2d: %10u ", i,
+ seq_printf(p, "ami %2d: %10u ", i,
                                kstat.irqs[0][SYS_IRQS + i]);
                 do {
                         if (node->flags & SA_INTERRUPT)
- len += sprintf(buf+len, "F ");
+ seq_puts(p, "F ");
                         else
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", node->devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", node->devname);
                         if ((node = node->next))
- len += sprintf(buf+len, " ");
+ seq_puts(p, " ");
                 } while (node);
         }
 
- len += cia_get_irq_list(&ciaa_base, buf+len);
- len += cia_get_irq_list(&ciab_base, buf+len);
+ cia_get_irq_list(&ciaa_base, p);
+ cia_get_irq_list(&ciab_base, p);
         return len;
 }
diff -urN S15-pre9/arch/ppc/amiga/cia.c S15-pre9-current/arch/ppc/amiga/cia.c
--- S15-pre9/arch/ppc/amiga/cia.c Thu May 24 18:25:07 2001
+++ S15-pre9-current/arch/ppc/amiga/cia.c Thu Nov 22 14:14:33 2001
@@ -19,6 +19,7 @@
 #include <linux/errno.h>
 #include <linux/kernel_stat.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/irq.h>
 #include <asm/amigahw.h>
@@ -222,16 +223,16 @@
         custom.intena = IF_SETCLR | base->int_mask;
 }
 
-int cia_get_irq_list(struct ciabase *base, char *buf)
+int cia_get_irq_list(struct ciabase *base, struct seq_file *p)
 {
- int i, j, len = 0;
+ int i, j;
 
         j = base->cia_irq;
         for (i = 0; i < CIA_IRQS; i++) {
- len += sprintf(buf+len, "cia %2d: %10d ", j + i,
+ seq_printf(p, "cia %2d: %10d ", j + i,
                                kstat.irqs[0][SYS_IRQS + j + i]);
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", base->irq_list[i].devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", base->irq_list[i].devname);
         }
- return len;
+ return 0;
 }
diff -urN S15-pre9/arch/ppc/amiga/config.c S15-pre9-current/arch/ppc/amiga/config.c
--- S15-pre9/arch/ppc/amiga/config.c Wed Oct 24 04:09:51 2001
+++ S15-pre9-current/arch/ppc/amiga/config.c Thu Nov 22 14:14:42 2001
@@ -28,6 +28,7 @@
 #ifdef CONFIG_ZORRO
 #include <linux/zorro.h>
 #endif
+#include <linux/seq_file.h>
 
 #include <asm/bootinfo.h>
 #include <asm/setup.h>
@@ -91,7 +92,7 @@
 extern void amiga_disable_irq (unsigned int);
 static void amiga_get_model(char *model);
 static int amiga_get_hardware_list(char *buffer);
-extern int amiga_get_irq_list (char *);
+extern int show_amiga_interrupts (struct seq_file *, void *);
 /* amiga specific timer functions */
 static unsigned long amiga_gettimeoffset (void);
 static void a3000_gettod (int *, int *, int *, int *, int *, int *);
@@ -422,7 +423,7 @@
 #endif
   mach_get_model = amiga_get_model;
   mach_get_hardware_list = amiga_get_hardware_list;
- mach_get_irq_list = amiga_get_irq_list;
+ mach_get_irq_list = show_amiga_interrupts;
   mach_gettimeoffset = amiga_gettimeoffset;
   if (AMIGAHW_PRESENT(A3000_CLK)){
     mach_gettod = a3000_gettod;
diff -urN S15-pre9/arch/ppc/amiga/ints.c S15-pre9-current/arch/ppc/amiga/ints.c
--- S15-pre9/arch/ppc/amiga/ints.c Thu May 24 18:25:07 2001
+++ S15-pre9-current/arch/ppc/amiga/ints.c Thu Nov 22 14:14:48 2001
@@ -13,6 +13,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/setup.h>
 #include <asm/system.h>
@@ -143,20 +144,20 @@
         }
 }
 
-int m68k_get_irq_list(char *buf)
+int m68k_get_irq_list(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
 
         /* autovector interrupts */
         if (mach_default_handler) {
                 for (i = 0; i < SYS_IRQS; i++) {
- len += sprintf(buf+len, "auto %2d: %10u ", i,
+ seq_printf(p, "auto %2d: %10u ", i,
                                        i ? kstat.irqs[0][i] : num_spurious);
- len += sprintf(buf+len, " ");
- len += sprintf(buf+len, "%s\n", irq_list[i].devname);
+ seq_puts(p, " ");
+ seq_printf(p, "%s\n", irq_list[i].devname);
                 }
         }
 
- len += mach_get_irq_list(buf+len);
- return len;
+ mach_get_irq_list(p, v);
+ return 0;
 }
diff -urN S15-pre9/arch/ppc/kernel/apus_setup.c S15-pre9-current/arch/ppc/kernel/apus_setup.c
--- S15-pre9/arch/ppc/kernel/apus_setup.c Thu Nov 22 03:56:13 2001
+++ S15-pre9-current/arch/ppc/kernel/apus_setup.c Thu Nov 22 11:28:46 2001
@@ -95,7 +95,7 @@
 void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
 void (*mach_get_model) (char *model) = NULL;
 int (*mach_get_hardware_list) (char *buffer) = NULL;
-int (*mach_get_irq_list) (char *) = NULL;
+int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
 void (*mach_process_int) (int, struct pt_regs *) = NULL;
 /* machine dependent timer functions */
 unsigned long (*mach_gettimeoffset) (void);
@@ -671,12 +671,12 @@
         return irq;
 }
 
-int apus_get_irq_list(char *buf)
+int show_apus_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_APUS
- extern int amiga_get_irq_list(char *buf);
+ extern int show_amiga_interrupts(struct seq_file *p, void *v)
         
- return amiga_get_irq_list (buf);
+ return show_amiga_interrupts(p, v);
 #else
         return 0;
 #endif
diff -urN S15-pre9/arch/ppc/kernel/irq.c S15-pre9-current/arch/ppc/kernel/irq.c
--- S15-pre9/arch/ppc/kernel/irq.c Sun Sep 23 16:11:57 2001
+++ S15-pre9-current/arch/ppc/kernel/irq.c Thu Nov 22 14:15:03 2001
@@ -47,6 +47,7 @@
 #include <linux/irq.h>
 #include <linux/proc_fs.h>
 #include <linux/random.h>
+#include <linux/seq_file.h>
 
 #include <asm/uaccess.h>
 #include <asm/bitops.h>
@@ -371,58 +372,58 @@
         spin_unlock_irqrestore(&desc->lock, flags);
 }
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
 #ifdef CONFIG_APUS
- return apus_get_irq_list (buf);
+ return show_apus_interrupts(p, v);
 #else
- int i, len = 0, j;
+ int i, j;
         struct irqaction * action;
 
- len += sprintf(buf+len, " ");
+ seq_puts(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- len += sprintf(buf+len, "CPU%d ",j);
- *(char *)(buf+len++) = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++) {
                 action = irq_desc[i].action;
                 if ( !action || !action->handler )
                         continue;
- len += sprintf(buf+len, "%3d: ", i);
+ seq_printf(p, "%3d: ", i);
 #ifdef CONFIG_SMP
                 for (j = 0; j < smp_num_cpus; j++)
- len += sprintf(buf+len, "%10u ",
+ seq_printf(p, "%10u ",
                                 kstat.irqs[cpu_logical_map(j)][i]);
 #else
- len += sprintf(buf+len, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #endif /* CONFIG_SMP */
                 if ( irq_desc[i].handler )
- len += sprintf(buf+len, " %s ", irq_desc[i].handler->typename );
+ seq_printf(p, " %s ", irq_desc[i].handler->typename );
                 else
- len += sprintf(buf+len, " None ");
- len += sprintf(buf+len, "%s", (irq_desc[i].status & IRQ_LEVEL) ? "Level " : "Edge ");
- len += sprintf(buf+len, " %s",action->name);
+ seq_puts(p, " None ");
+ seq_printf(p, "%s", (irq_desc[i].status & IRQ_LEVEL) ? "Level " : "Edge ");
+ seq_printf(p, " %s",action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ", %s", action->name);
+ seq_printf(p, ", %s", action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
 #ifdef CONFIG_TAU_INT
         if (tau_initialized){
- len += sprintf(buf+len, "TAU: ");
+ seq_puts(p, "TAU: ");
                 for (j = 0; j < smp_num_cpus; j++)
- len += sprintf(buf+len, "%10u ",
+ seq_printf(p, "%10u ",
                                         tau_interrupts(j));
- len += sprintf(buf+len, " PowerPC Thermal Assist (cpu temp)\n");
+ seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
         }
 #endif
 #ifdef CONFIG_SMP
         /* should this be per processor send/receive? */
- len += sprintf(buf+len, "IPI (recv/sent): %10u/%u\n",
+ seq_printf(p, "IPI (recv/sent): %10u/%u\n",
                        atomic_read(&ipi_recv), atomic_read(&ipi_sent));
 #endif
- len += sprintf(buf+len, "BAD: %10u\n", ppc_spurious_interrupts);
- return len;
+ seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
+ return 0;
 #endif /* CONFIG_APUS */
 }
 
diff -urN S15-pre9/arch/s390/kernel/irq.c S15-pre9-current/arch/s390/kernel/irq.c
--- S15-pre9/arch/s390/kernel/irq.c Sat Aug 11 14:59:21 2001
+++ S15-pre9-current/arch/s390/kernel/irq.c Thu Nov 22 10:40:44 2001
@@ -28,6 +28,7 @@
 #include <linux/threads.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -59,22 +60,19 @@
 BUILD_SMP_INTERRUPT(spurious_interrupt)
 #endif
 
-#if 0
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i, j;
         struct irqaction * action;
- char *p = buf;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
 
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
+ seq_printf(p, "CPU%d ",j);
 
- *p++ = '\n';
+ seq_putc(p, '\n');
 
- for (i = 0 ; i < NR_IRQS ; i++)
- {
+ for (i = 0 ; i < NR_IRQS ; i++) {
                 if (ioinfo[i] == INVALID_STORAGE_AREA)
                         continue;
 
@@ -83,35 +81,33 @@
                   if (!action)
                         continue;
 
- p += sprintf(p, "%3d: ",i);
+ seq_printf(p, "%3d: ",i);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j=0; j<smp_num_cpus; j++)
- p += sprintf( p, "%10u ",
+ seq_printf( p, "%10u ",
                                       kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- p += sprintf(p, " %14s", ioinfo[i]->irq_desc.handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, " %14s", ioinfo[i]->irq_desc.handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
                 {
- p += sprintf(p, ", %s", action->name);
+ seq_printf(p, ", %s", action->name);
 
                 } /* endfor */
 
- *p++ = '\n';
+ seq_putc(p, '\n');
         
         } /* endfor */
 
- p += sprintf(p, "NMI: %10u\n", nmi_counter);
+ seq_printf(p, "NMI: %10u\n", nmi_counter);
 #ifdef CONFIG_SMP
- p += sprintf(p, "IPI: %10u\n", atomic_read(&ipi_count));
+ seq_printf(p, "IPI: %10u\n", atomic_read(&ipi_count));
 #endif
-
- return p - buf;
+ return 0;
 }
-#endif
 
 /*
  * Global interrupt locks for SMP. Allow interrupts to come in on any
diff -urN S15-pre9/arch/s390x/kernel/irq.c S15-pre9-current/arch/s390x/kernel/irq.c
--- S15-pre9/arch/s390x/kernel/irq.c Sat Aug 11 14:59:21 2001
+++ S15-pre9-current/arch/s390x/kernel/irq.c Thu Nov 22 10:40:44 2001
@@ -28,6 +28,7 @@
 #include <linux/threads.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -59,19 +60,17 @@
 BUILD_SMP_INTERRUPT(spurious_interrupt)
 #endif
 
-#if 0
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i, j;
         struct irqaction * action;
- char *p = buf;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
 
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
+ seq_printf(p, "CPU%d ",j);
 
- *p++ = '\n';
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < NR_IRQS ; i++)
         {
@@ -83,35 +82,34 @@
                   if (!action)
                         continue;
 
- p += sprintf(p, "%3d: ",i);
+ seq_printf(p, "%3d: ",i);
 #ifndef CONFIG_SMP
- p += sprintf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j=0; j<smp_num_cpus; j++)
- p += sprintf( p, "%10u ",
+ seq_printf( p, "%10u ",
                                       kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- p += sprintf(p, " %14s", ioinfo[i]->irq_desc.handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, " %14s", ioinfo[i]->irq_desc.handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
                 {
- p += sprintf(p, ", %s", action->name);
+ seq_printf(p, ", %s", action->name);
 
                 } /* endfor */
 
- *p++ = '\n';
+ seq_putc(p, '\n');
         
         } /* endfor */
 
- p += sprintf(p, "NMI: %10u\n", nmi_counter);
+ seq_printf(p, "NMI: %10u\n", nmi_counter);
 #ifdef CONFIG_SMP
- p += sprintf(p, "IPI: %10u\n", atomic_read(&ipi_count));
+ seq_printf(p, "IPI: %10u\n", atomic_read(&ipi_count));
 #endif
 
- return p - buf;
+ return 0;
 }
-#endif
 
 /*
  * Global interrupt locks for SMP. Allow interrupts to come in on any
diff -urN S15-pre9/arch/sh/kernel/irq.c S15-pre9-current/arch/sh/kernel/irq.c
--- S15-pre9/arch/sh/kernel/irq.c Sun Sep 23 16:11:57 2001
+++ S15-pre9-current/arch/sh/kernel/irq.c Thu Nov 22 14:15:17 2001
@@ -27,6 +27,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
+#include <linux/seq_file.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
@@ -84,31 +85,30 @@
  */
 
 #if defined(CONFIG_PROC_FS)
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
         int i, j;
         struct irqaction * action;
- char *p = buf;
 
- p += sprintf(p, " ");
+ seq_puts(p, " ");
         for (j=0; j<smp_num_cpus; j++)
- p += sprintf(p, "CPU%d ",j);
- *p++ = '\n';
+ seq_printf(p, "CPU%d ",j);
+ seq_putc(p, '\n');
 
         for (i = 0 ; i < ACTUAL_NR_IRQS ; i++) {
                 action = irq_desc[i].action;
                 if (!action)
                         continue;
- p += sprintf(p, "%3d: ",i);
- p += sprintf(p, "%10u ", kstat_irqs(i));
- p += sprintf(p, " %14s", irq_desc[i].handler->typename);
- p += sprintf(p, " %s", action->name);
+ seq_printf(p, "%3d: ",i);
+ seq_printf(p, "%10u ", kstat_irqs(i));
+ seq_printf(p, " %14s", irq_desc[i].handler->typename);
+ seq_printf(p, " %s", action->name);
 
                 for (action=action->next; action; action = action->next)
- p += sprintf(p, ", %s", action->name);
- *p++ = '\n';
+ seq_printf(p, ", %s", action->name);
+ seq_putc(p, '\n');
         }
- return p - buf;
+ return 0;
 }
 #endif
 
diff -urN S15-pre9/arch/sparc/kernel/irq.c S15-pre9-current/arch/sparc/kernel/irq.c
--- S15-pre9/arch/sparc/kernel/irq.c Sun Jul 29 01:54:42 2001
+++ S15-pre9-current/arch/sparc/kernel/irq.c Thu Nov 22 14:15:23 2001
@@ -27,6 +27,7 @@
 #include <linux/delay.h>
 #include <linux/threads.h>
 #include <linux/spinlock.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/processor.h>
@@ -97,42 +98,42 @@
           NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL
 };
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction * action;
 #ifdef CONFIG_SMP
         int j;
 #endif
 
         if (sparc_cpu_model == sun4d) {
- extern int sun4d_get_irq_list(char *);
+ extern int show_sun4d_interrupts(struct seq_file *, void *);
                 
- return sun4d_get_irq_list(buf);
+ return show_sun4d_interrupts(p, v);
         }
         for (i = 0 ; i < (NR_IRQS+1) ; i++) {
                 action = *(i + irq_action);
                 if (!action)
                         continue;
- len += sprintf(buf+len, "%3d: ", i);
+ seq_printf(p, "%3d: ", i);
 #ifndef CONFIG_SMP
- len += sprintf(buf+len, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- len += sprintf(buf+len, "%10u ",
+ seq_printf(p, "%10u ",
                                 kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- len += sprintf(buf+len, " %c %s",
+ seq_printf(p, " %c %s",
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 for (action=action->next; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                 (action->flags & SA_INTERRUPT) ? " +" : "",
                                 action->name);
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 void free_irq(unsigned int irq, void *dev_id)
diff -urN S15-pre9/arch/sparc/kernel/sun4d_irq.c S15-pre9-current/arch/sparc/kernel/sun4d_irq.c
--- S15-pre9/arch/sparc/kernel/sun4d_irq.c Sun Jul 29 01:54:42 2001
+++ S15-pre9-current/arch/sparc/kernel/sun4d_irq.c Thu Nov 22 14:15:29 2001
@@ -20,6 +20,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/processor.h>
@@ -72,9 +73,9 @@
 spinlock_t sun4d_imsk_lock = SPIN_LOCK_UNLOCKED;
 #endif
 
-int sun4d_get_irq_list(char *buf)
+int show_sun4d_interrupts(struct seq_file *p, void *v)
 {
- int i, j = 0, k = 0, len = 0, sbusl;
+ int i, j = 0, k = 0, sbusl;
         struct irqaction * action;
 #ifdef CONFIG_SMP
         int x;
@@ -94,21 +95,21 @@
                         }
                         continue;
                 }
-found_it: len += sprintf(buf+len, "%3d: ", i);
+found_it: seq_printf(p, "%3d: ", i);
 #ifndef CONFIG_SMP
- len += sprintf(buf+len, "%10u ", kstat_irqs(i));
+ seq_printf(p, "%10u ", kstat_irqs(i));
 #else
                 for (x = 0; x < smp_num_cpus; x++)
- len += sprintf(buf+len, "%10u ",
+ seq_printf(p, "%10u ",
                                        kstat.irqs[cpu_logical_map(x)][i]);
 #endif
- len += sprintf(buf+len, "%c %s",
+ seq_printf(p, "%c %s",
                         (action->flags & SA_INTERRUPT) ? '+' : ' ',
                         action->name);
                 action = action->next;
                 for (;;) {
                         for (; action; action = action->next) {
- len += sprintf(buf+len, ",%s %s",
+ seq_printf(p, ",%s %s",
                                         (action->flags & SA_INTERRUPT) ? " +" : "",
                                         action->name);
                         }
@@ -123,9 +124,9 @@
                                 action = sbus_actions [(j << 5) + (sbusl << 2)].action;
                         }
                 }
- len += sprintf(buf+len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 void sun4d_free_irq(unsigned int irq, void *dev_id)
diff -urN S15-pre9/arch/sparc64/kernel/irq.c S15-pre9-current/arch/sparc64/kernel/irq.c
--- S15-pre9/arch/sparc64/kernel/irq.c Thu Nov 22 03:56:13 2001
+++ S15-pre9-current/arch/sparc64/kernel/irq.c Thu Nov 22 14:15:38 2001
@@ -18,6 +18,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 
 #include <asm/ptrace.h>
 #include <asm/processor.h>
@@ -104,9 +105,9 @@
 #define put_smpaff_in_irqaction(action, smpaff) (action)->mask = (smpaff)
 #define get_smpaff_in_irqaction(action) ((action)->mask)
 
-int get_irq_list(char *buf)
+int show_interrupts(struct seq_file *p, void *v)
 {
- int i, len = 0;
+ int i;
         struct irqaction *action;
 #ifdef CONFIG_SMP
         int j;
@@ -115,23 +116,23 @@
         for(i = 0; i < (NR_IRQS + 1); i++) {
                 if(!(action = *(i + irq_action)))
                         continue;
- len += sprintf(buf + len, "%3d: ", i);
+ seq_print(p, "%3d: ", i);
 #ifndef CONFIG_SMP
- len += sprintf(buf + len, "%10u ", kstat_irqs(i));
+ seq_print(p, "%10u ", kstat_irqs(i));
 #else
                 for (j = 0; j < smp_num_cpus; j++)
- len += sprintf(buf + len, "%10u ",
+ seq_print(p, "%10u ",
                                        kstat.irqs[cpu_logical_map(j)][i]);
 #endif
- len += sprintf(buf + len, " %s:%lx", action->name, \
+ seq_print(p, " %s:%lx", action->name,
                                                 get_ino_in_irqaction(action));
                 for(action = action->next; action; action = action->next) {
- len += sprintf(buf+len, ", %s:%lx", action->name, \
+ seq_print(p, ", %s:%lx", action->name,
                                                 get_ino_in_irqaction(action));
                 }
- len += sprintf(buf + len, "\n");
+ seq_putc(p, '\n');
         }
- return len;
+ return 0;
 }
 
 /* Now these are always passed a true fully specified sun4u INO. */
diff -urN S15-pre9/fs/proc/proc_misc.c S15-pre9-current/fs/proc/proc_misc.c
--- S15-pre9/fs/proc/proc_misc.c Thu Nov 22 03:56:18 2001
+++ S15-pre9-current/fs/proc/proc_misc.c Thu Nov 22 14:53:51 2001
@@ -57,7 +57,6 @@
 extern int get_partition_list(char *, char **, off_t, int);
 extern int get_filesystem_list(char *);
 extern int get_exec_domain_list(char *);
-extern int get_irq_list(char *);
 extern int get_dma_list(char *);
 extern int get_locks_status (char *, char **, off_t, int);
 extern int get_swaparea_info (char *);
@@ -328,14 +327,53 @@
         return len;
 }
 
-#if !defined(CONFIG_ARCH_S390)
-static int interrupts_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
+static void *single_start(struct seq_file *p, loff_t *pos)
 {
- int len = get_irq_list(page);
- return proc_calc_metrics(page, start, off, count, eof, len);
+ return (void *)(*pos == 0);
 }
-#endif
+static void *single_next(struct seq_file *p, void *v, loff_t *pos)
+{
+ ++*pos;
+ return NULL;
+}
+static void single_stop(struct seq_file *p, void *v)
+{
+}
+extern int show_interrupts(struct seq_file *p, void *v);
+static struct seq_operations proc_interrupts_op = {
+ start: single_start,
+ next: single_next,
+ stop: single_stop,
+ show: show_interrupts,
+};
+static int interrupts_open(struct inode *inode, struct file *file)
+{
+ unsigned size = PAGE_SIZE;
+ /*
+ * probably should depend on NR_CPUS, but that's only rough estimate;
+ * if we'll need more it will be given,
+ */
+ char *buf = kmalloc(size, GFP_KERNEL);
+ struct seq_file *m;
+ int res;
+
+ if (!buf)
+ return -ENOMEM;
+ res = seq_open(file, &proc_interrupts_op);
+ if (!res) {
+ m = file->private_data;
+ m->buf = buf;
+ m->size = size;
+ } else
+ kfree(buf);
+ return res;
+}
+static struct file_operations proc_interrupts_operations = {
+ open: interrupts_open,
+ read: seq_read,
+ llseek: seq_lseek,
+ release: seq_release,
+};
 
 static int filesystems_read_proc(char *page, char **start, off_t off,
                                  int count, int *eof, void *data)
@@ -512,9 +550,6 @@
                 {"stat", kstat_read_proc},
                 {"devices", devices_read_proc},
                 {"partitions", partitions_read_proc},
-#if !defined(CONFIG_ARCH_S390)
- {"interrupts", interrupts_read_proc},
-#endif
                 {"filesystems", filesystems_read_proc},
                 {"dma", dma_read_proc},
                 {"ioports", ioports_read_proc},
@@ -537,6 +572,9 @@
                 entry->proc_fops = &proc_kmsg_operations;
         create_seq_entry("mounts", 0, &proc_mounts_operations);
         create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
+#if defined(CONFIG_ARCH_S390) || defined(CONFIG_X86) || defined(CONFIG_ARCH_MIPS)
+ create_seq_entry("interrupts", 0, &proc_interrupts_operations);
+#endif
 #ifdef CONFIG_MODULES
         create_seq_entry("ksyms", 0, &proc_ksyms_operations);
 #endif
diff -urN S15-pre9/include/asm-arm/mach/irq.h S15-pre9-current/include/asm-arm/mach/irq.h
--- S15-pre9/include/asm-arm/mach/irq.h Fri Feb 16 22:50:15 2001
+++ S15-pre9-current/include/asm-arm/mach/irq.h Thu Nov 22 12:56:42 2001
@@ -35,7 +35,7 @@
 
 extern void (*init_arch_irq)(void);
 extern int setup_arm_irq(int, struct irqaction *);
-extern int get_fiq_list(char *);
+extern int show_fiq_list(struct seq_file *, void *);
 extern void init_FIQ(void);
 
 #endif
diff -urN S15-pre9/include/asm-m68k/machdep.h S15-pre9-current/include/asm-m68k/machdep.h
--- S15-pre9/include/asm-m68k/machdep.h Fri Feb 16 20:30:21 2001
+++ S15-pre9-current/include/asm-m68k/machdep.h Thu Nov 22 14:06:23 2001
@@ -1,6 +1,8 @@
 #ifndef _M68K_MACHDEP_H
 #define _M68K_MACHDEP_H
 
+#include <linux/seq_file.h>
+
 struct pt_regs;
 struct kbd_repeat;
 struct mktime;
@@ -22,7 +24,7 @@
 extern void (*mach_free_irq) (unsigned int irq, void *dev_id);
 extern void (*mach_get_model) (char *model);
 extern int (*mach_get_hardware_list) (char *buffer);
-extern int (*mach_get_irq_list) (char *buf);
+extern int (*mach_get_irq_list) (struct seq_file *p, void *v);
 extern void (*mach_process_int) (int irq, struct pt_regs *fp);
 /* machine dependent timer functions */
 extern unsigned long (*mach_gettimeoffset)(void);
diff -urN S15-pre9/include/asm-m68k/macintosh.h S15-pre9-current/include/asm-m68k/macintosh.h
--- S15-pre9/include/asm-m68k/macintosh.h Fri Feb 16 07:12:30 2001
+++ S15-pre9-current/include/asm-m68k/macintosh.h Thu Nov 22 11:54:36 2001
@@ -1,6 +1,8 @@
 #ifndef __ASM_MACINTOSH_H
 #define __ASM_MACINTOSH_H
 
+#include <linux/seq_file.h>
+
 /*
  * Apple Macintoshisms
  */
@@ -15,7 +17,7 @@
 extern void mac_enable_irq(unsigned int);
 extern void mac_disable_irq(unsigned int);
 extern int mac_irq_pending(unsigned int);
-extern int mac_get_irq_list(char *);
+extern int show_mac_interrupts(struct seq_file *, void *);
 #if 0
 extern void mac_default_handler(int irq);
 #endif
diff -urN S15-pre9/include/asm-m68k/sun3ints.h S15-pre9-current/include/asm-m68k/sun3ints.h
--- S15-pre9/include/asm-m68k/sun3ints.h Tue Jul 3 21:09:14 2001
+++ S15-pre9-current/include/asm-m68k/sun3ints.h Thu Nov 22 11:42:57 2001
@@ -16,6 +16,7 @@
 #include <linux/sched.h>
 #include <linux/kernel_stat.h>
 #include <linux/interrupt.h>
+#include <linux/seq_file.h>
 #include <asm/segment.h>
 #include <asm/intersil.h>
 #include <asm/oplib.h>
@@ -32,7 +33,7 @@
 extern void sun3_free_irq (unsigned int irq, void *dev_id);
 extern void sun3_enable_interrupts (void);
 extern void sun3_disable_interrupts (void);
-extern int sun3_get_irq_list(char *buf);
+extern int show_sun3_interrupts(struct seq_file *, void *);
 extern void sun3_process_int(int, struct pt_regs *);
 extern volatile unsigned char* sun3_intreg;
 
diff -urN S15-pre9/include/linux/seq_file.h S15-pre9-current/include/linux/seq_file.h
--- S15-pre9/include/linux/seq_file.h Thu Nov 22 03:56:20 2001
+++ S15-pre9-current/include/linux/seq_file.h Thu Nov 22 14:38:07 2001
@@ -2,7 +2,11 @@
 #define _LINUX_SEQ_FILE_H
 #ifdef __KERNEL__
 
+#include <linux/types.h>
+
 struct seq_operations;
+struct file;
+struct inode;
 
 struct seq_file {
         char *buf;
@@ -12,6 +16,7 @@
         loff_t index;
         struct semaphore sem;
         struct seq_operations *op;
+ void *private;
 };
 
 struct seq_operations {

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Nov 23 2001 - 21:00:31 EST