WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Fixes to XenPerf code

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Fixes to XenPerf code
From: "Ross C Mcilroy" <mcilrorc@xxxxxxxxxxxxx>
Date: Tue, 30 Aug 2005 17:26:46 +0100
Cc: rolf.neugebauer@xxxxxxxxx
Delivery-date: Tue, 30 Aug 2005 16:24:47 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcWtf52EvaIe2QSLTh63WbdzkHkOJA==
Thread-topic: [PATCH] Fixes to XenPerf code

Hi,

The below patch fixes various issues with the xenperf code, and adds a syscall counter to xenolinux.


Thanks

Ross


------------------------------------------------------------------------------

Some fixes to the performance counters code, and added system call statistics.

Signed-of-by: Ross McIlroy <mcilrorc@xxxxxxxxxxxxx>

diff -r 83c73802f02a linux-2.6-xen-sparse/arch/xen/Kconfig
--- a/linux-2.6-xen-sparse/arch/xen/Kconfig     Fri Aug 26 09:29:54 2005
+++ b/linux-2.6-xen-sparse/arch/xen/Kconfig     Fri Aug 26 11:52:49 2005
@@ -134,6 +134,9 @@
     help
       fakes out a shadow mode kernel

+config XEN_SYSCALL_STATS
+       bool "system call statistics"
+       default n

 config XEN_SCRUB_PAGES
        bool "Scrub memory before freeing it to Xen"
diff -r 83c73802f02a linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile        Fri Aug 26 09:29:54 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile        Fri Aug 26 11:52:49 2005
@@ -43,6 +43,7 @@
 c-obj-$(CONFIG_EFI)            += efi.o efi_stub.o
 c-obj-$(CONFIG_EARLY_PRINTK)   += early_printk.o
 c-obj-$(CONFIG_SMP_ALTERNATIVES)+= smpalts.o
+c-obj-$(CONFIG_XEN_SYSCALL_STATS)+= syscall_stats.o
 obj-$(CONFIG_SWIOTLB)          += swiotlb.o

 EXTRA_AFLAGS   := -traditional
diff -r 83c73802f02a linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S Fri Aug 26 09:29:54 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S Fri Aug 26 11:52:49 2005
@@ -256,6 +256,9 @@
        jnz syscall_trace_entry
        cmpl $(nr_syscalls), %eax
        jae syscall_badsys
+#ifdef CONFIG_XEN_SYSCALL_STATS
+       lock incl syscall_stats(,%eax,4)
+#endif
        call *sys_call_table(,%eax,4)
        movl %eax,EAX(%esp)
        cli
@@ -281,6 +284,9 @@
        cmpl $(nr_syscalls), %eax
        jae syscall_badsys
 syscall_call:
+#ifdef CONFIG_XEN_SYSCALL_STATS
+       lock incl syscall_stats(,%eax,4)
+#endif
        call *sys_call_table(,%eax,4)
        movl %eax,EAX(%esp)             # store the return value
 syscall_exit:
diff -r 83c73802f02a tools/misc/cpuperf/cpuperf.c
--- a/tools/misc/cpuperf/cpuperf.c      Fri Aug 26 09:29:54 2005
+++ b/tools/misc/cpuperf/cpuperf.c      Fri Aug 26 11:52:49 2005
@@ -243,15 +243,13 @@
     }

     if (read) {
-        while((cpu_mask&1)) {
-            int i;
-            for (i=0x300;i<0x312;i++) {
-                printf("%010llu ",cpus_rdmsr( cpu_mask, i ) );
-            }
-            printf("\n");
-            cpu_mask>>=1;
-        }
-        exit(1);
+        
+      int i;
+      for (i=0x300;i<0x312;i++) {
+       printf("%010llu ",cpus_rdmsr( cpu_mask, i ) );
+      }
+      printf("\n");
+      exit(1);
     }
    
     if (!escr) {
diff -r 83c73802f02a xen/include/xen/perfc.h
--- a/xen/include/xen/perfc.h   Fri Aug 26 09:29:54 2005
+++ b/xen/include/xen/perfc.h   Fri Aug 26 11:52:49 2005
@@ -5,6 +5,7 @@
 #ifdef PERF_COUNTERS

 #include <asm/atomic.h>
+#include <xen/lib.h>

 /*
  * NOTE: new counters must be defined in perfc_defn.h
@@ -87,7 +88,7 @@
  * Histogram: special treatment for 0 and 1 count. After that equally spaced
  * with last bucket taking the rest.
  */
-#ifdef PERFC_ARRAYS
+#ifdef PERF_ARRAYS
 #define perfc_incr_histo(_x,_v,_n)                                          \
     do {                                                                    \
         if ( (_v) == 0 )                                                    \
diff -r 83c73802f02a linux-2.6-xen-sparse/arch/xen/i386/kernel/syscall_stats.c
--- /dev/null   Fri Aug 26 09:29:54 2005
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/syscall_stats.c Fri Aug 26 11:52:49 2005
@@ -0,0 +1,91 @@
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*-
+ ****************************************************************************
+ * (C) 2005 - Rolf Neugebauer - Intel Research Cambridge
+ ****************************************************************************
+ *
+ *        File: syscall_stats.c
+ *      Author: Rolf Neugebauer (rolf.neugebauer@xxxxxxxxx)
+ *        Date: Mar 2005
+ *
+ * Description: add a proc interface to get per system call stats
+ */
+
+
+#include <linux/config.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <asm/unistd.h>
+
+unsigned long syscall_stats[NR_syscalls];
+static unsigned char foobar[4];
+
+/* a write just resests the counter */
+static ssize_t syscall_write(struct file *f, const  char *data,
+                             size_t size, loff_t  *pos)
+{
+    printk("resetting syscall stats\n");
+    memset(&syscall_stats, 0, sizeof(syscall_stats));
+    return size;
+}
+
+static int show_syscall(struct seq_file *m, void *v)
+{
+    int i;
+    for ( i=0; i<NR_syscalls; i++ )
+    {
+        seq_printf(m, "%lu ", syscall_stats[i]);
+    }
+    seq_printf(m, "\n");
+    return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+    return *pos == 0 ? foobar : NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+    ++*pos;
+    return c_start(m, pos);
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+
+static struct seq_operations syscall_op = {
+    start:  c_start,
+    next:   c_next,
+    stop:   c_stop,
+    show:   show_syscall,
+};
+
+static int syscall_open(struct inode *inode, struct file *file)
+{
+    return seq_open(file, &syscall_op);
+}
+
+static struct file_operations proc_syscall_operations = {
+    open:           syscall_open,
+    read:           seq_read,
+    write:          syscall_write,
+    llseek:         seq_lseek,
+    release:        seq_release,
+};
+
+
+static struct proc_dir_entry *entry;
+
+static int __init syscall_stats_init(void)
+{
+    printk("Initialising syscall stats.\n");
+
+    entry = create_proc_entry("syscalls", 0777, NULL);
+    if (entry)
+        entry->proc_fops = &proc_syscall_operations;
+    else
+        printk("Unable to create /proc/syscalls.\n");
+    return 0;
+}
+subsys_initcall(syscall_stats_init);

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Fixes to XenPerf code, Ross C Mcilroy <=