On Tue,  7 Mar 2017 16:17:40 +0530
"Naveen N. Rao" <naveen.n....@linux.vnet.ibm.com> wrote:

> 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.

Hmm, it seems probe-file.c doesn't require libelf at all...
I would like to keep ftrace related things in probe-file.c.

Thanks,

> 
> 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
> 


-- 
Masami Hiramatsu <mhira...@kernel.org>

Reply via email to