Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932289AbbHHITb (ORCPT ); Sat, 8 Aug 2015 04:19:31 -0400 Received: from terminus.zytor.com ([198.137.202.10]:53871 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1946689AbbHHIQA (ORCPT ); Sat, 8 Aug 2015 04:16:00 -0400 Date: Sat, 8 Aug 2015 01:15:24 -0700 From: tip-bot for Wang Nan Message-ID: Cc: tglx@linutronix.de, namhyung@kernel.org, xiakaixu@huawei.com, acme@redhat.com, ast@plumgrid.com, brendan.d.gregg@gmail.com, hpa@zytor.com, dsahern@gmail.com, hekuang@huawei.com, lizefan@huawei.com, wangnan0@huawei.com, linux-kernel@vger.kernel.org, masami.hiramatsu.pt@hitachi.com, jolsa@kernel.org, mingo@kernel.org, a.p.zijlstra@chello.nl, daniel@iogearbox.net Reply-To: mingo@kernel.org, daniel@iogearbox.net, a.p.zijlstra@chello.nl, masami.hiramatsu.pt@hitachi.com, linux-kernel@vger.kernel.org, jolsa@kernel.org, hpa@zytor.com, ast@plumgrid.com, brendan.d.gregg@gmail.com, wangnan0@huawei.com, dsahern@gmail.com, hekuang@huawei.com, lizefan@huawei.com, tglx@linutronix.de, namhyung@kernel.org, acme@redhat.com, xiakaixu@huawei.com In-Reply-To: <1435716878-189507-21-git-send-email-wangnan0@huawei.com> References: <1435716878-189507-21-git-send-email-wangnan0@huawei.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] bpf tools: Introduce accessors for struct bpf_program Git-Commit-ID: aa9b1ac33c7979d0d91eff8b70cffc4916f5555c X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5210 Lines: 181 Commit-ID: aa9b1ac33c7979d0d91eff8b70cffc4916f5555c Gitweb: http://git.kernel.org/tip/aa9b1ac33c7979d0d91eff8b70cffc4916f5555c Author: Wang Nan AuthorDate: Wed, 1 Jul 2015 02:14:08 +0000 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 7 Aug 2015 10:16:59 -0300 bpf tools: Introduce accessors for struct bpf_program This patch introduces accessors for user of libbpf to retrieve section name and fd of a opened/loaded eBPF program. 'struct bpf_prog_handler' is used for that purpose. Accessors of programs section name and file descriptor are provided. Set/get private data are also impelmented. Signed-off-by: Wang Nan Acked-by: Alexei Starovoitov Cc: Brendan Gregg Cc: Daniel Borkmann Cc: David Ahern Cc: He Kuang Cc: Jiri Olsa Cc: Kaixu Xia Cc: Masami Hiramatsu Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Zefan Li Link: http://lkml.kernel.org/r/1435716878-189507-21-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/lib/bpf/libbpf.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ tools/lib/bpf/libbpf.h | 24 +++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 38447b7..ae1c5cb 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -98,6 +98,10 @@ struct bpf_program { int nr_reloc; int fd; + + struct bpf_object *obj; + void *priv; + bpf_program_clear_priv_t clear_priv; }; struct bpf_object { @@ -150,6 +154,12 @@ static void bpf_program__exit(struct bpf_program *prog) if (!prog) return; + if (prog->clear_priv) + prog->clear_priv(prog, prog->priv); + + prog->priv = NULL; + prog->clear_priv = NULL; + bpf_program__unload(prog); zfree(&prog->section_name); zfree(&prog->insns); @@ -225,6 +235,7 @@ bpf_object__add_program(struct bpf_object *obj, void *data, size_t size, pr_debug("found program %s\n", prog.section_name); obj->programs = progs; obj->nr_programs = nr_progs + 1; + prog.obj = obj; progs[nr_progs] = prog; return 0; } @@ -931,3 +942,64 @@ void bpf_object__close(struct bpf_object *obj) free(obj); } + +struct bpf_program * +bpf_program__next(struct bpf_program *prev, struct bpf_object *obj) +{ + size_t idx; + + if (!obj->programs) + return NULL; + /* First handler */ + if (prev == NULL) + return &obj->programs[0]; + + if (prev->obj != obj) { + pr_warning("error: program handler doesn't match object\n"); + return NULL; + } + + idx = (prev - obj->programs) + 1; + if (idx >= obj->nr_programs) + return NULL; + return &obj->programs[idx]; +} + +int bpf_program__set_private(struct bpf_program *prog, + void *priv, + bpf_program_clear_priv_t clear_priv) +{ + if (prog->priv && prog->clear_priv) + prog->clear_priv(prog, prog->priv); + + prog->priv = priv; + prog->clear_priv = clear_priv; + return 0; +} + +int bpf_program__get_private(struct bpf_program *prog, void **ppriv) +{ + *ppriv = prog->priv; + return 0; +} + +const char *bpf_program__title(struct bpf_program *prog, bool dup) +{ + const char *title; + + title = prog->section_name; + if (dup) { + title = strdup(title); + if (!title) { + pr_warning("failed to strdup program title\n"); + return NULL; + } + } + + return title; +} + +int bpf_program__fd(struct bpf_program *prog) +{ + return prog->fd; +} diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 3e69600..657e497 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -9,6 +9,7 @@ #define __BPF_LIBBPF_H #include +#include /* * In include/linux/compiler-gcc.h, __printf is defined. However @@ -34,6 +35,29 @@ void bpf_object__close(struct bpf_object *object); int bpf_object__load(struct bpf_object *obj); int bpf_object__unload(struct bpf_object *obj); +/* Accessors of bpf_program. */ +struct bpf_program; +struct bpf_program *bpf_program__next(struct bpf_program *prog, + struct bpf_object *obj); + +#define bpf_object__for_each_program(pos, obj) \ + for ((pos) = bpf_program__next(NULL, (obj)); \ + (pos) != NULL; \ + (pos) = bpf_program__next((pos), (obj))) + +typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, + void *); + +int bpf_program__set_private(struct bpf_program *prog, void *priv, + bpf_program_clear_priv_t clear_priv); + +int bpf_program__get_private(struct bpf_program *prog, + void **ppriv); + +const char *bpf_program__title(struct bpf_program *prog, bool dup); + +int bpf_program__fd(struct bpf_program *prog); + /* * We don't need __attribute__((packed)) now since it is * unnecessary for 'bpf_map_def' because they are all aligned. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/