[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220104080943.113249-8-jolsa@kernel.org>
Date: Tue, 4 Jan 2022 09:09:37 +0100
From: Jiri Olsa <jolsa@...hat.com>
To: Alexei Starovoitov <ast@...nel.org>,
Daniel Borkmann <daniel@...earbox.net>,
Andrii Nakryiko <andrii@...nel.org>,
Masami Hiramatsu <mhiramat@...nel.org>
Cc: netdev@...r.kernel.org, bpf@...r.kernel.org,
lkml <linux-kernel@...r.kernel.org>,
Martin KaFai Lau <kafai@...com>,
Song Liu <songliubraving@...com>, Yonghong Song <yhs@...com>,
John Fastabend <john.fastabend@...il.com>,
KP Singh <kpsingh@...omium.org>,
Steven Rostedt <rostedt@...dmis.org>,
"Naveen N. Rao" <naveen.n.rao@...ux.ibm.com>,
Anil S Keshavamurthy <anil.s.keshavamurthy@...el.com>,
"David S. Miller" <davem@...emloft.net>
Subject: [PATCH 07/13] samples/kprobes: Add support for multi kretprobe interface
Adding support to test multi kprobe interface. It's now possible
to register multiple functions for the module handler, like:
# modprobe kretprobe_example.ko func='sched_fork,kernel_clone'
Signed-off-by: Jiri Olsa <jolsa@...nel.org>
---
samples/kprobes/kretprobe_example.c | 43 +++++++++++++++++++++++++++--
1 file changed, 41 insertions(+), 2 deletions(-)
diff --git a/samples/kprobes/kretprobe_example.c b/samples/kprobes/kretprobe_example.c
index 228321ecb161..2181cf0d6e4a 100644
--- a/samples/kprobes/kretprobe_example.c
+++ b/samples/kprobes/kretprobe_example.c
@@ -25,6 +25,8 @@
#include <linux/ktime.h>
#include <linux/limits.h>
#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
static char func_name[NAME_MAX] = "kernel_clone";
module_param_string(func, func_name, NAME_MAX, S_IRUGO);
@@ -80,17 +82,54 @@ static struct kretprobe my_kretprobe = {
static int __init kretprobe_init(void)
{
+ char **symbols = NULL;
int ret;
my_kretprobe.kp.symbol_name = func_name;
+
+#ifdef CONFIG_HAVE_KPROBES_MULTI_ON_FTRACE
+ if (strchr(func_name, ',')) {
+ char *p, *tmp;
+ int cnt;
+
+ tmp = kstrdup(func_name, GFP_KERNEL);
+ if (!tmp)
+ return -ENOMEM;
+
+ p = strchr(tmp, ',');
+ while (p) {
+ *p = ' ';
+ p = strchr(p + 1, ',');
+ }
+
+ symbols = argv_split(GFP_KERNEL, tmp, &cnt);
+ kfree(tmp);
+ if (!symbols) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ my_kretprobe.kp.multi.symbols = (const char **) symbols;
+ my_kretprobe.kp.multi.cnt = cnt;
+ }
+#endif
ret = register_kretprobe(&my_kretprobe);
if (ret < 0) {
pr_err("register_kretprobe failed, returned %d\n", ret);
return ret;
}
- pr_info("Planted return probe at %s: %p\n",
+
+ if (symbols) {
+ pr_info("Planted multi return kprobe to %s\n", func_name);
+ } else {
+ pr_info("Planted return probe at %s: %p\n",
my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr);
- return 0;
+ }
+
+out:
+ if (symbols)
+ argv_free(symbols);
+ return ret;
}
static void __exit kretprobe_exit(void)
--
2.33.1
Powered by blists - more mailing lists