From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753972AbcFPIdm (ORCPT ); Thu, 16 Jun 2016 04:33:42 -0400 Received: from terminus.zytor.com ([198.137.202.10]:33154 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751795AbcFPIdk (ORCPT ); Thu, 16 Jun 2016 04:33:40 -0400 Date: Thu, 16 Jun 2016 01:33:07 -0700 From: tip-bot for Masami Hiramatsu Message-ID: Cc: acme@redhat.com, namhyung@kernel.org, peterz@infradead.org, mhiramat@kernel.org, mingo@kernel.org, tglx@linutronix.de, linux-kernel@vger.kernel.org, hemant@linux.vnet.ibm.com, brendan.d.gregg@gmail.com, ananth@linux.vnet.ibm.com, hpa@zytor.com Reply-To: mingo@kernel.org, mhiramat@kernel.org, peterz@infradead.org, tglx@linutronix.de, namhyung@kernel.org, acme@redhat.com, brendan.d.gregg@gmail.com, ananth@linux.vnet.ibm.com, hemant@linux.vnet.ibm.com, hpa@zytor.com, linux-kernel@vger.kernel.org In-Reply-To: <20160608092940.3116.18034.stgit@devbox> References: <20160608092940.3116.18034.stgit@devbox> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf probe: Add perf_probe_event__copy() Git-Commit-ID: 0542bb9c8da51faa8d8703c394c32e334ac4e9d6 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 0542bb9c8da51faa8d8703c394c32e334ac4e9d6 Gitweb: http://git.kernel.org/tip/0542bb9c8da51faa8d8703c394c32e334ac4e9d6 Author: Masami Hiramatsu AuthorDate: Wed, 8 Jun 2016 18:29:40 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Tue, 14 Jun 2016 09:29:54 -0300 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 Cc: Ananth N Mavinakayanahalli Cc: Brendan Gregg Cc: Hemant Kumar Cc: Namhyung Kim Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/20160608092940.3116.18034.stgit@devbox Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/probe-event.c | 76 +++++++++++++++++++++++++++++++++++++++++-- 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 7ae3dd1..84f4b2b3 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) memset(pev, 0, sizeof(*pev)); } +#define strdup_or_goto(str, label) \ +({ char *__p = NULL; if (str && !(__p = strdup(str))) goto label; __p; }) + +static int perf_probe_point__copy(struct perf_probe_point *dst, + struct perf_probe_point *src) +{ + dst->file = strdup_or_goto(src->file, out_err); + dst->function = strdup_or_goto(src->function, out_err); + dst->lazy_line = strdup_or_goto(src->lazy_line, out_err); + dst->line = src->line; + dst->retprobe = src->retprobe; + dst->offset = src->offset; + return 0; + +out_err: + clear_perf_probe_point(dst); + return -ENOMEM; +} + +static int perf_probe_arg__copy(struct perf_probe_arg *dst, + struct perf_probe_arg *src) +{ + struct perf_probe_arg_field *field, **ppfield; + + dst->name = strdup_or_goto(src->name, out_err); + dst->var = strdup_or_goto(src->var, out_err); + dst->type = strdup_or_goto(src->type, out_err); + + field = src->field; + ppfield = &(dst->field); + while (field) { + *ppfield = zalloc(sizeof(*field)); + if (!*ppfield) + goto out_err; + (*ppfield)->name = strdup_or_goto(field->name, out_err); + (*ppfield)->index = field->index; + (*ppfield)->ref = field->ref; + field = field->next; + ppfield = &((*ppfield)->next); + } + return 0; +out_err: + return -ENOMEM; +} + +int perf_probe_event__copy(struct perf_probe_event *dst, + struct perf_probe_event *src) +{ + int i; + + dst->event = strdup_or_goto(src->event, out_err); + dst->group = strdup_or_goto(src->group, out_err); + dst->target = strdup_or_goto(src->target, out_err); + dst->uprobes = src->uprobes; + + if (perf_probe_point__copy(&dst->point, &src->point) < 0) + goto out_err; + + dst->args = zalloc(sizeof(struct perf_probe_arg) * src->nargs); + if (!dst->args) + goto out_err; + dst->nargs = src->nargs; + + for (i = 0; i < src->nargs; i++) + if (perf_probe_arg__copy(&dst->args[i], &src->args[i]) < 0) + goto out_err; + return 0; + +out_err: + clear_perf_probe_event(dst); + return -ENOMEM; +} + void clear_probe_trace_event(struct probe_trace_event *tev) { struct probe_trace_arg_ref *ref, *next; @@ -2505,9 +2578,6 @@ static int find_probe_functions(struct map *map, char *name, return found; } -#define strdup_or_goto(str, label) \ - ({ char *__p = strdup(str); if (!__p) goto label; __p; }) - void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, struct probe_trace_event *tev __maybe_unused, struct map *map __maybe_unused, diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 5a27eb4..367f886 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); char *synthesize_probe_trace_command(struct probe_trace_event *tev); char *synthesize_perf_probe_arg(struct perf_probe_arg *pa); +int perf_probe_event__copy(struct perf_probe_event *dst, + struct perf_probe_event *src); + /* Check the perf_probe_event needs debuginfo */ bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);