[PATCH] s390 (2/6): irq stats.

From: Martin Schwidefsky (schwidefsky@de.ibm.com)
Date: Thu Jul 17 2003 - 11:37:55 EST


Enable irq statistics for s390*. We defined NR_IRQS to 2, one for all i/o
interrupts and one for all external interrupts.

diffstat:
 arch/s390/kernel/entry.S | 3 +++
 arch/s390/kernel/entry64.S | 1 +
 arch/s390/kernel/s390_ext.c | 8 ++++++++
 arch/s390/kernel/setup.c | 40 ++++++++++++++++++++++++++++++++++++++++
 drivers/s390/cio/cio.c | 3 +++
 fs/proc/proc_misc.c | 8 +-------
 include/asm-s390/irq.h | 7 ++-----
 include/linux/kernel_stat.h | 4 ----
 8 files changed, 58 insertions(+), 16 deletions(-)

diff -urN linux-2.6.0-test1/arch/s390/kernel/entry.S linux-2.6.0-s390/arch/s390/kernel/entry.S
--- linux-2.6.0-test1/arch/s390/kernel/entry.S Mon Jul 14 05:31:21 2003
+++ linux-2.6.0-s390/arch/s390/kernel/entry.S Thu Jul 17 17:27:30 2003
@@ -606,6 +606,8 @@
         SAVE_ALL_BASE
         SAVE_ALL __LC_EXT_OLD_PSW,0
         GET_THREAD_INFO # load pointer to task_struct to R9
+ l %r1,BASED(.Ldo_extint)
+ basr %r14,%r1
         lh %r6,__LC_EXT_INT_CODE # get interruption code
         lr %r1,%r6 # calculate index = code & 0xff
         n %r1,BASED(.Lc0xff)
@@ -694,6 +696,7 @@
  */
 .Ls390_mcck: .long s390_do_machine_check
 .Ldo_IRQ: .long do_IRQ
+.Ldo_extint: .long do_extint
 .Ldo_signal: .long do_signal
 .Ldo_softirq: .long do_softirq
 .Lentry_base: .long entry_base
diff -urN linux-2.6.0-test1/arch/s390/kernel/entry64.S linux-2.6.0-s390/arch/s390/kernel/entry64.S
--- linux-2.6.0-test1/arch/s390/kernel/entry64.S Mon Jul 14 05:31:21 2003
+++ linux-2.6.0-s390/arch/s390/kernel/entry64.S Thu Jul 17 17:27:30 2003
@@ -637,6 +637,7 @@
 ext_int_handler:
         SAVE_ALL __LC_EXT_OLD_PSW,0
         GET_THREAD_INFO # load pointer to task_struct to R9
+ brasl %r14,do_extint
         llgh %r6,__LC_EXT_INT_CODE # get interruption code
         lgr %r1,%r6 # calculate index = code & 0xff
         nill %r1,0xff
diff -urN linux-2.6.0-test1/arch/s390/kernel/s390_ext.c linux-2.6.0-s390/arch/s390/kernel/s390_ext.c
--- linux-2.6.0-test1/arch/s390/kernel/s390_ext.c Mon Jul 14 05:34:01 2003
+++ linux-2.6.0-s390/arch/s390/kernel/s390_ext.c Thu Jul 17 17:27:30 2003
@@ -11,8 +11,11 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
+#include <linux/kernel_stat.h>
+
 #include <asm/lowcore.h>
 #include <asm/s390_ext.h>
+#include <asm/irq.h>
 
 /*
  * Simple hash strategy: index = code & 0xff;
@@ -98,6 +101,11 @@
         return 0;
 }
 
+void do_extint(void)
+{
+ kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
+}
+
 EXPORT_SYMBOL(register_external_interrupt);
 EXPORT_SYMBOL(unregister_external_interrupt);
 
diff -urN linux-2.6.0-test1/arch/s390/kernel/setup.c linux-2.6.0-s390/arch/s390/kernel/setup.c
--- linux-2.6.0-test1/arch/s390/kernel/setup.c Mon Jul 14 05:30:37 2003
+++ linux-2.6.0-s390/arch/s390/kernel/setup.c Thu Jul 17 17:27:30 2003
@@ -34,12 +34,15 @@
 #include <linux/root_dev.h>
 #include <linux/console.h>
 #include <linux/seq_file.h>
+#include <linux/kernel_stat.h>
+
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/smp.h>
 #include <asm/mmu_context.h>
 #include <asm/cpcmd.h>
 #include <asm/lowcore.h>
+#include <asm/irq.h>
 
 /*
  * Machine setup..
@@ -600,3 +603,40 @@
         .stop = c_stop,
         .show = show_cpuinfo,
 };
+
+/*
+ * show_interrupts is needed by /proc/interrupts.
+ */
+
+static const char *intrclass_names[] = {
+ "EXT",
+ "I/O",
+};
+
+int show_interrupts(struct seq_file *p, void *v)
+{
+ int i, j;
+
+ seq_puts(p, " ");
+
+ for (j=0; j<NR_CPUS; j++)
+ if (cpu_online(j))
+ seq_printf(p, "CPU%d ",j);
+
+ seq_putc(p, '\n');
+
+ for (i = 0 ; i < NR_IRQS ; i++) {
+ seq_printf(p, "%s: ", intrclass_names[i]);
+#ifndef CONFIG_SMP
+ seq_printf(p, "%10u ", kstat_irqs(i));
+#else
+ for (j = 0; j < NR_CPUS; j++)
+ if (cpu_online(j))
+ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+#endif
+ seq_putc(p, '\n');
+
+ }
+
+ return 0;
+}
diff -urN linux-2.6.0-test1/drivers/s390/cio/cio.c linux-2.6.0-s390/drivers/s390/cio/cio.c
--- linux-2.6.0-test1/drivers/s390/cio/cio.c Mon Jul 14 05:38:51 2003
+++ linux-2.6.0-s390/drivers/s390/cio/cio.c Thu Jul 17 17:27:30 2003
@@ -16,10 +16,12 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/device.h>
+#include <linux/kernel_stat.h>
 
 #include <asm/hardirq.h>
 #include <asm/cio.h>
 #include <asm/delay.h>
