Since KERN_CONT became meaningful again, lockdep stack traces have had annoying extra newlines, like this: [ 5.561122] -> #1 (B){+.+...}: [ 5.561528] [ 5.561532] [<ffffffff810d8873>] lock_acquire+0xc3/0x210 [ 5.562178] [ 5.562181] [<ffffffff816f6414>] mutex_lock_nested+0x74/0x6d0 [ 5.562861] [ 5.562880] [<ffffffffa01aa3c3>] init_btrfs_fs+0x21/0x196 [btrfs] [ 5.563717] [ 5.563721] [<ffffffff81000472>] do_one_initcall+0x52/0x1b0 [ 5.564554] [ 5.564559] [<ffffffff811a3af6>] do_init_module+0x5f/0x209 [ 5.565357] [ 5.565361] [<ffffffff81122f4d>] load_module+0x218d/0x2b80 [ 5.566020] [ 5.566021] [<ffffffff81123beb>] SyS_finit_module+0xeb/0x120 [ 5.566694] [ 5.566696] [<ffffffff816fd241>] entry_SYSCALL_64_fastpath+0x1f/0xc2 That's happening because each printk() call now gets printed on its own line, and we do a separate call to print the spaces before the symbol. Fix it by doing the printk() directly instead of using the print_ip_sym() helper. Additionally, the symbol address isn't very helpful, so let's get rid of that, too. The final result looks like this: [ 5.194518] -> #1 (B){+.+...}: [ 5.195002] lock_acquire+0xc3/0x210 [ 5.195439] mutex_lock_nested+0x74/0x6d0 [ 5.196491] do_one_initcall+0x52/0x1b0 [ 5.196939] do_init_module+0x5f/0x209 [ 5.197355] load_module+0x218d/0x2b80 [ 5.197792] SyS_finit_module+0xeb/0x120 [ 5.198251] entry_SYSCALL_64_fastpath+0x1f/0xc2
Showing the changes to kernel/stacktrace.c (1 of 1 file). Show all
Unified · Split
| @@ -18,10 +18,8 @@ void print_stack_trace(struct stack_trace *trace, int spaces) · 17 unmodified lines | |||
| 18 | if (WARN_ON(!trace->entries)) | 18 | if (WARN_ON(!trace->entries)) |
| 19 | return; | 19 | return; |
| 20 | 20 | ||
| 21 | for (i = 0; i < trace->nr_entries; i++) { | 21 | for (i = 0; i < trace->nr_entries; i++) |
| 22 | printk("%*c", 1 + spaces, ' '); | 22 | printk("%*c%pS\n", 1 + spaces, ' ', (void *)trace->entries[i]); |
| 23 | print_ip_sym(trace->entries[i]); | ||
| 24 | } | ||
| 25 | } | 23 | } |
| 26 | EXPORT_SYMBOL_GPL(print_stack_trace); | 24 | EXPORT_SYMBOL_GPL(print_stack_trace); |
| 27 | 25 | ||
| @@ -29,7 +27,6 @@ int snprint_stack_trace(char *buf, size_t size, · 1 unmodified line | |||
| 29 | struct stack_trace *trace, int spaces) | 27 | struct stack_trace *trace, int spaces) |
| 30 | { | 28 | { |
| 31 | int i; | 29 | int i; |
| 32 | unsigned long ip; | ||
| 33 | int generated; | 30 | int generated; |
| 34 | int total = 0; | 31 | int total = 0; |
| 35 | 32 | ||
| @@ -37,9 +34,8 @@ int snprint_stack_trace(char *buf, size_t size, · 1 unmodified line | |||
| 37 | return 0; | 34 | return 0; |
| 38 | 35 | ||
| 39 | for (i = 0; i < trace->nr_entries; i++) { | 36 | for (i = 0; i < trace->nr_entries; i++) { |
| 40 | ip = trace->entries[i]; | 37 | generated = snprintf(buf, size, "%*c%pS\n", 1 + spaces, ' ', |
| 41 | generated = snprintf(buf, size, "%*c[<%p>] %pS\n", | 38 | (void *)trace->entries[i]); |
| 42 | 1 + spaces, ' ', (void *) ip, (void *) ip); | ||
| 43 | 39 | ||
| 44 | total += generated; | 40 | total += generated; |
| 45 | 41 | ||