diff options
author | Pekka Paalanen <pq@iki.fi> | 2008-05-12 15:20:57 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-24 05:24:53 -0400 |
commit | bd8ac686c73c7e925fcfe0b02dc4e7b947127864 (patch) | |
tree | 7a675c4919429b507bb8e7b09677d96ae30ec561 /kernel/trace/trace.c | |
parent | f984b51e0779a6dd30feedc41404013ca54e5d05 (diff) |
ftrace: mmiotrace, updates
here is a patch that makes mmiotrace work almost well within the tracing
framework. The patch applies on top of my previous patch. I have my own
output formatting in place now.
Summary of changes:
- fix the NULL dereference that was due to not calling tracing_reset()
- add print_line() callback into struct tracer
- implement print_line() for mmiotrace, producing up-to-spec text
- add my output header, but that is not really called in the right place
- rewrote the main structs in mmiotrace
- added two new trace entry types: TRACE_MMIO_RW and TRACE_MMIO_MAP
- made some functions in trace.c non-static
- check current==NULL in tracing_generic_entry_update()
- fix(?) comparison in trace_seq_printf()
Things seem to work fine except a few issues. Markers (text lines injected
into mmiotrace log) are missing, I did not feel hacking them in before we
have variable length entries. My output header is printed only for 'trace'
file, but not 'trace_pipe'. For some reason, despite my quick fix,
iter->trace is NULL in print_trace_line() when called from 'trace_pipe'
file, which means I don't get proper output formatting.
I only tried by loading nouveau.ko, which just detects the card, and that
is traced fine. I didn't try further. Map, two reads and unmap. Works
perfectly.
I am missing the information about overflows, I'd prefer to have a
counter for lost events. I didn't try, but I guess currently there is no
way of knowning when it overflows?
So, not too far from being fully operational, it seems :-)
And looking at the diffstat, there also is some 700-900 lines of user space
code that just became obsolete.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r-- | kernel/trace/trace.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 3271916ff033..d14fe49e9638 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -831,6 +831,40 @@ ftrace(struct trace_array *tr, struct trace_array_cpu *data, | |||
831 | trace_function(tr, data, ip, parent_ip, flags); | 831 | trace_function(tr, data, ip, parent_ip, flags); |
832 | } | 832 | } |
833 | 833 | ||
834 | #ifdef CONFIG_MMIOTRACE | ||
835 | void __trace_mmiotrace_rw(struct trace_array *tr, struct trace_array_cpu *data, | ||
836 | struct mmiotrace_rw *rw) | ||
837 | { | ||
838 | struct trace_entry *entry; | ||
839 | unsigned long irq_flags; | ||
840 | |||
841 | spin_lock_irqsave(&data->lock, irq_flags); | ||
842 | entry = tracing_get_trace_entry(tr, data); | ||
843 | tracing_generic_entry_update(entry, 0); | ||
844 | entry->type = TRACE_MMIO_RW; | ||
845 | entry->mmiorw = *rw; | ||
846 | spin_unlock_irqrestore(&data->lock, irq_flags); | ||
847 | |||
848 | trace_wake_up(); | ||
849 | } | ||
850 | |||
851 | void __trace_mmiotrace_map(struct trace_array *tr, struct trace_array_cpu *data, | ||
852 | struct mmiotrace_map *map) | ||
853 | { | ||
854 | struct trace_entry *entry; | ||
855 | unsigned long irq_flags; | ||
856 | |||
857 | spin_lock_irqsave(&data->lock, irq_flags); | ||
858 | entry = tracing_get_trace_entry(tr, data); | ||
859 | tracing_generic_entry_update(entry, 0); | ||
860 | entry->type = TRACE_MMIO_MAP; | ||
861 | entry->mmiomap = *map; | ||
862 | spin_unlock_irqrestore(&data->lock, irq_flags); | ||
863 | |||
864 | trace_wake_up(); | ||
865 | } | ||
866 | #endif | ||
867 | |||
834 | void __trace_stack(struct trace_array *tr, | 868 | void __trace_stack(struct trace_array *tr, |
835 | struct trace_array_cpu *data, | 869 | struct trace_array_cpu *data, |
836 | unsigned long flags, | 870 | unsigned long flags, |