BPF List
 help / color / mirror / Atom feed
From: Tao Chen <chen.dylane@gmail.com>
To: Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Song Liu <song@kernel.org>,
	Yonghong Song <yonghong.song@linux.dev>,
	John Fastabend <john.fastabend@gmail.com>
Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, chen.dylane@gmail.com
Subject: [RFC PATCH] libbpf: Add bpf_program__set_section_name api
Date: Mon, 25 Mar 2024 23:47:37 +0800	[thread overview]
Message-ID: <20240325154737.3754820-1-chen.dylane@gmail.com> (raw)

The new api can be used to reset the function we want to trace in
runtime. So we need not to change the code again when we just do
minor changes to the trace function in kprobe or other ebpf event
type. We can replace the old section with new section passed in via
parameter. Maybe the following scenario we can use the api:

1. solve "*.isra.o" issue caused by compiler in new kernel
obj = offcputime_bpf__open();
bpf_program__set_section_name(*(obj->skeleton->obj),
"kprobe/finish_task_switch", "kprobe/finish_task_switch.isra.0");

2. dynamic adjustment for trace function offset
obj = offcputime_bpf__open();
bpf_program__set_section_name(*(obj->skeleton->obj),
"kprobe/finish_task_switch+23", "kprobe/finish_task_switch+45");

Signed-off-by: Tao Chen <chen.dylane@gmail.com>
---
 tools/lib/bpf/libbpf.c   | 24 ++++++++++++++++++++++++
 tools/lib/bpf/libbpf.h   |  2 ++
 tools/lib/bpf/libbpf.map |  1 +
 3 files changed, 27 insertions(+)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 96ff1aa4bf6a..94f32e845c61 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -8576,6 +8576,30 @@ const char *bpf_program__section_name(const struct bpf_program *prog)
 	return prog->sec_name;
 }
 
+int bpf_program__set_section_name(struct bpf_object *obj, const char *old_sec,
+				  const char *new_sec)
+{
+	struct bpf_program *prog = NULL;
+
+	if (obj == NULL || old_sec == NULL || new_sec == NULL)
+		return libbpf_err(-EINVAL);
+
+	do {
+		prog = bpf_object__next_program(obj, NULL);
+		if (prog) {
+			if (strcmp(prog->sec_name, old_sec) == 0) {
+				free(prog->sec_name);
+				prog->sec_name = strdup(new_sec);
+				if (!prog->sec_name)
+					return libbpf_err(-ENOMEM);
+				return 0;
+			}
+		}
+	} while (prog);
+
+	return libbpf_err(-ENOENT);
+}
+
 bool bpf_program__autoload(const struct bpf_program *prog)
 {
 	return prog->autoload;
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index 0e52621cba43..eb620a9c8b8a 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -307,6 +307,8 @@ LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog,
 
 LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog);
 LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog);
+LIBBPF_API int bpf_program__set_section_name(struct bpf_object *obj, const char *old_sec,
+					     const char *new_sec);
 LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog);
 LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload);
 LIBBPF_API bool bpf_program__autoattach(const struct bpf_program *prog);
diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
index 57712321490f..14ac62cff605 100644
--- a/tools/lib/bpf/libbpf.map
+++ b/tools/lib/bpf/libbpf.map
@@ -400,4 +400,5 @@ LIBBPF_1.3.0 {
 		bpf_program__attach_netfilter;
 		bpf_program__attach_tcx;
 		bpf_program__attach_uprobe_multi;
+		bpf_program__set_section_name;
 } LIBBPF_1.2.0;
-- 
2.34.1


             reply	other threads:[~2024-03-25 15:47 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-25 15:47 Tao Chen [this message]
2024-03-25 17:25 ` [RFC PATCH] libbpf: Add bpf_program__set_section_name api Andrii Nakryiko
2024-03-26 14:54   ` Tao Chen

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=20240325154737.3754820-1-chen.dylane@gmail.com \
    --to=chen.dylane@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=john.fastabend@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.lau@linux.dev \
    --cc=song@kernel.org \
    --cc=yonghong.song@linux.dev \
    /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