From 234bb98bf8d2daec29e5c6886f3a7be38dadb513 Mon Sep 17 00:00:00 2001 From: Prateek Sood Date: Thu, 31 Oct 2024 16:38:35 +0800 Subject: [PATCH] ANDROID: ftrace: add more vendor hook for ftrace dump on oops The aosp/1562075 add the following vendor hooks in ftrace oops path to allow vendor modules to get ftrace buffer data. 1) android_vh_ftrace_oops_enter 2) android_vh_ftrace_size_check 3) android_vh_ftrace_format_check 4) android_vh_ftrace_dump_buffer 5) android_vh_ftrace_oops_exit Ftrace dump on oops can be controlled with kernel command line parameter ftrace_dump_on_oops. However the commit b8e1f899fc6b ("ANDROID: ftrace: vendor hook for ftrace dump on oops") only cherry-pick android_vh_ftrace_format_check vh. But following vendor hooks in ftrace oops path was not added. 1) android_vh_ftrace_oops_enter 2) android_vh_ftrace_size_check 3) android_vh_ftrace_dump_buffer 4) android_vh_ftrace_oops_exit So add these to allow vendor modules to get ftrace buffer data. Bug: 177387994 Signed-off-by: Prateek Sood Signed-off-by: Mukesh Ojha [xuewen: minor conflicts fixups] Change-Id: I00328101bc7e1092ce7a0b50c2d47ab8288e0067 Signed-off-by: Xuewen Yan (cherry picked from commit fbbc48ef1854f36aba48538b3034c884878d9a65) --- drivers/android/vendor_hooks.c | 4 ++++ include/trace/hooks/ftrace_dump.h | 16 ++++++++++++++++ kernel/trace/trace.c | 21 +++++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index cc1e05dfa6db..130b15921a38 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -123,7 +123,11 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_show_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_uninterruptible_tasks); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_uninterruptible_tasks_dn); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_oops_enter); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_oops_exit); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_size_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_format_check); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_dump_buffer); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cma_alloc_bypass); diff --git a/include/trace/hooks/ftrace_dump.h b/include/trace/hooks/ftrace_dump.h index 46570e918a58..7d409064e227 100644 --- a/include/trace/hooks/ftrace_dump.h +++ b/include/trace/hooks/ftrace_dump.h @@ -9,10 +9,26 @@ #include +DECLARE_HOOK(android_vh_ftrace_oops_enter, + TP_PROTO(bool *ftrace_check), + TP_ARGS(ftrace_check)); + +DECLARE_HOOK(android_vh_ftrace_oops_exit, + TP_PROTO(bool *ftrace_check), + TP_ARGS(ftrace_check)); + +DECLARE_HOOK(android_vh_ftrace_size_check, + TP_PROTO(unsigned long size, bool *ftrace_check), + TP_ARGS(size, ftrace_check)); + DECLARE_HOOK(android_vh_ftrace_format_check, TP_PROTO(bool *ftrace_check), TP_ARGS(ftrace_check)); +DECLARE_HOOK(android_vh_ftrace_dump_buffer, + TP_PROTO(struct trace_seq *trace_buf, bool *dump_printk), + TP_ARGS(trace_buf, dump_printk)); + #endif /* _TRACE_HOOK_FTRACE_DUMP_H */ /* This part must be outside protection */ #include diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4eb9eda44203..9fd71960e471 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -10166,7 +10166,11 @@ static struct notifier_block trace_die_notifier = { static int trace_die_panic_handler(struct notifier_block *self, unsigned long ev, void *unused) { - if (!ftrace_dump_on_oops_enabled()) + bool ftrace_check = false; + + trace_android_vh_ftrace_oops_enter(&ftrace_check); + + if (!ftrace_dump_on_oops_enabled() || ftrace_check) return NOTIFY_DONE; /* The die notifier requires DIE_OOPS to trigger */ @@ -10175,6 +10179,7 @@ static int trace_die_panic_handler(struct notifier_block *self, ftrace_dump(DUMP_PARAM); + trace_android_vh_ftrace_oops_exit(&ftrace_check); return NOTIFY_DONE; } @@ -10194,6 +10199,8 @@ static int trace_die_panic_handler(struct notifier_block *self, void trace_printk_seq(struct trace_seq *s) { + bool dump_printk = true; + /* Probably should print a warning here. */ if (s->seq.len >= TRACE_MAX_PRINT) s->seq.len = TRACE_MAX_PRINT; @@ -10209,7 +10216,9 @@ trace_printk_seq(struct trace_seq *s) /* should be zero ended, but we are paranoid. */ s->buffer[s->seq.len] = 0; - printk(KERN_TRACE "%s", s->buffer); + trace_android_vh_ftrace_dump_buffer(s, &dump_printk); + if (dump_printk) + printk(KERN_TRACE "%s", s->buffer); trace_seq_init(s); } @@ -10252,6 +10261,8 @@ static void ftrace_dump_one(struct trace_array *tr, enum ftrace_dump_mode dump_m unsigned long flags; int cnt = 0, cpu; bool ftrace_check = true; + bool ftrace_size_check = false; + unsigned long size; /* * Always turn off tracing when we dump. @@ -10270,6 +10281,8 @@ static void ftrace_dump_one(struct trace_array *tr, enum ftrace_dump_mode dump_m for_each_tracing_cpu(cpu) { atomic_inc(&per_cpu_ptr(iter.array_buffer->data, cpu)->disabled); + size = ring_buffer_size(iter.array_buffer->buffer, cpu); + trace_android_vh_ftrace_size_check(size, &ftrace_size_check); } old_userobj = tr->trace_flags & TRACE_ITER_SYM_USEROBJ; @@ -10277,6 +10290,9 @@ static void ftrace_dump_one(struct trace_array *tr, enum ftrace_dump_mode dump_m /* don't look at user memory in panic mode */ tr->trace_flags &= ~TRACE_ITER_SYM_USEROBJ; + if (ftrace_size_check) + goto out_enable; + if (dump_mode == DUMP_ORIG) iter.cpu_file = raw_smp_processor_id(); else @@ -10335,6 +10351,7 @@ static void ftrace_dump_one(struct trace_array *tr, enum ftrace_dump_mode dump_m else printk(KERN_TRACE "---------------------------------\n"); +out_enable: tr->trace_flags |= old_userobj; for_each_tracing_cpu(cpu) {