From 58ac9d3f1844701f68444ecf6228e92a575809c4 Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Sat, 23 Jan 2021 09:22:48 -0600 Subject: [PATCH] LU-14099 build: Fix for unconfigured arch_stackwalk On aarch64 CONFIG_ARCH_STACKWALK is not defined and print_stack_trace is not available. Replace print_stack_trace with an open-coded variant using %pB introduced in Linux v2.6.38-6557-g0f77a8d37825 This also fixes the symbols lookup of stack_trace_save_tsk using kallsyms at module init time over the use of symbol_get. HPE-bug-id: LUS-9518 Signed-off-by: Shaun Tancheff Change-Id: I04c3a0a84bb1a05d813a90502d1ed0f5bb2e33ab Reviewed-on: https://review.whamcloud.com/40503 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Jian Yu Tested-by: Jian Yu Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- libcfs/include/libcfs/libcfs_debug.h | 2 ++ libcfs/libcfs/debug.c | 36 ++++++++++++++++++++++++++---------- libcfs/libcfs/module.c | 2 ++ 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/libcfs/include/libcfs/libcfs_debug.h b/libcfs/include/libcfs/libcfs_debug.h index f3a328c..cfbfafe 100644 --- a/libcfs/include/libcfs/libcfs_debug.h +++ b/libcfs/include/libcfs/libcfs_debug.h @@ -298,4 +298,6 @@ int cfs_trace_copyout_string(char __user *usr_buffer, int usr_buffer_nob, #define LIBCFS_DEBUG_FILE_PATH_DEFAULT "/tmp/lustre-log" +void cfs_debug_init(void); + #endif /* __LIBCFS_DEBUG_H__ */ diff --git a/libcfs/libcfs/debug.c b/libcfs/libcfs/debug.c index 512f64f..b6d8b42 100644 --- a/libcfs/libcfs/debug.c +++ b/libcfs/libcfs/debug.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "tracefile.h" static char debug_file_name[1024]; @@ -486,6 +487,18 @@ do { \ } while (0) #endif +static void cfs_print_stack_trace(unsigned long *entries, unsigned int nr) +{ + unsigned int i; + + /* Prefer %pB for backtraced symbolic names since it was added in: + * Linux v2.6.38-6557-g0f77a8d37825 + * vsprintf: Introduce %pB format specifier + */ + for (i = 0; i < nr; i++) + pr_info("[<0>] %pB\n", (void *)entries[i]); +} + #define MAX_ST_ENTRIES 100 static DEFINE_SPINLOCK(st_lock); @@ -501,15 +514,20 @@ typedef unsigned int (stack_trace_save_tsk_t)(struct task_struct *task, static stack_trace_save_tsk_t *task_dump_stack; #endif -static void libcfs_call_trace(struct task_struct *tsk) +void __init cfs_debug_init(void) { #ifdef CONFIG_ARCH_STACKWALK - static unsigned long entries[MAX_ST_ENTRIES]; - unsigned int i, nr_entries; + task_dump_stack = (void *) + kallsyms_lookup_name("stack_trace_save_tsk"); - if (!task_dump_stack) - task_dump_stack = (stack_trace_save_tsk_t *) - symbol_get("stack_trace_save_tsk"); +#endif +} + +static void libcfs_call_trace(struct task_struct *tsk) +{ + static unsigned long entries[MAX_ST_ENTRIES]; +#ifdef CONFIG_ARCH_STACKWALK + unsigned int nr_entries; spin_lock(&st_lock); pr_info("Pid: %d, comm: %.20s %s %s\n", tsk->pid, tsk->comm, @@ -517,13 +535,11 @@ static void libcfs_call_trace(struct task_struct *tsk) pr_info("Call Trace TBD:\n"); if (task_dump_stack) { nr_entries = task_dump_stack(tsk, entries, MAX_ST_ENTRIES, 0); - for (i = 0; i < nr_entries; i++) - pr_info("[<0>] %pB\n", (void *)entries[i]); + cfs_print_stack_trace(entries, nr_entries); } spin_unlock(&st_lock); #else struct stack_trace trace; - static unsigned long entries[MAX_ST_ENTRIES]; trace.nr_entries = 0; trace.max_entries = MAX_ST_ENTRIES; @@ -535,7 +551,7 @@ static void libcfs_call_trace(struct task_struct *tsk) init_utsname()->release, init_utsname()->version); pr_info("Call Trace:\n"); save_stack_trace_tsk(tsk, &trace); - print_stack_trace(&trace, 0); + cfs_print_stack_trace(trace.entries, trace.nr_entries); spin_unlock(&st_lock); #endif } diff --git a/libcfs/libcfs/module.c b/libcfs/libcfs/module.c index 51a3ce4..583a1fb 100644 --- a/libcfs/libcfs/module.c +++ b/libcfs/libcfs/module.c @@ -729,6 +729,8 @@ static int __init libcfs_init(void) return (rc); } + cfs_debug_init(); + rc = cfs_cpu_init(); if (rc != 0) goto cleanup_debug; -- 1.8.3.1