[PATCH 3/3] tracing: make tp_printk work on syscall tracepoints
From: Jeff Xie
Date: Tue Mar 29 2022 - 12:40:11 EST
Adding printk for syscall tracepoints for the tp_printk work.
Signed-off-by: Jeff Xie <xiehuan09@xxxxxxxxx>
---
kernel/trace/trace_syscalls.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
index f755bde42fd0..9798122166d3 100644
--- a/kernel/trace/trace_syscalls.c
+++ b/kernel/trace/trace_syscalls.c
@@ -290,6 +290,25 @@ static int __init syscall_enter_define_fields(struct trace_event_call *call)
return ret;
}
+static void syscall_output_printk(struct trace_entry *ent,
+ struct trace_event_file *trace_file, struct trace_array *tr)
+{
+ unsigned long flags;
+ struct trace_iterator *iter = tracepoint_print_iter;
+ struct trace_event *event = &trace_file->event_call->event;
+
+ spin_lock_irqsave(&tracepoint_iter_lock, flags);
+
+ trace_seq_init(&iter->seq);
+ iter->ent = ent;
+ iter->tr = tr;
+ event->funcs->trace(iter, 0, event);
+ trace_seq_putc(&iter->seq, 0);
+ pr_info("%s", iter->seq.buffer);
+
+ spin_unlock_irqrestore(&tracepoint_iter_lock, flags);
+}
+
static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
{
struct trace_array *tr = data;
@@ -333,6 +352,9 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)
syscall_get_arguments(current, regs, args);
memcpy(entry->args, args, sizeof(unsigned long) * sys_data->nb_args);
+ if (static_key_false(&tracepoint_printk_key.key))
+ syscall_output_printk(&entry->ent, trace_file, tr);
+
event_trigger_unlock_commit(trace_file, buffer, event, entry,
trace_ctx);
}
@@ -376,6 +398,9 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)
entry->nr = syscall_nr;
entry->ret = syscall_get_return_value(current, regs);
+ if (static_key_false(&tracepoint_printk_key.key))
+ syscall_output_printk(&entry->ent, trace_file, tr);
+
event_trigger_unlock_commit(trace_file, buffer, event, entry,
trace_ctx);
}
--
2.25.1