Commit 385680a9 authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Paul E. McKenney

rcu: Add event-trace markers to TREE_RCU kthreads

Add event-trace markers to TREE_RCU kthreads to allow including these
kthread's CPU time in the utilization calculations.
Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent eab0993c
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
* "Start <activity>" -- Mark the start of the specified activity, * "Start <activity>" -- Mark the start of the specified activity,
* such as "context switch". Nesting is permitted. * such as "context switch". Nesting is permitted.
* "End <activity>" -- Mark the end of the specified activity. * "End <activity>" -- Mark the end of the specified activity.
*
* An "@" character within "<activity>" is a comment character: Data
* reduction scripts will ignore the "@" and the remainder of the line.
*/ */
TRACE_EVENT(rcu_utilization, TRACE_EVENT(rcu_utilization,
......
...@@ -1219,9 +1219,12 @@ static int rcu_boost_kthread(void *arg) ...@@ -1219,9 +1219,12 @@ static int rcu_boost_kthread(void *arg)
int spincnt = 0; int spincnt = 0;
int more2boost; int more2boost;
trace_rcu_utilization("Start boost kthread@init");
for (;;) { for (;;) {
rnp->boost_kthread_status = RCU_KTHREAD_WAITING; rnp->boost_kthread_status = RCU_KTHREAD_WAITING;
trace_rcu_utilization("End boost kthread@rcu_wait");
rcu_wait(rnp->boost_tasks || rnp->exp_tasks); rcu_wait(rnp->boost_tasks || rnp->exp_tasks);
trace_rcu_utilization("Start boost kthread@rcu_wait");
rnp->boost_kthread_status = RCU_KTHREAD_RUNNING; rnp->boost_kthread_status = RCU_KTHREAD_RUNNING;
more2boost = rcu_boost(rnp); more2boost = rcu_boost(rnp);
if (more2boost) if (more2boost)
...@@ -1229,11 +1232,14 @@ static int rcu_boost_kthread(void *arg) ...@@ -1229,11 +1232,14 @@ static int rcu_boost_kthread(void *arg)
else else
spincnt = 0; spincnt = 0;
if (spincnt > 10) { if (spincnt > 10) {
trace_rcu_utilization("End boost kthread@rcu_yield");
rcu_yield(rcu_boost_kthread_timer, (unsigned long)rnp); rcu_yield(rcu_boost_kthread_timer, (unsigned long)rnp);
trace_rcu_utilization("Start boost kthread@rcu_yield");
spincnt = 0; spincnt = 0;
} }
} }
/* NOTREACHED */ /* NOTREACHED */
trace_rcu_utilization("End boost kthread@notreached");
return 0; return 0;
} }
...@@ -1490,9 +1496,12 @@ static int rcu_cpu_kthread(void *arg) ...@@ -1490,9 +1496,12 @@ static int rcu_cpu_kthread(void *arg)
char work; char work;
char *workp = &per_cpu(rcu_cpu_has_work, cpu); char *workp = &per_cpu(rcu_cpu_has_work, cpu);
trace_rcu_utilization("Start CPU kthread@init");
for (;;) { for (;;) {
*statusp = RCU_KTHREAD_WAITING; *statusp = RCU_KTHREAD_WAITING;
trace_rcu_utilization("End CPU kthread@rcu_wait");
rcu_wait(*workp != 0 || kthread_should_stop()); rcu_wait(*workp != 0 || kthread_should_stop());
trace_rcu_utilization("Start CPU kthread@rcu_wait");
local_bh_disable(); local_bh_disable();
if (rcu_cpu_kthread_should_stop(cpu)) { if (rcu_cpu_kthread_should_stop(cpu)) {
local_bh_enable(); local_bh_enable();
...@@ -1513,11 +1522,14 @@ static int rcu_cpu_kthread(void *arg) ...@@ -1513,11 +1522,14 @@ static int rcu_cpu_kthread(void *arg)
spincnt = 0; spincnt = 0;
if (spincnt > 10) { if (spincnt > 10) {
*statusp = RCU_KTHREAD_YIELDING; *statusp = RCU_KTHREAD_YIELDING;
trace_rcu_utilization("End CPU kthread@rcu_yield");
rcu_yield(rcu_cpu_kthread_timer, (unsigned long)cpu); rcu_yield(rcu_cpu_kthread_timer, (unsigned long)cpu);
trace_rcu_utilization("Start CPU kthread@rcu_yield");
spincnt = 0; spincnt = 0;
} }
} }
*statusp = RCU_KTHREAD_STOPPED; *statusp = RCU_KTHREAD_STOPPED;
trace_rcu_utilization("End CPU kthread@term");
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment