From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751754AbdGZRRT (ORCPT ); Wed, 26 Jul 2017 13:17:19 -0400 Received: from terminus.zytor.com ([65.50.211.136]:34247 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750930AbdGZRRQ (ORCPT ); Wed, 26 Jul 2017 13:17:16 -0400 Date: Wed, 26 Jul 2017 10:15:01 -0700 From: tip-bot for Arnaldo Carvalho de Melo Message-ID: Cc: mingo@kernel.org, adrian.hunter@intel.com, dsahern@gmail.com, wangnan0@huawei.com, hpa@zytor.com, linux-kernel@vger.kernel.org, acme@redhat.com, namhyung@kernel.org, tglx@linutronix.de, jolsa@kernel.org Reply-To: jolsa@kernel.org, tglx@linutronix.de, namhyung@kernel.org, acme@redhat.com, hpa@zytor.com, linux-kernel@vger.kernel.org, wangnan0@huawei.com, dsahern@gmail.com, adrian.hunter@intel.com, mingo@kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf trace: Use the syscall_fmt formatters without a tracepoint Git-Commit-ID: d032d79e2dcb56e13678bf2cc7b36957ef827c32 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: d032d79e2dcb56e13678bf2cc7b36957ef827c32 Gitweb: http://git.kernel.org/tip/d032d79e2dcb56e13678bf2cc7b36957ef827c32 Author: Arnaldo Carvalho de Melo AuthorDate: Wed, 19 Jul 2017 14:36:13 -0300 Committer: Arnaldo Carvalho de Melo CommitDate: Thu, 20 Jul 2017 09:55:52 -0300 perf trace: Use the syscall_fmt formatters without a tracepoint Previously we only used the syscall_fmt when we had sc->tp_format set, i.e. when we found the (enter, exit) pair in tracefs/events/syscalls/. But we really only need to use what is in sc->arg_fmt to apply the arg beautifiers to the syscall argument values, so do it. With this we will be able to provide formatters to the "clone" syscall, which doesn't have entries in tracefs/events/syscalls/. Cc: Adrian Hunter Cc: David Ahern Cc: Jiri Olsa Cc: Namhyung Kim Cc: Wang Nan Link: http://lkml.kernel.org/n/tip-y41nl41jrayjo5ucnde2peix@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-trace.c | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 1c5238a..fc4d33a 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -1350,12 +1350,32 @@ unsigned long syscall_arg__val(struct syscall_arg *arg, u8 idx) return __syscall_arg__val(arg->args, idx); } +static size_t syscall__scnprintf_val(struct syscall *sc, char *bf, size_t size, + struct syscall_arg *arg, unsigned long val) +{ + if (sc->arg_fmt && sc->arg_fmt[arg->idx].scnprintf) { + arg->val = val; + if (sc->arg_fmt[arg->idx].parm) + arg->parm = sc->arg_fmt[arg->idx].parm; + return sc->arg_fmt[arg->idx].scnprintf(bf, size, arg); + } + return scnprintf(bf, size, "%ld", val); +} + static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, unsigned char *args, struct trace *trace, struct thread *thread) { size_t printed = 0; unsigned long val; + u8 bit = 1; + struct syscall_arg arg = { + .args = args, + .idx = 0, + .mask = 0, + .trace = trace, + .thread = thread, + }; struct thread_trace *ttrace = thread__priv(thread); /* @@ -1367,14 +1387,6 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, if (sc->args != NULL) { struct format_field *field; - u8 bit = 1; - struct syscall_arg arg = { - .args = args, - .idx = 0, - .mask = 0, - .trace = trace, - .thread = thread, - }; for (field = sc->args; field; field = field->next, ++arg.idx, bit <<= 1) { @@ -1398,15 +1410,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, printed += scnprintf(bf + printed, size - printed, "%s%s: ", printed ? ", " : "", field->name); - if (sc->arg_fmt && sc->arg_fmt[arg.idx].scnprintf) { - arg.val = val; - if (sc->arg_fmt[arg.idx].parm) - arg.parm = sc->arg_fmt[arg.idx].parm; - printed += sc->arg_fmt[arg.idx].scnprintf(bf + printed, size - printed, &arg); - } else { - printed += scnprintf(bf + printed, size - printed, - "%ld", val); - } + printed += syscall__scnprintf_val(sc, bf + printed, size - printed, &arg, val); } } else if (IS_ERR(sc->tp_format)) { /* @@ -1414,14 +1418,16 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, * may end up not having any args, like with gettid(), so only * print the raw args when we didn't manage to read it. */ - int i = 0; - - while (i < 6) { - val = __syscall_arg__val(args, i); + while (arg.idx < 6) { + if (arg.mask & bit) + goto next_arg; + val = syscall_arg__val(&arg, arg.idx); printed += scnprintf(bf + printed, size - printed, - "%sarg%d: %ld", - printed ? ", " : "", i, val); - ++i; + "%sarg%d: ", printed ? ", " : "", arg.idx); + printed += syscall__scnprintf_val(sc, bf + printed, size - printed, &arg, val); +next_arg: + ++arg.idx; + bit <<= 1; } }