Skip to contentSkip to conversation

ftrace: Add ftrace-direct-multi-modify sample module

PATCH New Jiri Olsa 1 participant 4 messages Dec 6, 2021

Subsystems (2)
lore
Share & tools
lore

Jiri Olsa

author
#0 lore raw

v2 cover ftrace: Add ftrace-direct-multi-modify sample module

hi,
this patchset adds ftrace-direct-multi-modify.ko kernel module that shows the usage of modify_ftrace_direct_multi API. Plus two additional small fixes for ftrace direct code.

v2 changes:
- rebased on top of v5.16-rc4
- added s390x trampolines

thanks,
jirka

---
Jiri Olsa (3):
ftrace: Use direct_ops hash in unregister_ftrace_direct
ftrace: Add cleanup to unregister_ftrace_direct_multi ftrace/samples: Add module to test multi direct modify interface

 kernel/trace/ftrace.c                       |   8 +++++-
 samples/ftrace/Makefile                     |   1 +
 samples/ftrace/ftrace-direct-multi-modify.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 160 insertions(+), 1 deletion(-)
 create mode 100644 samples/ftrace/ftrace-direct-multi-modify.c
author
#1 lore raw

PATCH v2 1/3 ftrace: Use direct_ops hash in unregister_ftrace_direct

Now when we have *direct_multi interface the direct_functions hash is no longer owned just by direct_ops. It's also used by any other ftrace_ops passed to *direct_multi interface.

Thus to find out that we are unregistering the last function from direct_ops, we need to check directly direct_ops's hash.

Fixes f64dd4627ec6 ("ftrace: Add multi direct register/unregister interface")
---
 kernel/trace/ftrace.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/trace/ftrace.c +3 -1
index 30bc880c3849..7f0594e28226 100644
@@ -5217,6 +5217,7 @@ int unregister_ftrace_direct(unsigned long ip, unsigned long addr)
 {
 	struct ftrace_direct_func *direct;
 	struct ftrace_func_entry *entry;
+	struct ftrace_hash *hash;
 	int ret = -ENODEV;
 
 	mutex_lock(&direct_mutex);
@@ -5225,7 +5226,8 @@ int unregister_ftrace_direct(unsigned long ip, unsigned long addr)
 	if (!entry)
 		goto out_unlock;
 
-	if (direct_functions->count == 1)
+	hash = direct_ops.func_hash->filter_hash;
+	if (hash->count == 1)
 		unregister_ftrace_function(&direct_ops);
 
 	ret = ftrace_set_filter_ip(&direct_ops, ip, 1, 0);
Signature · 1 line
2.33.1
author
#2 lore raw

PATCH v2 2/3 ftrace: Add cleanup to unregister_ftrace_direct_multi

In reply to Jiri Olsa

Adding ops cleanup to unregister_ftrace_direct_multi, so it can be reused in another register call.

Fixes f64dd4627ec6 ("ftrace: Add multi direct register/unregister interface")
---
 kernel/trace/ftrace.c | 4 ++++
 1 file changed, 4 insertions(+)
kernel/trace/ftrace.c +4 -0
index 7f0594e28226..be5f6b32a012 100644
@@ -5542,6 +5542,10 @@ int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr)
 	err = unregister_ftrace_function(ops);
 	remove_direct_functions_hash(hash, addr);
 	mutex_unlock(&direct_mutex);
+
+	/* cleanup for possible another register call */
+	ops->func = NULL;
+	ops->trampoline = 0;
 	return err;
 }
 EXPORT_SYMBOL_GPL(unregister_ftrace_direct_multi);
Signature · 1 line
2.33.1
author
#3 lore raw

PATCH v2 3/3 ftrace/samples: Add module to test multi direct modify interface

In reply to Jiri Olsa

Adding ftrace-direct-multi-modify.ko kernel module that uses modify_ftrace_direct_multi API. The core functionality is taken from ftrace-direct-modify.ko kernel module and changed to fit multi direct interface.

The init function creates kthread that periodically calls modify_ftrace_direct_multi to change the trampoline address for the direct ftrace_ops. The ftrace trace_pipe then shows trace from both trampolines.

---
 samples/ftrace/Makefile                     |   1 +
 samples/ftrace/ftrace-direct-multi-modify.c | 152 ++++++++++++++++++++
 2 files changed, 153 insertions(+)
 create mode 100644 samples/ftrace/ftrace-direct-multi-modify.c
samples/ftrace/Makefile +1 -0
index b9198e2eef28..faf8cdb79c5f 100644
@@ -4,6 +4,7 @@ obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct.o
 obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct-too.o
 obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace-direct-modify.o
 obj-$(CONFIG_SAMPLE_FTRACE_DIRECT_MULTI) += ftrace-direct-multi.o
+obj-$(CONFIG_SAMPLE_FTRACE_DIRECT_MULTI) += ftrace-direct-multi-modify.o
 
 CFLAGS_sample-trace-array.o := -I$(src)
 obj-$(CONFIG_SAMPLE_TRACE_ARRAY) += sample-trace-array.o
samples/ftrace/ftrace-direct-multi-modify.c new file +152 -0

152 lines not on this page · raw message

Signature · 1 line
2.33.1