perf trace beauty: Give syscall return beautifier more context
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 14 Jul 2017 18:16:54 +0000 (15:16 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 19 Jul 2017 02:14:02 +0000 (23:14 -0300)
We need the current thread and the trace internal state so that we can
use the fd beautifier to augment syscall returns, so use struct
syscall_arg with some fields that make sense on returns (val, thread,
trace).

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-lqag8e86ybidrh5zpqne05ov@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-trace.c
tools/perf/trace/beauty/beauty.h
tools/perf/trace/beauty/fcntl.c
tools/perf/trace/beauty/open_flags.c

index d48981c36b705840fb3dad543168023d8429d250..cfa8bf1cca439fb84364978a7c8a5efd74182bf7 100644 (file)
@@ -918,7 +918,7 @@ struct thread_trace {
        unsigned long     pfmaj, pfmin;
        char              *entry_str;
        double            runtime_ms;
-       size_t            (*ret_scnprintf)(unsigned long value, char *bf, size_t size);
+       size_t            (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg);
         struct {
                unsigned long ptr;
                short int     entry_str_pos;
@@ -971,7 +971,7 @@ fail:
 
 
 void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
-                                   size_t (*ret_scnprintf)(unsigned long val, char *bf, size_t size))
+                                   size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg))
 {
        struct thread_trace *ttrace = thread__priv(arg->thread);
 
@@ -1726,7 +1726,12 @@ signed_print:
                fprintf(trace->output, ") = 0 Timeout");
        else if (ttrace->ret_scnprintf) {
                char bf[1024];
-               ttrace->ret_scnprintf(ret, bf, sizeof(bf));
+               struct syscall_arg arg = {
+                       .val    = ret,
+                       .thread = thread,
+                       .trace  = trace,
+               };
+               ttrace->ret_scnprintf(bf, sizeof(bf), &arg);
                ttrace->ret_scnprintf = NULL;
                fprintf(trace->output, ") = %s", bf);
        } else if (sc->fmt->hexret)
index a9613d2e6cfee1434d15a676d08740730c3244d1..b64c4116cdc4dd3be5b43f5ba71191260374847f 100644 (file)
@@ -46,6 +46,9 @@ size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_ar
 size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_arg *arg);
 #define SCA_FCNTL_ARG syscall_arg__scnprintf_fcntl_arg
 
+size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
+#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
+
 size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg);
 #define SCA_STATX_FLAGS syscall_arg__scnprintf_statx_flags
 
@@ -55,6 +58,6 @@ size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_a
 size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size);
 
 void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
-                                   size_t (*ret_scnprintf)(unsigned long val, char *bf, size_t size));
+                                   size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg));
 
 #endif /* _PERF_TRACE_BEAUTY_H */
index 384f177a4304f9058cd4c053c158009cc52c1912..9de80a7eddfa4d85a57e33ac07a7d81526cc98bd 100644 (file)
@@ -15,14 +15,19 @@ static size_t fcntl__scnprintf_getfd(unsigned long val, char *bf, size_t size)
        return scnprintf(bf, size, "%s", val ? "CLOEXEC" : "0");
 }
 
+static size_t syscall_arg__scnprintf_fcntl_getfd(char *bf, size_t size, struct syscall_arg *arg)
+{
+       return fcntl__scnprintf_getfd(arg->val, bf, size);
+}
+
 size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arg *arg)
 {
        if (arg->val == F_GETFL) {
-               syscall_arg__set_ret_scnprintf(arg, open__scnprintf_flags);
+               syscall_arg__set_ret_scnprintf(arg, syscall_arg__scnprintf_open_flags);
                goto mask_arg;
        }
        if (arg->val == F_GETFD) {
-               syscall_arg__set_ret_scnprintf(arg, fcntl__scnprintf_getfd);
+               syscall_arg__set_ret_scnprintf(arg, syscall_arg__scnprintf_fcntl_getfd);
                goto mask_arg;
        }
        /*
index 3c20683d8cfb8a04c7f87bbc55532976196267ae..e359e041dc0e775fb92f032a9873b9953a075923 100644 (file)
@@ -73,7 +73,7 @@ size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size)
        return printed;
 }
 
-static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
+size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
 {
        int flags = arg->val;
 
@@ -82,6 +82,3 @@ static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct sy
 
        return open__scnprintf_flags(flags, bf, size);
 }
-
-
-#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags