diff options
author | Masami Hiramatsu <mhiramat@kernel.org> | 2016-06-08 05:29:40 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-06-14 08:29:54 -0400 |
commit | 0542bb9c8da51faa8d8703c394c32e334ac4e9d6 (patch) | |
tree | 03236262dbd079c059f98339a30c69eee7a5cce5 /tools/perf | |
parent | 4698b8b7572ff74d9d17fdb02d5957b7148c64fe (diff) |
perf probe: Add perf_probe_event__copy()
Add perf_probe_event__copy() to copy perf_probe_event data structure and
sub data structures under given source perf_probe_event.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20160608092940.3116.18034.stgit@devbox
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/probe-event.c | 76 | ||||
-rw-r--r-- | tools/perf/util/probe-event.h | 3 |
2 files changed, 76 insertions, 3 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 7ae3dd10f147..84f4b2b32ab7 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -2030,6 +2030,79 @@ void clear_perf_probe_event(struct perf_probe_event *pev) | |||
2030 | memset(pev, 0, sizeof(*pev)); | 2030 | memset(pev, 0, sizeof(*pev)); |
2031 | } | 2031 | } |
2032 | 2032 | ||
2033 | #define strdup_or_goto(str, label) \ | ||
2034 | ({ char *__p = NULL; if (str && !(__p = strdup(str))) goto label; __p; }) | ||
2035 | |||
2036 | static int perf_probe_point__copy(struct perf_probe_point *dst, | ||
2037 | struct perf_probe_point *src) | ||
2038 | { | ||
2039 | dst->file = strdup_or_goto(src->file, out_err); | ||
2040 | dst->function = strdup_or_goto(src->function, out_err); | ||
2041 | dst->lazy_line = strdup_or_goto(src->lazy_line, out_err); | ||
2042 | dst->line = src->line; | ||
2043 | dst->retprobe = src->retprobe; | ||
2044 | dst->offset = src->offset; | ||
2045 | return 0; | ||
2046 | |||
2047 | out_err: | ||
2048 | clear_perf_probe_point(dst); | ||
2049 | return -ENOMEM; | ||
2050 | } | ||
2051 | |||
2052 | static int perf_probe_arg__copy(struct perf_probe_arg *dst, | ||
2053 | struct perf_probe_arg *src) | ||
2054 | { | ||
2055 | struct perf_probe_arg_field *field, **ppfield; | ||
2056 | |||
2057 | dst->name = strdup_or_goto(src->name, out_err); | ||
2058 | dst->var = strdup_or_goto(src->var, out_err); | ||
2059 | dst->type = strdup_or_goto(src->type, out_err); | ||
2060 | |||
2061 | field = src->field; | ||
2062 | ppfield = &(dst->field); | ||
2063 | while (field) { | ||
2064 | *ppfield = zalloc(sizeof(*field)); | ||
2065 | if (!*ppfield) | ||
2066 | goto out_err; | ||
2067 | (*ppfield)->name = strdup_or_goto(field->name, out_err); | ||
2068 | (*ppfield)->index = field->index; | ||
2069 | (*ppfield)->ref = field->ref; | ||
2070 | field = field->next; | ||
2071 | ppfield = &((*ppfield)->next); | ||
2072 | } | ||
2073 | return 0; | ||
2074 | out_err: | ||
2075 | return -ENOMEM; | ||
2076 | } | ||
2077 | |||
2078 | int perf_probe_event__copy(struct perf_probe_event *dst, | ||
2079 | struct perf_probe_event *src) | ||
2080 | { | ||
2081 | int i; | ||
2082 | |||
2083 | dst->event = strdup_or_goto(src->event, out_err); | ||
2084 | dst->group = strdup_or_goto(src->group, out_err); | ||
2085 | dst->target = strdup_or_goto(src->target, out_err); | ||
2086 | dst->uprobes = src->uprobes; | ||
2087 | |||
2088 | if (perf_probe_point__copy(&dst->point, &src->point) < 0) | ||
2089 | goto out_err; | ||
2090 | |||
2091 | dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs); | ||
2092 | if (!dst->args) | ||
2093 | goto out_err; | ||
2094 | dst->nargs = src->nargs; | ||
2095 | |||
2096 | for (i = 0; i < src->nargs; i++) | ||
2097 | if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0) | ||
2098 | goto out_err; | ||
2099 | return 0; | ||
2100 | |||
2101 | out_err: | ||
2102 | clear_perf_probe_event(dst); | ||
2103 | return -ENOMEM; | ||
2104 | } | ||
2105 | |||
2033 | void clear_probe_trace_event(struct probe_trace_event *tev) | 2106 | void clear_probe_trace_event(struct probe_trace_event *tev) |
2034 | { | 2107 | { |
2035 | struct probe_trace_arg_ref *ref, *next; | 2108 | struct probe_trace_arg_ref *ref, *next; |
@@ -2505,9 +2578,6 @@ static int find_probe_functions(struct map *map, char *name, | |||
2505 | return found; | 2578 | return found; |
2506 | } | 2579 | } |
2507 | 2580 | ||
2508 | #define strdup_or_goto(str, label) \ | ||
2509 | ({ char *__p = strdup(str); if (!__p) goto label; __p; }) | ||
2510 | |||
2511 | void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, | 2581 | void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, |
2512 | struct probe_trace_event *tev __maybe_unused, | 2582 | struct probe_trace_event *tev __maybe_unused, |
2513 | struct map *map __maybe_unused, | 2583 | struct map *map __maybe_unused, |
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 5a27eb4fad05..367f886cfe00 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h | |||
@@ -122,6 +122,9 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev); | |||
122 | char *synthesize_probe_trace_command(struct probe_trace_event *tev); | 122 | char *synthesize_probe_trace_command(struct probe_trace_event *tev); |
123 | char *synthesize_perf_probe_arg(struct perf_probe_arg *pa); | 123 | char *synthesize_perf_probe_arg(struct perf_probe_arg *pa); |
124 | 124 | ||
125 | int perf_probe_event__copy(struct perf_probe_event *dst, | ||
126 | struct perf_probe_event *src); | ||
127 | |||
125 | /* Check the perf_probe_event needs debuginfo */ | 128 | /* Check the perf_probe_event needs debuginfo */ |
126 | bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); | 129 | bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); |
127 | 130 | ||