Skip to content

Commit 4c57d0b

Browse files
committed
tracing/fgraph: Have fgraph handle previous boot function addresses
Update the function graph code to modify the function addresses for a previous boot buffer so that it matches the current kallsyms (note this does not handle module addresses, yet). After a reboot, instead of seeing: # trace-cmd show -B boot_mapped | tail -n30 swapper/0-1 [000] d..2. 56.286470: 0) 0.481 us | 0xffffffff925da5c4(); swapper/0-1 [000] d.... 56.286471: 0) 4.065 us | } swapper/0-1 [000] d.... 56.286471: 0) 4.920 us | } swapper/0-1 [000] d..1. 56.286472: 0) | 0xffffffff92536254() { swapper/0-1 [000] d..1. 56.286472: 0) + 28.974 us | 0xffffffff92534e30(); swapper/0-1 [000] d.... 56.286516: 0) + 43.881 us | } swapper/0-1 [000] d..1. 56.286517: 0) | 0xffffffff925136c4() { swapper/0-1 [000] d..1. 56.286518: 0) | 0xffffffff92514a14() { swapper/0-1 [000] d..1. 56.286518: 0) 6.003 us | 0xffffffff92514200(); swapper/0-1 [000] d.... 56.286529: 0) + 11.510 us | } swapper/0-1 [000] d.... 56.286529: 0) + 12.895 us | } swapper/0-1 [000] d.... 56.286530: 0) ! 382.884 us | } swapper/0-1 [000] d..1. 56.286530: 0) | 0xffffffff92536444() { swapper/0-1 [000] d..1. 56.286531: 0) | 0xffffffff92536254() { swapper/0-1 [000] d..1. 56.286531: 0) + 26.335 us | 0xffffffff92534e30(); swapper/0-1 [000] d.... 56.286560: 0) + 29.511 us | } swapper/0-1 [000] d.... 56.286561: 0) + 30.452 us | } swapper/0-1 [000] d..1. 56.286562: 0) | 0xffffffff9253c014() { swapper/0-1 [000] d..1. 56.286562: 0) | 0xffffffff9253bed4() { swapper/0-1 [000] d..1. 56.286563: 0) + 13.465 us | 0xffffffff92536684(); swapper/0-1 [000] d.... 56.286577: 0) + 14.651 us | } swapper/0-1 [000] d.... 56.286577: 0) + 15.821 us | } swapper/0-1 [000] d..1. 56.286578: 0) 0.667 us | 0xffffffff92547074(); swapper/0-1 [000] d..1. 56.286579: 0) 0.453 us | 0xffffffff924f35c4(); swapper/0-1 [000] d.... 56.286580: 0) # 3906.348 us | } swapper/0-1 [000] d..1. 56.286581: 0) | 0xffffffff92531a14() { swapper/0-1 [000] d..1. 56.286581: 0) 0.518 us | 0xffffffff92505cb4(); swapper/0-1 [000] d..1. 56.286595: 0) | 0xffffffff92db83c4() { swapper/0-1 [000] d..1. 56.286596: 0) | 0xffffffff92dec2e4() { swapper/0-1 [000] d..1. 56.286597: 0) | 0xffffffff92db5304() { It now shows: # trace-cmd show -B boot_mapped | tail -n30 swapper/0-1 [000] d..2. 363.079099: 0) 0.483 us | preempt_count_sub(); swapper/0-1 [000] d.... 363.079100: 0) 4.112 us | } swapper/0-1 [000] d.... 363.079101: 0) 4.979 us | } swapper/0-1 [000] d..1. 363.079101: 0) | disable_local_APIC() { swapper/0-1 [000] d..1. 363.079102: 0) + 29.153 us | clear_local_APIC.part.0(); swapper/0-1 [000] d.... 363.079148: 0) + 46.517 us | } swapper/0-1 [000] d..1. 363.079149: 0) | mcheck_cpu_clear() { swapper/0-1 [000] d..1. 363.079149: 0) | mce_intel_feature_clear() { swapper/0-1 [000] d..1. 363.079150: 0) 5.871 us | lmce_supported(); swapper/0-1 [000] d.... 363.079161: 0) + 11.340 us | } swapper/0-1 [000] d.... 363.079161: 0) + 12.638 us | } swapper/0-1 [000] d.... 363.079162: 0) ! 383.518 us | } swapper/0-1 [000] d..1. 363.079162: 0) | lapic_shutdown() { swapper/0-1 [000] d..1. 363.079163: 0) | disable_local_APIC() { swapper/0-1 [000] d..1. 363.079163: 0) + 26.144 us | clear_local_APIC.part.0(); swapper/0-1 [000] d.... 363.079192: 0) + 29.424 us | } swapper/0-1 [000] d.... 363.079192: 0) + 30.376 us | } swapper/0-1 [000] d..1. 363.079193: 0) | restore_boot_irq_mode() { swapper/0-1 [000] d..1. 363.079194: 0) | native_restore_boot_irq_mode() { swapper/0-1 [000] d..1. 363.079194: 0) + 13.863 us | disconnect_bsp_APIC(); swapper/0-1 [000] d.... 363.079209: 0) + 14.933 us | } swapper/0-1 [000] d.... 363.079209: 0) + 16.009 us | } swapper/0-1 [000] d..1. 363.079210: 0) 0.694 us | hpet_disable(); swapper/0-1 [000] d..1. 363.079211: 0) 0.511 us | iommu_shutdown_noop(); swapper/0-1 [000] d.... 363.079212: 0) # 3980.260 us | } swapper/0-1 [000] d..1. 363.079212: 0) | native_machine_emergency_restart() { swapper/0-1 [000] d..1. 363.079213: 0) 0.495 us | tboot_shutdown(); swapper/0-1 [000] d..1. 363.079230: 0) | acpi_reboot() { swapper/0-1 [000] d..1. 363.079231: 0) | acpi_reset() { swapper/0-1 [000] d..1. 363.079232: 0) | acpi_os_write_port() { Cc: Masami Hiramatsu <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Ross Zwisler <[email protected]> Cc: Vincent Donnefort <[email protected]> Link: https://lore.kernel.org/[email protected] Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 29a02ec commit 4c57d0b

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

