From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755328AbdCGKtw (ORCPT ); Tue, 7 Mar 2017 05:49:52 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:55973 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754934AbdCGKsu (ORCPT ); Tue, 7 Mar 2017 05:48:50 -0500 From: "Naveen N. Rao" To: Arnaldo Carvalho de Melo , Masami Hiramatsu Cc: Steven Rostedt , Ingo Molnar , linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, Ananth N Mavinakayanahalli , Michael Ellerman Subject: [PATCH 5/6] perf: probes: move ftrace README parsing logic into trace-event-parse.c Date: Tue, 7 Mar 2017 16:17:40 +0530 X-Mailer: git-send-email 2.11.1 In-Reply-To: References: In-Reply-To: References: <20170306220638.e7db155d44e14325c5c0174b@kernel.org> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17030710-0016-0000-0000-000003EF4FF8 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17030710-0017-0000-0000-000028D6A053 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-03-07_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1703070091 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org probe-file.c needs libelf, but scanning ftrace README does not require that. As such, move the ftrace README scanning logic out of probe-file.c and into trace-event-parse.c. Signed-off-by: Naveen N. Rao --- tools/perf/util/probe-file.c | 87 +++--------------------------------- tools/perf/util/probe-file.h | 2 - tools/perf/util/trace-event-parse.c | 89 +++++++++++++++++++++++++++++++++++++ tools/perf/util/trace-event.h | 4 ++ 4 files changed, 99 insertions(+), 83 deletions(-) diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 1542cd0d6799..ff872fa30cdb 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -26,6 +26,7 @@ #include #include "probe-event.h" #include "probe-file.h" +#include "trace-event.h" #include "session.h" #define MAX_CMDLEN 256 @@ -70,33 +71,17 @@ static void print_both_open_warning(int kerr, int uerr) } } -int open_trace_file(const char *trace_file, bool readwrite) -{ - char buf[PATH_MAX]; - int ret; - - ret = e_snprintf(buf, PATH_MAX, "%s/%s", - tracing_path, trace_file); - if (ret >= 0) { - pr_debug("Opening %s write=%d\n", buf, readwrite); - if (readwrite && !probe_event_dry_run) - ret = open(buf, O_RDWR | O_APPEND, 0); - else - ret = open(buf, O_RDONLY, 0); - - if (ret < 0) - ret = -errno; - } - return ret; -} - static int open_kprobe_events(bool readwrite) { + if (probe_event_dry_run) + readwrite = false; return open_trace_file("kprobe_events", readwrite); } static int open_uprobe_events(bool readwrite) { + if (probe_event_dry_run) + readwrite = false; return open_trace_file("uprobe_events", readwrite); } @@ -877,72 +862,12 @@ int probe_cache__show_all_caches(struct strfilter *filter) return 0; } -enum ftrace_readme { - FTRACE_README_PROBE_TYPE_X = 0, - FTRACE_README_KRETPROBE_OFFSET, - FTRACE_README_END, -}; - -static struct { - const char *pattern; - bool avail; -} ftrace_readme_table[] = { -#define DEFINE_TYPE(idx, pat) \ - [idx] = {.pattern = pat, .avail = false} - DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"), - DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"), -}; - -static bool scan_ftrace_readme(enum ftrace_readme type) -{ - int fd; - FILE *fp; - char *buf = NULL; - size_t len = 0; - bool ret = false; - static bool scanned = false; - - if (scanned) - goto result; - - fd = open_trace_file("README", false); - if (fd < 0) - return ret; - - fp = fdopen(fd, "r"); - if (!fp) { - close(fd); - return ret; - } - - while (getline(&buf, &len, fp) > 0) - for (enum ftrace_readme i = 0; i < FTRACE_README_END; i++) - if (!ftrace_readme_table[i].avail) - ftrace_readme_table[i].avail = - strglobmatch(buf, ftrace_readme_table[i].pattern); - scanned = true; - - fclose(fp); - free(buf); - -result: - if (type >= FTRACE_README_END) - return false; - - return ftrace_readme_table[type].avail; -} - bool probe_type_is_available(enum probe_type type) { if (type >= PROBE_TYPE_END) return false; else if (type == PROBE_TYPE_X) - return scan_ftrace_readme(FTRACE_README_PROBE_TYPE_X); + return probe_type_x_is_supported(); return true; } - -bool kretprobe_offset_is_supported(void) -{ - return scan_ftrace_readme(FTRACE_README_KRETPROBE_OFFSET); -} diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h index dbf95a00864a..eba44c3e9dca 100644 --- a/tools/perf/util/probe-file.h +++ b/tools/perf/util/probe-file.h @@ -35,7 +35,6 @@ enum probe_type { /* probe-file.c depends on libelf */ #ifdef HAVE_LIBELF_SUPPORT -int open_trace_file(const char *trace_file, bool readwrite); int probe_file__open(int flag); int probe_file__open_both(int *kfd, int *ufd, int flag); struct strlist *probe_file__get_namelist(int fd); @@ -65,7 +64,6 @@ struct probe_cache_entry *probe_cache__find_by_name(struct probe_cache *pcache, const char *group, const char *event); int probe_cache__show_all_caches(struct strfilter *filter); bool probe_type_is_available(enum probe_type type); -bool kretprobe_offset_is_supported(void); #else /* ! HAVE_LIBELF_SUPPORT */ static inline struct probe_cache *probe_cache__new(const char *tgt __maybe_unused) { diff --git a/tools/perf/util/trace-event-parse.c b/tools/perf/util/trace-event-parse.c index de0078e21408..77697c446cbd 100644 --- a/tools/perf/util/trace-event-parse.c +++ b/tools/perf/util/trace-event-parse.c @@ -23,10 +23,12 @@ #include #include #include +#include #include "../perf.h" #include "util.h" #include "trace-event.h" +#include "debug.h" static int get_common_field(struct scripting_context *context, int *offset, int *size, const char *type) @@ -254,3 +256,90 @@ unsigned long long eval_flag(const char *flag) return 0; } + +int open_trace_file(const char *trace_file, bool readwrite) +{ + char buf[PATH_MAX]; + int ret; + + ret = snprintf(buf, PATH_MAX, "%s/%s", + tracing_path, trace_file); + if (ret >= PATH_MAX) + ret = -E2BIG; + if (ret >= 0) { + pr_debug("Opening %s write=%d\n", buf, readwrite); + if (readwrite) + ret = open(buf, O_RDWR | O_APPEND, 0); + else + ret = open(buf, O_RDONLY, 0); + + if (ret < 0) + ret = -errno; + } + return ret; +} + +enum ftrace_readme { + FTRACE_README_PROBE_TYPE_X = 0, + FTRACE_README_KRETPROBE_OFFSET, + FTRACE_README_END, +}; + +static struct { + const char *pattern; + bool avail; +} ftrace_readme_table[] = { +#define DEFINE_TYPE(idx, pat) \ + [idx] = {.pattern = pat, .avail = false} + DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"), + DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"), +}; + +static bool scan_ftrace_readme(enum ftrace_readme type) +{ + int fd; + FILE *fp; + char *buf = NULL; + size_t len = 0; + bool ret = false; + static bool scanned = false; + + if (scanned) + goto result; + + fd = open_trace_file("README", false); + if (fd < 0) + return ret; + + fp = fdopen(fd, "r"); + if (!fp) { + close(fd); + return ret; + } + + while (getline(&buf, &len, fp) > 0) + for (enum ftrace_readme i = 0; i < FTRACE_README_END; i++) + if (!ftrace_readme_table[i].avail) + ftrace_readme_table[i].avail = + strglobmatch(buf, ftrace_readme_table[i].pattern); + scanned = true; + + fclose(fp); + free(buf); + +result: + if (type >= FTRACE_README_END) + return false; + + return ftrace_readme_table[type].avail; +} + +bool kretprobe_offset_is_supported(void) +{ + return scan_ftrace_readme(FTRACE_README_KRETPROBE_OFFSET); +} + +bool probe_type_x_is_supported(void) +{ + return scan_ftrace_readme(FTRACE_README_PROBE_TYPE_X); +} diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index 1fbc044f9eb0..ecda2d822daf 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h @@ -37,6 +37,10 @@ int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size); int parse_event_file(struct pevent *pevent, char *buf, unsigned long size, char *sys); +int open_trace_file(const char *trace_file, bool readwrite); +bool kretprobe_offset_is_supported(void); +bool probe_type_x_is_supported(void); + unsigned long long raw_field_value(struct event_format *event, const char *name, void *data); -- 2.11.1