rcu: Consolidate dumping of ftrace buffer
This commit consolidates a couple definitions and several calls for single-shot ftrace-buffer dumping. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
@@ -1144,4 +1144,17 @@ static inline void rcu_sysidle_force_exit(void)
|
|||||||
#endif /* #else #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */
|
#endif /* #else #ifdef CONFIG_NO_HZ_FULL_SYSIDLE */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dump the ftrace buffer, but only one time per callsite per boot.
|
||||||
|
*/
|
||||||
|
#define rcu_ftrace_dump(oops_dump_mode) \
|
||||||
|
do { \
|
||||||
|
static atomic_t ___rfd_beenhere = ATOMIC_INIT(0); \
|
||||||
|
\
|
||||||
|
if (!atomic_read(&___rfd_beenhere) && \
|
||||||
|
!atomic_xchg(&___rfd_beenhere, 1)) \
|
||||||
|
ftrace_dump(oops_dump_mode); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
#endif /* __LINUX_RCUPDATE_H */
|
#endif /* __LINUX_RCUPDATE_H */
|
||||||
|
|||||||
@@ -1082,17 +1082,6 @@ rcu_torture_fakewriter(void *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcutorture_trace_dump(void)
|
|
||||||
{
|
|
||||||
static atomic_t beenhere = ATOMIC_INIT(0);
|
|
||||||
|
|
||||||
if (atomic_read(&beenhere))
|
|
||||||
return;
|
|
||||||
if (atomic_xchg(&beenhere, 1) != 0)
|
|
||||||
return;
|
|
||||||
ftrace_dump(DUMP_ALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RCU torture reader from timer handler. Dereferences rcu_torture_current,
|
* RCU torture reader from timer handler. Dereferences rcu_torture_current,
|
||||||
* incrementing the corresponding element of the pipeline array. The
|
* incrementing the corresponding element of the pipeline array. The
|
||||||
@@ -1142,7 +1131,7 @@ static void rcu_torture_timer(unsigned long unused)
|
|||||||
if (pipe_count > 1) {
|
if (pipe_count > 1) {
|
||||||
do_trace_rcu_torture_read(cur_ops->name, &p->rtort_rcu, ts,
|
do_trace_rcu_torture_read(cur_ops->name, &p->rtort_rcu, ts,
|
||||||
started, completed);
|
started, completed);
|
||||||
rcutorture_trace_dump();
|
rcu_ftrace_dump(DUMP_ALL);
|
||||||
}
|
}
|
||||||
__this_cpu_inc(rcu_torture_count[pipe_count]);
|
__this_cpu_inc(rcu_torture_count[pipe_count]);
|
||||||
completed = completed - started;
|
completed = completed - started;
|
||||||
@@ -1215,7 +1204,7 @@ rcu_torture_reader(void *arg)
|
|||||||
if (pipe_count > 1) {
|
if (pipe_count > 1) {
|
||||||
do_trace_rcu_torture_read(cur_ops->name, &p->rtort_rcu,
|
do_trace_rcu_torture_read(cur_ops->name, &p->rtort_rcu,
|
||||||
ts, started, completed);
|
ts, started, completed);
|
||||||
rcutorture_trace_dump();
|
rcu_ftrace_dump(DUMP_ALL);
|
||||||
}
|
}
|
||||||
__this_cpu_inc(rcu_torture_count[pipe_count]);
|
__this_cpu_inc(rcu_torture_count[pipe_count]);
|
||||||
completed = completed - started;
|
completed = completed - started;
|
||||||
@@ -1333,7 +1322,7 @@ rcu_torture_stats_print(void)
|
|||||||
rcu_torture_writer_state,
|
rcu_torture_writer_state,
|
||||||
gpnum, completed, flags);
|
gpnum, completed, flags);
|
||||||
show_rcu_gp_kthreads();
|
show_rcu_gp_kthreads();
|
||||||
rcutorture_trace_dump();
|
rcu_ftrace_dump(DUMP_ALL);
|
||||||
}
|
}
|
||||||
rtcv_snap = rcu_torture_current_version;
|
rtcv_snap = rcu_torture_current_version;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -637,7 +637,7 @@ static void rcu_eqs_enter_common(long long oldval, bool user)
|
|||||||
idle_task(smp_processor_id());
|
idle_task(smp_processor_id());
|
||||||
|
|
||||||
trace_rcu_dyntick(TPS("Error on entry: not idle task"), oldval, 0);
|
trace_rcu_dyntick(TPS("Error on entry: not idle task"), oldval, 0);
|
||||||
ftrace_dump(DUMP_ORIG);
|
rcu_ftrace_dump(DUMP_ORIG);
|
||||||
WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
|
WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
|
||||||
current->pid, current->comm,
|
current->pid, current->comm,
|
||||||
idle->pid, idle->comm); /* must be idle task! */
|
idle->pid, idle->comm); /* must be idle task! */
|
||||||
@@ -799,7 +799,7 @@ static void rcu_eqs_exit_common(long long oldval, int user)
|
|||||||
|
|
||||||
trace_rcu_dyntick(TPS("Error on exit: not idle task"),
|
trace_rcu_dyntick(TPS("Error on exit: not idle task"),
|
||||||
oldval, rdtp->dynticks_nesting);
|
oldval, rdtp->dynticks_nesting);
|
||||||
ftrace_dump(DUMP_ORIG);
|
rcu_ftrace_dump(DUMP_ORIG);
|
||||||
WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
|
WARN_ONCE(1, "Current pid: %d comm: %s / Idle pid: %d comm: %s",
|
||||||
current->pid, current->comm,
|
current->pid, current->comm,
|
||||||
idle->pid, idle->comm); /* must be idle task! */
|
idle->pid, idle->comm); /* must be idle task! */
|
||||||
|
|||||||
Reference in New Issue
Block a user