diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2013-05-03 11:20:15 -0500 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2013-05-03 11:20:16 -0500 |
commit | 743bddb4b35ceaaf6f95aea581a4130dcae6205a (patch) | |
tree | eeabd3f7fd008377db4ea3c8152560718fa427f9 /trace/ftrace.c | |
parent | a612925b4184fa7aa37092db4fef816030640922 (diff) | |
parent | e64dd5efb2c6d522a3bc9d096cd49a4e53f0ae10 (diff) | |
download | hqemu-743bddb4b35ceaaf6f95aea581a4130dcae6205a.zip hqemu-743bddb4b35ceaaf6f95aea581a4130dcae6205a.tar.gz |
Merge remote-tracking branch 'stefanha/tracing' into staging
# By Eiichi Tsukata (2) and Kazuya Saito (2)
# Via Stefan Hajnoczi
* stefanha/tracing:
trace: document ftrace backend
trace: Add ftrace tracing backend
kvm-all: add kvm_run_exit tracepoint
kvm-all: add kvm_ioctl, kvm_vm_ioctl, kvm_vcpu_ioctl tracepoints
Message-id: 1367582485-15579-1-git-send-email-stefanha@redhat.com
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'trace/ftrace.c')
-rw-r--r-- | trace/ftrace.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/trace/ftrace.c b/trace/ftrace.c new file mode 100644 index 0000000..46b7fdb --- /dev/null +++ b/trace/ftrace.c @@ -0,0 +1,102 @@ +/* + * Ftrace trace backend + * + * Copyright (C) 2013 Hitachi, Ltd. + * Created by Eiichi Tsukata <eiichi.tsukata.xh@hitachi.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <limits.h> +#include "trace.h" +#include "trace/control.h" + +int trace_marker_fd; + +static int find_debugfs(char *debugfs) +{ + char type[100]; + FILE *fp; + + fp = fopen("/proc/mounts", "r"); + if (fp == NULL) { + return 0; + } + + while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n", + debugfs, type) == 2) { + if (strcmp(type, "debugfs") == 0) { + break; + } + } + fclose(fp); + + if (strcmp(type, "debugfs") != 0) { + return 0; + } + return 1; +} + +void trace_print_events(FILE *stream, fprintf_function stream_printf) +{ + TraceEventID i; + + for (i = 0; i < trace_event_count(); i++) { + TraceEvent *ev = trace_event_id(i); + stream_printf(stream, "%s [Event ID %u] : state %u\n", + trace_event_get_name(ev), i, trace_event_get_state_dynamic(ev)); + } +} + +void trace_event_set_state_dynamic_backend(TraceEvent *ev, bool state) +{ + ev->dstate = state; +} + +bool trace_backend_init(const char *events, const char *file) +{ + char debugfs[PATH_MAX]; + char path[PATH_MAX]; + int debugfs_found; + int trace_fd = -1; + + if (file) { + fprintf(stderr, "error: -trace file=...: " + "option not supported by the selected tracing backend\n"); + return false; + } + + debugfs_found = find_debugfs(debugfs); + if (debugfs_found) { + snprintf(path, PATH_MAX, "%s/tracing/tracing_on", debugfs); + trace_fd = open(path, O_WRONLY); + if (trace_fd < 0) { + perror("Could not open ftrace 'tracing_on' file"); + return false; + } else { + if (write(trace_fd, "1", 1) < 0) { + perror("Could not write to 'tracing_on' file"); + close(trace_fd); + return false; + } + close(trace_fd); + } + snprintf(path, PATH_MAX, "%s/tracing/trace_marker", debugfs); + trace_marker_fd = open(path, O_WRONLY); + if (trace_marker_fd < 0) { + perror("Could not open ftrace 'trace_marker' file"); + return false; + } + } else { + fprintf(stderr, "debugfs is not mounted\n"); + return false; + } + + trace_backend_init_events(events); + return true; +} |