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 <naveen.n....@linux.vnet.ibm.com>
---
 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 <api/fs/tracing_path.h>
 #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 <string.h>
 #include <ctype.h>
 #include <errno.h>
+#include <api/fs/tracing_path.h>
 
 #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

Reply via email to