Hi Philippe,

here is the cleaned up and configurable version of my vmalloc hack for
the I-pipe tracer.

As it has a slight performance impact to use virtual memory for the
trace buffer (running "hackbench 10" in parallel to "latency -p 100" on
a 266 MHz P-MMX: 227 vs. 244 s hackbench runtime), I left this option
off by default. If there is any kind of CONFIG combination that cries
for default on, we can easily add it.

Jan
Index: linux-2.6.16.1/kernel/ipipe/Kconfig
===================================================================
--- linux-2.6.16.1.orig/kernel/ipipe/Kconfig
+++ linux-2.6.16.1/kernel/ipipe/Kconfig
@@ -34,3 +34,12 @@ config IPIPE_TRACE_SHIFT
        ---help---
          The number of trace points to hold tracing data for each
          trace path, as a power of 2.
+
+config IPIPE_TRACE_VMALLOC
+       bool "Use vmalloc'ed trace buffer"
+       depends on IPIPE_TRACE
+       ---help---
+         Instead of reserving static kernel data, the required buffer
+         is allocated via vmalloc during boot-up when this option is
+         enabled. This can help to start systems that are low on memory,
+         but it slightly degrades overall performance.
Index: linux-2.6.16.1/kernel/ipipe/tracer.c
===================================================================
--- linux-2.6.16.1.orig/kernel/ipipe/tracer.c
+++ linux-2.6.16.1/kernel/ipipe/tracer.c
@@ -2,7 +2,7 @@
  * kernel/ipipe/tracer.c
  *
  * Copyright (C) 2005 Luotao Fu.
- *               2005 Jan Kiszka.
+ *               2005, 2006 Jan Kiszka.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@
 #include <linux/seq_file.h>
 #include <linux/proc_fs.h>
 #include <linux/ctype.h>
+#include <linux/vmalloc.h>
 #include <linux/ipipe_trace.h>
 #include <asm/uaccess.h>
 
@@ -86,7 +87,13 @@ enum ipipe_trace_type
 };
 
 
-int ipipe_trace_enable = 1;
+#ifdef CONFIG_IPIPE_TRACE_VMALLOC
+#define IPIPE_DEFAULT_TRACE_STATE   0
+
+static struct ipipe_trace_path *trace_paths[NR_CPUS];
+
+#else /* !CONFIG_IPIPE_TRACE_VMALLOC */
+#define IPIPE_DEFAULT_TRACE_STATE   1
 
 static struct ipipe_trace_path trace_paths[NR_CPUS][IPIPE_TRACE_PATHS] =
        { [0 ... NR_CPUS-1] =
@@ -94,6 +101,10 @@ static struct ipipe_trace_path trace_pat
                        { .begin = -1, .end = -1 }
                }
        };
+#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
+
+int ipipe_trace_enable = IPIPE_DEFAULT_TRACE_STATE;
+
 static int active_path[NR_CPUS] =
        { [0 ... NR_CPUS-1] = IPIPE_DEFAULT_ACTIVE };
 static int max_path[NR_CPUS] =
@@ -1097,10 +1108,30 @@ __ipipe_create_trace_proc_val(struct pro
        }
 }
 
-void __init __ipipe_init_trace_proc(void)
+void __init __ipipe_init_tracer(void)
 {
        struct proc_dir_entry *trace_dir;
        struct proc_dir_entry *entry;
+#ifdef CONFIG_IPIPE_TRACE_VMALLOC
+       int cpu, path;
+
+       for (cpu = 0; cpu < NR_CPUS; cpu++) {
+               trace_paths[cpu] = vmalloc(
+                       sizeof(struct ipipe_trace_path) * IPIPE_TRACE_PATHS);
+               if (!trace_paths) {
+                       printk(KERN_ERR "I-pipe: "
+                              "insufficient memory for trace buffer.\n");
+                       return;
+               }
+               memset(trace_paths[cpu], 0,
+                       sizeof(struct ipipe_trace_path) * IPIPE_TRACE_PATHS);
+               for (path = 0; path < IPIPE_TRACE_PATHS; path++) {
+                       trace_paths[cpu][path].begin = -1;
+                       trace_paths[cpu][path].end   = -1;
+               }
+       }
+       ipipe_trace_enable = 1;
+#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 
        trace_dir = create_proc_entry("trace", S_IFDIR, ipipe_proc_root);
 
Index: linux-2.6.16.1/include/linux/ipipe.h
===================================================================
--- linux-2.6.16.1.orig/include/linux/ipipe.h
+++ linux-2.6.16.1/include/linux/ipipe.h
@@ -329,9 +329,9 @@ void ipipe_init(void);
 void ipipe_init_proc(void);
 
 #ifdef CONFIG_IPIPE_TRACE
-void __ipipe_init_trace_proc(void);
+void __ipipe_init_tracer(void);
 #else /* !CONFIG_IPIPE_TRACE */
-#define __ipipe_init_trace_proc()   do { } while(0)
+#define __ipipe_init_tracer()       do { } while(0)
 #endif /* CONFIG_IPIPE_TRACE */
 
 #else  /* !CONFIG_PROC_FS */
Index: linux-2.6.16.1/kernel/ipipe/core.c
===================================================================
--- linux-2.6.16.1.orig/kernel/ipipe/core.c
+++ linux-2.6.16.1/kernel/ipipe/core.c
@@ -1012,8 +1012,9 @@ void ipipe_init_proc(void)
 {
        ipipe_proc_root = create_proc_entry("ipipe",S_IFDIR, 0);
        
create_proc_read_entry("version",0444,ipipe_proc_root,&__ipipe_version_info_proc,NULL);
-       __ipipe_init_trace_proc();
        __ipipe_add_domain_proc(ipipe_root_domain);
+
+       __ipipe_init_tracer();
 }
 
 #endif /* CONFIG_PROC_FS */

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to