diff options
author | Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com> | 2013-04-11 20:25:15 +0900 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2013-05-03 13:58:09 +0200 |
commit | 781e9545dbe54d2f0a530edbf48fd0ac1e77244c (patch) | |
tree | 9f89f26c7f52ff8cfca0997e8d7849dd242dc79b /scripts/tracetool | |
parent | b76ac80a5ca9f2e19405419172c0dcaf0370d4f5 (diff) | |
download | qemu-781e9545dbe54d2f0a530edbf48fd0ac1e77244c.zip qemu-781e9545dbe54d2f0a530edbf48fd0ac1e77244c.tar.gz qemu-781e9545dbe54d2f0a530edbf48fd0ac1e77244c.tar.bz2 |
trace: Add ftrace tracing backend
This patch adds a ftrace tracing backend which sends trace event to
ftrace marker file. You can effectively compare qemu trace data and
kernel(especially, kvm.ko when using KVM) trace data.
The ftrace backend is restricted to Linux only.
To try out the ftrace backend:
$ ./configure --trace-backend=ftrace
$ make
if you use KVM, enable kvm events in ftrace:
# sudo echo 1 > /sys/kernel/debug/tracing/events/kvm/enable
After running qemu by root user, you can get the trace:
# cat /sys/kernel/debug/tracing/trace
Signed-off-by: Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'scripts/tracetool')
-rw-r--r-- | scripts/tracetool/backend/ftrace.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py new file mode 100644 index 0000000..888c361 --- /dev/null +++ b/scripts/tracetool/backend/ftrace.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Ftrace built-in backend. +""" + +__author__ = "Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com>" +__copyright__ = "Copyright (C) 2013 Hitachi, Ltd." +__license__ = "GPL version 2 or (at your option) any later version" + +__maintainer__ = "Stefan Hajnoczi" +__email__ = "stefanha@redhat.com" + + +from tracetool import out + + +PUBLIC = True + + +def c(events): + pass + +def h(events): + out('#include "trace/ftrace.h"', + '#include "trace/control.h"', + '', + ) + + for e in events: + argnames = ", ".join(e.args.names()) + if len(e.args) > 0: + argnames = ", " + argnames + + out('static inline void trace_%(name)s(%(args)s)', + '{', + ' char ftrace_buf[MAX_TRACE_STRLEN];', + ' int unused __attribute__ ((unused));', + ' int trlen;', + ' bool _state = trace_event_get_state(%(event_id)s);', + ' if (_state) {', + ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', + ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', + ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', + ' unused = write(trace_marker_fd, ftrace_buf, trlen);', + ' }', + '}', + name = e.name, + args = e.args, + event_id = "TRACE_" + e.name.upper(), + fmt = e.fmt.rstrip("\n"), + argnames = argnames, + ) |