Since kprobe-events use event_trigger_unlock_commit_regs() directly,
that events doesn't show up in printk buffer if "tp_printk" is set.

Use trace_event_buffer_commit() in kprobe events so that it can
invoke output_printk() as same as other trace events.

Signed-off-by: Masami Hiramatsu <mhira...@kernel.org>
---
 include/linux/trace_events.h |    1 +
 kernel/trace/trace.c         |    4 +--
 kernel/trace/trace_events.c  |    1 +
 kernel/trace/trace_kprobe.c  |   57 +++++++++++++++++++++---------------------
 4 files changed, 32 insertions(+), 31 deletions(-)

diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 8a62731673f7..9f3ddbdb4955 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -210,6 +210,7 @@ struct trace_event_buffer {
        void                            *entry;
        unsigned long                   flags;
        int                             pc;
+       struct pt_regs                  *regs;
 };
 
 void *trace_event_buffer_reserve(struct trace_event_buffer *fbuffer,
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 4a6154f8abdb..6530f6004643 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2572,9 +2572,9 @@ void trace_event_buffer_commit(struct trace_event_buffer 
*fbuffer)
        if (static_key_false(&tracepoint_printk_key.key))
                output_printk(fbuffer);
 
-       event_trigger_unlock_commit(fbuffer->trace_file, fbuffer->buffer,
+       event_trigger_unlock_commit_regs(fbuffer->trace_file, fbuffer->buffer,
                                    fbuffer->event, fbuffer->entry,
-                                   fbuffer->flags, fbuffer->pc);
+                                   fbuffer->flags, fbuffer->pc, fbuffer->regs);
 }
 EXPORT_SYMBOL_GPL(trace_event_buffer_commit);
 
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index edc72f3b080c..733ae975e7b8 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -279,6 +279,7 @@ void *trace_event_buffer_reserve(struct trace_event_buffer 
*fbuffer,
        if (!fbuffer->event)
                return NULL;
 
+       fbuffer->regs = NULL;
        fbuffer->entry = ring_buffer_event_data(fbuffer->event);
        return fbuffer->entry;
 }
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 7958da2fd922..3eb03cf880e1 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -1025,10 +1025,8 @@ __kprobe_trace_func(struct trace_kprobe *tk, struct 
pt_regs *regs,
                    struct trace_event_file *trace_file)
 {
        struct kprobe_trace_entry_head *entry;
-       struct ring_buffer_event *event;
-       struct ring_buffer *buffer;
-       int size, dsize, pc;
-       unsigned long irq_flags;
+       struct trace_event_buffer fbuffer;
+       int dsize;
        struct trace_event_call *call = &tk->tp.call;
 
        WARN_ON(call != trace_file->event_call);
@@ -1036,24 +1034,26 @@ __kprobe_trace_func(struct trace_kprobe *tk, struct 
pt_regs *regs,
        if (trace_trigger_soft_disabled(trace_file))
                return;
 
-       local_save_flags(irq_flags);
-       pc = preempt_count();
+       local_save_flags(fbuffer.flags);
+       fbuffer.pc = preempt_count();
+       fbuffer.trace_file = trace_file;
 
        dsize = __get_data_size(&tk->tp, regs);
-       size = sizeof(*entry) + tk->tp.size + dsize;
 
-       event = trace_event_buffer_lock_reserve(&buffer, trace_file,
-                                               call->event.type,
-                                               size, irq_flags, pc);
-       if (!event)
+       fbuffer.event =
+               trace_event_buffer_lock_reserve(&fbuffer.buffer, trace_file,
+                                       call->event.type,
+                                       sizeof(*entry) + tk->tp.size + dsize,
+                                       fbuffer.flags, fbuffer.pc);
+       if (!fbuffer.event)
                return;
 
-       entry = ring_buffer_event_data(event);
+       fbuffer.regs = regs;
+       entry = fbuffer.entry = ring_buffer_event_data(fbuffer.event);
        entry->ip = (unsigned long)tk->rp.kp.addr;
        store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
 
-       event_trigger_unlock_commit_regs(trace_file, buffer, event,
-                                        entry, irq_flags, pc, regs);
+       trace_event_buffer_commit(&fbuffer);
 }
 
 static void
@@ -1073,36 +1073,35 @@ __kretprobe_trace_func(struct trace_kprobe *tk, struct 
kretprobe_instance *ri,
                       struct trace_event_file *trace_file)
 {
        struct kretprobe_trace_entry_head *entry;
-       struct ring_buffer_event *event;
-       struct ring_buffer *buffer;
-       int size, pc, dsize;
-       unsigned long irq_flags;
+       struct trace_event_buffer fbuffer;
        struct trace_event_call *call = &tk->tp.call;
+       int dsize;
 
        WARN_ON(call != trace_file->event_call);
 
        if (trace_trigger_soft_disabled(trace_file))
                return;
 
-       local_save_flags(irq_flags);
-       pc = preempt_count();
+       local_save_flags(fbuffer.flags);
+       fbuffer.pc = preempt_count();
+       fbuffer.trace_file = trace_file;
 
        dsize = __get_data_size(&tk->tp, regs);
-       size = sizeof(*entry) + tk->tp.size + dsize;
-
-       event = trace_event_buffer_lock_reserve(&buffer, trace_file,
-                                               call->event.type,
-                                               size, irq_flags, pc);
-       if (!event)
+       fbuffer.event =
+               trace_event_buffer_lock_reserve(&fbuffer.buffer, trace_file,
+                                       call->event.type,
+                                       sizeof(*entry) + tk->tp.size + dsize,
+                                       fbuffer.flags, fbuffer.pc);
+       if (!fbuffer.event)
                return;
 
-       entry = ring_buffer_event_data(event);
+       fbuffer.regs = regs;
+       entry = fbuffer.entry = ring_buffer_event_data(fbuffer.event);
        entry->func = (unsigned long)tk->rp.kp.addr;
        entry->ret_ip = (unsigned long)ri->ret_addr;
        store_trace_args(&entry[1], &tk->tp, regs, sizeof(*entry), dsize);
 
-       event_trigger_unlock_commit_regs(trace_file, buffer, event,
-                                        entry, irq_flags, pc, regs);
+       trace_event_buffer_commit(&fbuffer);
 }
 
 static void

Reply via email to