aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorMasami Hiramatsu <mhiramat@kernel.org>2016-06-08 05:29:40 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-06-14 08:29:54 -0400
commit0542bb9c8da51faa8d8703c394c32e334ac4e9d6 (patch)
tree03236262dbd079c059f98339a30c69eee7a5cce5 /tools/perf
parent4698b8b7572ff74d9d17fdb02d5957b7148c64fe (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.c76
-rw-r--r--tools/perf/util/probe-event.h3
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
2036static 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
2047out_err:
2048 clear_perf_probe_point(dst);
2049 return -ENOMEM;
2050}
2051
2052static 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;
2074out_err:
2075 return -ENOMEM;
2076}
2077
2078int 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
2101out_err:
2102 clear_perf_probe_event(dst);
2103 return -ENOMEM;
2104}
2105
2033void clear_probe_trace_event(struct probe_trace_event *tev) 2106void 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
2511void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, 2581void __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);
122char *synthesize_probe_trace_command(struct probe_trace_event *tev); 122char *synthesize_probe_trace_command(struct probe_trace_event *tev);
123char *synthesize_perf_probe_arg(struct perf_probe_arg *pa); 123char *synthesize_perf_probe_arg(struct perf_probe_arg *pa);
124 124
125int 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 */
126bool perf_probe_event_need_dwarf(struct perf_probe_event *pev); 129bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
127 130