+#include <asm/irq.h>
 
 #include "airq.h"
 #include "cio.h"
@@ -608,6 +610,7 @@
         tpi_info = (struct tpi_info *) __LC_SUBCHANNEL_ID;
         irb = (struct irb *) __LC_IRB;
         do {
+ kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++;
                 /*
                  * Non I/O-subchannel thin interrupts are processed differently
                  */
diff -urN linux-2.6.0-test1/fs/proc/proc_misc.c linux-2.6.0-s390/fs/proc/proc_misc.c
--- linux-2.6.0-test1/fs/proc/proc_misc.c Thu Jul 17 17:27:27 2003
+++ linux-2.6.0-s390/fs/proc/proc_misc.c Thu Jul 17 17:27:30 2003
@@ -388,10 +388,8 @@
                 system += kstat_cpu(i).cpustat.system;
                 idle += kstat_cpu(i).cpustat.idle;
                 iowait += kstat_cpu(i).cpustat.iowait;
-#if !defined(CONFIG_ARCH_S390)
                 for (j = 0 ; j < NR_IRQS ; j++)
                         sum += kstat_cpu(i).irqs[j];
-#endif
         }
 
         len = sprintf(page, "cpu %u %u %u %u %u\n",
@@ -412,7 +410,7 @@
         }
         len += sprintf(page + len, "intr %u", sum);
 
-#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
+#if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA)
         for (i = 0 ; i < NR_IRQS ; i++)
                 len += sprintf(page + len, " %u", kstat_irqs(i));
 #endif
@@ -440,7 +438,6 @@
         return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
-#if !defined(CONFIG_ARCH_S390)
 extern int show_interrupts(struct seq_file *p, void *v);
 static int interrupts_open(struct inode *inode, struct file *file)
 {
@@ -466,7 +463,6 @@
         .llseek = seq_lseek,
         .release = single_release,
 };
-#endif
 
 static int filesystems_read_proc(char *page, char **start, off_t off,
                                  int count, int *eof, void *data)
@@ -646,9 +642,7 @@
                 entry->proc_fops = &proc_kmsg_operations;
         create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
         create_seq_entry("partitions", 0, &proc_partitions_operations);
-#if !defined(CONFIG_ARCH_S390)
         create_seq_entry("interrupts", 0, &proc_interrupts_operations);
-#endif
         create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations);
         create_seq_entry("buddyinfo",S_IRUGO, &fragmentation_file_operations);
         create_seq_entry("vmstat",S_IRUGO, &proc_vmstat_file_operations);
diff -urN linux-2.6.0-test1/include/asm-s390/irq.h linux-2.6.0-s390/include/asm-s390/irq.h
--- linux-2.6.0-test1/include/asm-s390/irq.h Mon Jul 14 05:37:26 2003
+++ linux-2.6.0-s390/include/asm-s390/irq.h Thu Jul 17 17:27:30 2003
@@ -8,16 +8,13 @@
  * the definition of irqs has changed in 2.5.46:
  * NR_IRQS is no longer the number of i/o
  * interrupts (65536), but rather the number
- * of interrupt classes (6).
+ * of interrupt classes (2).
+ * Only external and i/o interrupts make much sense here (CH).
  */
 
 enum interruption_class {
         EXTERNAL_INTERRUPT,
         IO_INTERRUPT,
- MACHINE_CHECK_INTERRUPT,
- PROGRAM_INTERRUPT,
- RESTART_INTERRUPT,
- SUPERVISOR_CALL,
 
         NR_IRQS,
 };
diff -urN linux-2.6.0-test1/include/linux/kernel_stat.h linux-2.6.0-s390/include/linux/kernel_stat.h
--- linux-2.6.0-test1/include/linux/kernel_stat.h Mon Jul 14 05:38:41 2003
+++ linux-2.6.0-s390/include/linux/kernel_stat.h Thu Jul 17 17:27:30 2003
@@ -23,9 +23,7 @@
 
 struct kernel_stat {
         struct cpu_usage_stat cpustat;
-#if !defined(CONFIG_ARCH_S390)
         unsigned int irqs[NR_IRQS];
-#endif
 };
 
 DECLARE_PER_CPU(struct kernel_stat, kstat);
@@ -36,7 +34,6 @@
 
 extern unsigned long nr_context_switches(void);
 
-#if !defined(CONFIG_ARCH_S390)
 /*
  * Number of interrupts per specific IRQ source, since bootup
  */
@@ -50,6 +47,5 @@
 
         return sum;
 }
-#endif
 
 #endif /* _LINUX_KERNEL_STAT_H */
-
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 : Wed Jul 23 2003 - 22:00:29 EST