|
@@ -843,9 +843,16 @@ print_graph_function(struct trace_iterator *iter)
|
|
|
|
|
|
switch (entry->type) {
|
|
switch (entry->type) {
|
|
case TRACE_GRAPH_ENT: {
|
|
case TRACE_GRAPH_ENT: {
|
|
- struct ftrace_graph_ent_entry *field;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * print_graph_entry() may consume the current event,
|
|
|
|
+ * thus @field may become invalid, so we need to save it.
|
|
|
|
+ * sizeof(struct ftrace_graph_ent_entry) is very small,
|
|
|
|
+ * it can be safely saved at the stack.
|
|
|
|
+ */
|
|
|
|
+ struct ftrace_graph_ent_entry *field, saved;
|
|
trace_assign_type(field, entry);
|
|
trace_assign_type(field, entry);
|
|
- return print_graph_entry(field, s, iter);
|
|
|
|
|
|
+ saved = *field;
|
|
|
|
+ return print_graph_entry(&saved, s, iter);
|
|
}
|
|
}
|
|
case TRACE_GRAPH_RET: {
|
|
case TRACE_GRAPH_RET: {
|
|
struct ftrace_graph_ret_entry *field;
|
|
struct ftrace_graph_ret_entry *field;
|