lkml.org 
[lkml]   [2015]   [Sep]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/27] perf record: Load all eBPF object into kernel
    Date
    This patch utilizes bpf_object__load() provided by libbpf to load all
    objects into kernel.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kaixu Xia <xiakaixu@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Link: http://lkml.kernel.org/n/1436445342-1402-24-git-send-email-wangnan0@huawei.com
    ---
    tools/perf/builtin-record.c | 15 +++++++++++++++
    tools/perf/util/bpf-loader.c | 28 ++++++++++++++++++++++++++++
    tools/perf/util/bpf-loader.h | 10 ++++++++++
    3 files changed, 53 insertions(+)

    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index b56109f..7335ce0 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -1159,6 +1159,21 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
    goto out_symbol_exit;
    }

    + /*
    + * bpf__probe() also calls symbol__init() if there are probe
    + * events in bpf objects, so calling symbol_exit when failure
    + * is safe. If there is no probe event, bpf__load() always
    + * success.
    + */
    + err = bpf__load();
    + if (err) {
    + pr_err("Loading BPF programs failed:\n");
    +
    + bpf__strerror_load(err, errbuf, sizeof(errbuf));
    + pr_err("\t%s\n", errbuf);
    + goto out_symbol_exit;
    + }
    +
    symbol__init(NULL);

    if (symbol_conf.kptr_restrict)
    diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
    index ce95db8..754ed02 100644
    --- a/tools/perf/util/bpf-loader.c
    +++ b/tools/perf/util/bpf-loader.c
    @@ -299,6 +299,25 @@ out_cleanup:
    goto out;
    }

    +int bpf__load(void)
    +{
    + struct bpf_object *obj, *tmp;
    + int err = 0;
    +
    + bpf_object__for_each_safe(obj, tmp) {
    + err = bpf_object__load(obj);
    + if (err) {
    + pr_debug("bpf: load objects failed\n");
    + goto errout;
    + }
    + }
    + return 0;
    +errout:
    + bpf_object__for_each_safe(obj, tmp)
    + bpf_object__unload(obj);
    + return err;
    +}
    +
    #define bpf__strerror_head(err, buf, size) \
    char sbuf[STRERR_BUFSIZE], *emsg;\
    if (!size)\
    @@ -341,3 +360,12 @@ int bpf__strerror_probe(int err, char *buf, size_t size)
    bpf__strerror_end(buf, size);
    return 0;
    }
    +
    +int bpf__strerror_load(int err, char *buf, size_t size)
    +{
    + bpf__strerror_head(err, buf, size);
    + bpf__strerror_entry(EINVAL, "%s: add -v to see detail. Run a CONFIG_BPF_SYSCALL kernel?",
    + emsg)
    + bpf__strerror_end(buf, size);
    + return 0;
    +}
    diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h
    index 6b09a85..4d7552e 100644
    --- a/tools/perf/util/bpf-loader.h
    +++ b/tools/perf/util/bpf-loader.h
    @@ -19,6 +19,9 @@ int bpf__probe(void);
    int bpf__unprobe(void);
    int bpf__strerror_probe(int err, char *buf, size_t size);

    +int bpf__load(void);
    +int bpf__strerror_load(int err, char *buf, size_t size);
    +
    void bpf__clear(void);
    #else
    static inline int bpf__prepare_load(const char *filename __maybe_unused)
    @@ -29,6 +32,7 @@ static inline int bpf__prepare_load(const char *filename __maybe_unused)

    static inline int bpf__probe(void) { return 0; }
    static inline int bpf__unprobe(void) { return 0; }
    +static inline int bpf__load(void) { return 0; }
    static inline void bpf__clear(void) { }

    static inline int
    @@ -56,5 +60,11 @@ static inline int bpf__strerror_probe(int err __maybe_unused,
    {
    return __bpf_strerror(buf, size);
    }
    +
    +static inline int bpf__strerror_load(int err __maybe_unused,
    + char *buf, size_t size)
    +{
    + return __bpf_strerror(buf, size);
    +}
    #endif
    #endif
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-09-06 09:41    [W:4.127 / U:0.396 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site