This patch calibrates the best-case overhead a function trace point
introduces and dumps the result at the beginning of each tracer output.
Should give the reader of some trace an idea what the instrumentation
/at least/ costed per entry.

Jan
---
 kernel/ipipe/tracer.c |   25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

Index: linux-2.6.19-ipipe/kernel/ipipe/tracer.c
===================================================================
--- linux-2.6.19-ipipe.orig/kernel/ipipe/tracer.c
+++ linux-2.6.19-ipipe/kernel/ipipe/tracer.c
@@ -129,6 +129,7 @@ static int pre_trace = IPIPE_DEFAULT_PRE
 static int post_trace = IPIPE_DEFAULT_POST_TRACE;
 static int back_trace = IPIPE_DEFAULT_BACK_TRACE;
 static int verbose_trace;
+static unsigned long trace_overhead;
 
 static DEFINE_MUTEX(out_mutex);
 static struct ipipe_trace_path *print_path;
@@ -824,6 +825,9 @@ static void __ipipe_print_dbgwarning(str
 
 static void __ipipe_print_headline(struct seq_file *m)
 {
+       seq_printf(m, "Calibrated minimum trace-point overhead: %lu.%03lu "
+                  "us\n\n", trace_overhead/1000, trace_overhead%1000);
+
        if (verbose_trace) {
                const char *name[4] = { [0 ... 3] = "<unused>" };
                struct list_head *pos;
@@ -917,7 +921,7 @@ static void *__ipipe_max_prtrace_start(s
                        UTS_RELEASE, IPIPE_ARCH_STRING);
                __ipipe_print_dbgwarning(m);
                seq_printf(m, "Begin: %lld cycles, Trace Points: %d (-%d/+%d), "
-                       "Length: %lu us\n\n",
+                       "Length: %lu us\n",
                        print_path->point[print_path->begin].timestamp,
                        points, print_pre_trace, print_post_trace, 
length_usecs);
                __ipipe_print_headline(m);
@@ -1073,7 +1077,7 @@ static void *__ipipe_frozen_prtrace_star
                        "------\n",
                        UTS_RELEASE, IPIPE_ARCH_STRING);
                __ipipe_print_dbgwarning(m);
-               seq_printf(m, "Freeze: %lld cycles, Trace Points: %d (+%d)\n\n",
+               seq_printf(m, "Freeze: %lld cycles, Trace Points: %d (+%d)\n",
                        print_path->point[print_path->begin].timestamp,
                        print_pre_trace+1, print_post_trace);
                __ipipe_print_headline(m);
@@ -1200,6 +1204,8 @@ void __init __ipipe_init_tracer(void)
 {
        struct proc_dir_entry *trace_dir;
        struct proc_dir_entry *entry;
+       unsigned long long start, end, min = ULLONG_MAX;
+       int i;
 #ifdef CONFIG_IPIPE_TRACE_VMALLOC
        int cpu, path;
 
@@ -1221,6 +1227,21 @@ void __init __ipipe_init_tracer(void)
        ipipe_trace_enable = CONFIG_IPIPE_TRACE_ENABLE_VALUE;
 #endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 
+       /* Calculate minimum overhead of __ipipe_trace() */
+       local_irq_disable_hw();
+       for (i = 0; i < 100; i++) {
+               ipipe_read_tsc(start);
+               __ipipe_trace(IPIPE_TRACE_FUNC, __BUILTIN_RETURN_ADDRESS0,
+                             __BUILTIN_RETURN_ADDRESS1, 0);
+               ipipe_read_tsc(end);
+
+               end -= start;
+               if (end < min)
+                       min = end;
+       }
+       local_irq_enable_hw();
+       trace_overhead = ipipe_tsc2ns(min);
+
        trace_dir = create_proc_entry("trace", S_IFDIR, ipipe_proc_root);
 
        entry = create_proc_entry("max", 0644, trace_dir);

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to