kernel/trace/trace_functions_graph.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ print_graph_irq(struct trace_iterator *iter, unsigned long addr,
544544
struct trace_seq *s = &iter->seq;
545545
struct trace_entry *ent = iter->ent;
546546

547+
addr += iter->tr->text_delta;
548+
547549
if (addr < (unsigned long)__irqentry_text_start ||
548550
addr >= (unsigned long)__irqentry_text_end)
549551
return;
@@ -710,13 +712,16 @@ print_graph_entry_leaf(struct trace_iterator *iter,
710712
struct ftrace_graph_ret *graph_ret;
711713
struct ftrace_graph_ent *call;
712714
unsigned long long duration;
715+
unsigned long func;
713716
int cpu = iter->cpu;
714717
int i;
715718

716719
graph_ret = &ret_entry->ret;
717720
call = &entry->graph_ent;
718721
duration = graph_ret->rettime - graph_ret->calltime;
719722

723+
func = call->func + iter->tr->text_delta;
724+
720725
if (data) {
721726
struct fgraph_cpu_data *cpu_data;
722727

@@ -747,10 +752,10 @@ print_graph_entry_leaf(struct trace_iterator *iter,
747752
* enabled.
748753
*/
749754
if (flags & __TRACE_GRAPH_PRINT_RETVAL)
750-
print_graph_retval(s, graph_ret->retval, true, (void *)call->func,
755+
print_graph_retval(s, graph_ret->retval, true, (void *)func,
751756
!!(flags & TRACE_GRAPH_PRINT_RETVAL_HEX));
752757
else
753-
trace_seq_printf(s, "%ps();\n", (void *)call->func);
758+
trace_seq_printf(s, "%ps();\n", (void *)func);
754759

755760
print_graph_irq(iter, graph_ret->func, TRACE_GRAPH_RET,
756761
cpu, iter->ent->pid, flags);
@@ -766,6 +771,7 @@ print_graph_entry_nested(struct trace_iterator *iter,
766771
struct ftrace_graph_ent *call = &entry->graph_ent;
767772
struct fgraph_data *data = iter->private;
768773
struct trace_array *tr = iter->tr;
774+
unsigned long func;
769775
int i;
770776

771777
if (data) {
@@ -788,7 +794,9 @@ print_graph_entry_nested(struct trace_iterator *iter,
788794
for (i = 0; i < call->depth * TRACE_GRAPH_INDENT; i++)
789795
trace_seq_putc(s, ' ');
790796

791-
trace_seq_printf(s, "%ps() {\n", (void *)call->func);
797+
func = call->func + iter->tr->text_delta;
798+
799+
trace_seq_printf(s, "%ps() {\n", (void *)func);
792800

793801
if (trace_seq_has_overflowed(s))
794802
return TRACE_TYPE_PARTIAL_LINE;
@@ -863,6 +871,8 @@ check_irq_entry(struct trace_iterator *iter, u32 flags,
863871
int *depth_irq;
864872
struct fgraph_data *data = iter->private;
865873

874+
addr += iter->tr->text_delta;
875+
866876
/*
867877
* If we are either displaying irqs, or we got called as
868878
* a graph event and private data does not exist,
@@ -990,11 +1000,14 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
9901000
unsigned long long duration = trace->rettime - trace->calltime;
9911001
struct fgraph_data *data = iter->private;
9921002
struct trace_array *tr = iter->tr;
1003+
unsigned long func;
9931004
pid_t pid = ent->pid;
9941005
int cpu = iter->cpu;
9951006
int func_match = 1;
9961007
int i;
9971008

1009+
func = trace->func + iter->tr->text_delta;
1010+
9981011
if (check_irq_return(iter, flags, trace->depth))
9991012
return TRACE_TYPE_HANDLED;
10001013

@@ -1033,7 +1046,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
10331046
* function-retval option is enabled.
10341047
*/
10351048
if (flags & __TRACE_GRAPH_PRINT_RETVAL) {
1036-
print_graph_retval(s, trace->retval, false, (void *)trace->func,
1049+
print_graph_retval(s, trace->retval, false, (void *)func,
10371050
!!(flags & TRACE_GRAPH_PRINT_RETVAL_HEX));
10381051
} else {
10391052
/*
@@ -1046,7 +1059,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s,
10461059
if (func_match && !(flags & TRACE_GRAPH_PRINT_TAIL))
10471060
trace_seq_puts(s, "}\n");
10481061
else
1049-
trace_seq_printf(s, "} /* %ps */\n", (void *)trace->func);
1062+
trace_seq_printf(s, "} /* %ps */\n", (void *)func);
10501063
}
10511064

10521065
/* Overrun */

0 commit comments

Comments
 (0)