1

rcu/tasks: Add rcu_barrier_tasks*() start time to diagnostics

This commit adds the start time, in jiffies, of the most recently started
rcu_barrier_tasks*() operation to the diagnostic output used by rcuscale.
This information can be helpful in distinguishing a hung barrier operation
from a long series of barrier operations.

Signed-off-by: "Paul E. McKenney" <paulmck@kernel.org>
Signed-off-by: Neeraj Upadhyay <neeraj.upadhyay@kernel.org>
This commit is contained in:
Paul E. McKenney 2024-08-01 17:34:26 -07:00 committed by Neeraj Upadhyay
parent fe91cf39db
commit 591ce64081

View File

@ -87,6 +87,7 @@ struct rcu_tasks_percpu {
* @barrier_q_count: Number of queues being waited on. * @barrier_q_count: Number of queues being waited on.
* @barrier_q_completion: Barrier wait/wakeup mechanism. * @barrier_q_completion: Barrier wait/wakeup mechanism.
* @barrier_q_seq: Sequence number for barrier operations. * @barrier_q_seq: Sequence number for barrier operations.
* @barrier_q_start: Most recent barrier start in jiffies.
* @name: This flavor's textual name. * @name: This flavor's textual name.
* @kname: This flavor's kthread name. * @kname: This flavor's kthread name.
*/ */
@ -122,6 +123,7 @@ struct rcu_tasks {
atomic_t barrier_q_count; atomic_t barrier_q_count;
struct completion barrier_q_completion; struct completion barrier_q_completion;
unsigned long barrier_q_seq; unsigned long barrier_q_seq;
unsigned long barrier_q_start;
char *name; char *name;
char *kname; char *kname;
}; };
@ -430,6 +432,7 @@ static void __maybe_unused rcu_barrier_tasks_generic(struct rcu_tasks *rtp)
mutex_unlock(&rtp->barrier_q_mutex); mutex_unlock(&rtp->barrier_q_mutex);
return; return;
} }
rtp->barrier_q_start = jiffies;
rcu_seq_start(&rtp->barrier_q_seq); rcu_seq_start(&rtp->barrier_q_seq);
init_completion(&rtp->barrier_q_completion); init_completion(&rtp->barrier_q_completion);
atomic_set(&rtp->barrier_q_count, 2); atomic_set(&rtp->barrier_q_count, 2);
@ -785,8 +788,9 @@ static void rcu_tasks_torture_stats_print_generic(struct rcu_tasks *rtp, char *t
pr_cont(".\n"); pr_cont(".\n");
else else
pr_cont(" (none).\n"); pr_cont(" (none).\n");
pr_alert("\tBarrier seq %lu count %d holdout CPUs ", pr_alert("\tBarrier seq %lu start %lu count %d holdout CPUs ",
data_race(rtp->barrier_q_seq), atomic_read(&rtp->barrier_q_count)); data_race(rtp->barrier_q_seq), j - data_race(rtp->barrier_q_start),
atomic_read(&rtp->barrier_q_count));
if (cpumask_available(cm) && !cpumask_empty(cm)) if (cpumask_available(cm) && !cpumask_empty(cm))
pr_cont(" %*pbl.\n", cpumask_pr_args(cm)); pr_cont(" %*pbl.\n", cpumask_pr_args(cm));
else else