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 */
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Adeos-main mailing list [email protected] https://mail.gna.org/listinfo/adeos-main
