summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2012-06-29 15:11:26 +0200
committerIngo Molnar <mingo@kernel.org>2012-06-29 15:11:26 +0200
commitadd79461a2a7d964a00b4a2fdaf313c4cf9cf4ec (patch)
treecda1525b5483ad4952ff9d71348693f14d8b26ba /tools/perf/util/session.c
parent357398e96d8c883b010379a7669df43ed0e2e32b (diff)
parentd9873ab79376d5c0112ed09e14783067dc65e808 (diff)
downloadop-kernel-dev-add79461a2a7d964a00b4a2fdaf313c4cf9cf4ec.zip
op-kernel-dev-add79461a2a7d964a00b4a2fdaf313c4cf9cf4ec.tar.gz
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
perf/core improvements and fixes: * Improve 'perf bench' docs, by Namhyung Kim * Fix build when O= is not used, from David Ahern * Fix cross compilation build, from Namhyung Kim * Fix pipe mode when callchains are used, from David Ahern * Follow .gnu_debuglink section to find separate symbols, from Pierre-Loup A. Griffais * Fix 'perf test' raw events entries, from Jiri Olsa * Use the events description in the perf.data file, not the sysfs ones. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 6b305fb..f5baff1 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -14,6 +14,7 @@
#include "sort.h"
#include "util.h"
#include "cpumap.h"
+#include "event-parse.h"
static int perf_session__open(struct perf_session *self, bool force)
{
@@ -1610,3 +1611,58 @@ void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
perf_header__fprintf_info(session, fp, full);
fprintf(fp, "# ========\n#\n");
}
+
+
+int __perf_session__set_tracepoints_handlers(struct perf_session *session,
+ const struct perf_evsel_str_handler *assocs,
+ size_t nr_assocs)
+{
+ struct perf_evlist *evlist = session->evlist;
+ struct event_format *format;
+ struct perf_evsel *evsel;
+ char *tracepoint, *name;
+ size_t i;
+ int err;
+
+ for (i = 0; i < nr_assocs; i++) {
+ err = -ENOMEM;
+ tracepoint = strdup(assocs[i].name);
+ if (tracepoint == NULL)
+ goto out;
+
+ err = -ENOENT;
+ name = strchr(tracepoint, ':');
+ if (name == NULL)
+ goto out_free;
+
+ *name++ = '\0';
+ format = pevent_find_event_by_name(session->pevent,
+ tracepoint, name);
+ if (format == NULL) {
+ /*
+ * Adding a handler for an event not in the session,
+ * just ignore it.
+ */
+ goto next;
+ }
+
+ evsel = perf_evlist__find_tracepoint_by_id(evlist, format->id);
+ if (evsel == NULL)
+ goto next;
+
+ err = -EEXIST;
+ if (evsel->handler.func != NULL)
+ goto out_free;
+ evsel->handler.func = assocs[i].handler;
+next:
+ free(tracepoint);
+ }
+
+ err = 0;
+out:
+ return err;
+
+out_free:
+ free(tracepoint);
+ goto out;
+}
OpenPOWER on IntegriCloud