From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
David Ahern <dsahern@gmail.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 08/13] libbpf: Collect begin/end .text functions
Date: Mon, 12 Mar 2018 10:43:08 +0100 [thread overview]
Message-ID: <20180312094313.18738-9-jolsa@kernel.org> (raw)
In-Reply-To: <20180312094313.18738-1-jolsa@kernel.org>
Collect begin/end functions from .text section,
so they could be executed before/after probes.
Link: http://lkml.kernel.org/n/tip-hj1hwb7fshdwco706j22ela3@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/lib/bpf/libbpf.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 07a6d8f5e5ab..26231e278bb8 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -225,6 +225,10 @@ struct bpf_object {
struct bpf_map *maps;
size_t nr_maps;
+ struct bpf_program *text;
+ struct bpf_insn *insn_begin;
+ struct bpf_insn *insn_end;
+
bool loaded;
/*
@@ -440,6 +444,68 @@ bpf_object__init_prog_names(struct bpf_object *obj)
return 0;
}
+static int
+bpf_object__init_text(struct bpf_object *obj)
+{
+ Elf_Data *symbols = obj->efile.symbols;
+ struct bpf_program *prog;
+ size_t pi, si;
+
+ if (obj->efile.text_shndx == -1)
+ return 0;
+
+ for (pi = 0; pi < obj->nr_programs; pi++) {
+ prog = &obj->programs[pi];
+ if (prog->idx != obj->efile.text_shndx)
+ continue;
+
+ obj->text = prog;
+
+ for (si = 0; si < symbols->d_size / sizeof(GElf_Sym); si++) {
+ bool is_end = false, is_begin = false;
+ struct bpf_insn *insn;
+ const char *name = NULL;
+ unsigned int insn_idx;
+ GElf_Sym sym;
+
+ if (!gelf_getsym(symbols, si, &sym))
+ continue;
+ if (sym.st_shndx != prog->idx)
+ continue;
+ if (GELF_ST_BIND(sym.st_info) != STB_GLOBAL)
+ continue;
+
+ name = elf_strptr(obj->efile.elf,
+ obj->efile.strtabidx,
+ sym.st_name);
+ if (!name) {
+ pr_warning("failed to get sym name string for prog %s\n",
+ prog->section_name);
+ return -LIBBPF_ERRNO__LIBELF;
+ }
+
+ is_begin = !strcmp(name, "BEGIN");
+ is_end = !strcmp(name, "END");
+
+ if (!is_begin && !is_end)
+ continue;
+
+ insn_idx = sym.st_value / sizeof(struct bpf_insn);
+ insn = &prog->insns[insn_idx];
+
+ pr_debug("set %s to %p\n", name, insn);
+
+ if (is_begin)
+ obj->insn_begin = insn;
+ else
+ obj->insn_end = insn;
+ }
+ }
+
+ return 0;
+}
+
+
static struct bpf_object *bpf_object__new(const char *path,
void *obj_buf,
size_t obj_buf_sz)
@@ -464,6 +530,7 @@ static struct bpf_object *bpf_object__new(const char *path,
obj->efile.obj_buf = obj_buf;
obj->efile.obj_buf_sz = obj_buf_sz;
obj->efile.maps_shndx = -1;
+ obj->efile.text_shndx = -1;
obj->loaded = false;
@@ -890,6 +957,9 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
goto out;
}
err = bpf_object__init_prog_names(obj);
+ if (err)
+ goto out;
+ err = bpf_object__init_text(obj);
out:
return err;
}
--
2.13.6
next prev parent reply other threads:[~2018-03-12 9:45 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-12 9:43 [RFC 00/13] perf bpf: Add support to run BEGIN/END code Jiri Olsa
2018-03-12 9:43 ` [PATCH 01/13] lib bpf: Add bpf_program__insns function Jiri Olsa
2018-03-12 9:43 ` [PATCH 02/13] perf tools: Display ebpf compiling command in debug output Jiri Olsa
2018-03-12 14:24 ` Arnaldo Carvalho de Melo
2018-03-20 6:29 ` [tip:perf/core] perf llvm: Display eBPF " tip-bot for Jiri Olsa
2018-03-12 9:43 ` [PATCH 03/13] perf tools: Add bpf command Jiri Olsa
2018-03-12 9:43 ` [PATCH 04/13] perf tools: Add bpf__compile function Jiri Olsa
2018-03-12 9:43 ` [PATCH 05/13] perf bpf: Add compile option Jiri Olsa
2018-03-12 9:43 ` [PATCH 06/13] perf bpf: Add disasm option Jiri Olsa
2018-03-12 9:43 ` [PATCH 07/13] libbpf: Make bpf_program__next skip .text section Jiri Olsa
2018-03-12 9:43 ` Jiri Olsa [this message]
2018-03-12 9:43 ` [PATCH 09/13] libbpf: Add bpf_insn__interpret function Jiri Olsa
2018-03-12 15:44 ` Arnaldo Carvalho de Melo
2018-03-12 15:53 ` Jiri Olsa
2018-03-12 9:43 ` [PATCH 10/13] libbpf: Add bpf_object__run_(begin|end) functions Jiri Olsa
2018-03-12 9:43 ` [PATCH 11/13] perf bpf: Add helper header files Jiri Olsa
2018-03-12 18:44 ` Alexei Starovoitov
2018-03-12 19:06 ` Arnaldo Carvalho de Melo
2018-03-12 19:20 ` Jiri Olsa
2018-03-12 19:25 ` Arnaldo Carvalho de Melo
2018-03-12 22:32 ` Jiri Olsa
2018-03-13 1:35 ` Arnaldo Carvalho de Melo
2018-03-13 14:18 ` Jiri Olsa
2018-03-12 9:43 ` [PATCH 12/13] perf bpf: Run begin/end programs Jiri Olsa
2018-03-12 9:43 ` [PATCH 13/13] perf samples: Add syscall-count.c object Jiri Olsa
2018-03-12 11:17 ` [RFC 00/13] perf bpf: Add support to run BEGIN/END code Jiri Olsa
2018-03-12 13:56 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180312094313.18738-9-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=dsahern@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome