diff options
Diffstat (limited to 'kernel/rcutree_plugin.h')
| -rw-r--r-- | kernel/rcutree_plugin.h | 22 | 
1 files changed, 19 insertions, 3 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 94d9ca1e406..bdb2e82f78d 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h @@ -124,6 +124,8 @@ static void rcu_preempt_qs(int cpu)  	rdp->passed_quiesc_completed = rdp->gpnum - 1;  	barrier(); +	if (rdp->passed_quiesc == 0) +		trace_rcu_grace_period("rcu_preempt", rdp->gpnum, "cpuqs");  	rdp->passed_quiesc = 1;  	current->rcu_read_unlock_special &= ~RCU_READ_UNLOCK_NEED_QS;  } @@ -190,6 +192,11 @@ static void rcu_preempt_note_context_switch(int cpu)  			if (rnp->qsmask & rdp->grpmask)  				rnp->gp_tasks = &t->rcu_node_entry;  		} +		trace_rcu_preempt_task(rdp->rsp->name, +				       t->pid, +				       (rnp->qsmask & rdp->grpmask) +				       ? rnp->gpnum +				       : rnp->gpnum + 1);  		raw_spin_unlock_irqrestore(&rnp->lock, flags);  	} else if (t->rcu_read_lock_nesting < 0 &&  		   t->rcu_read_unlock_special) { @@ -344,6 +351,8 @@ static noinline void rcu_read_unlock_special(struct task_struct *t)  		smp_mb(); /* ensure expedited fastpath sees end of RCU c-s. */  		np = rcu_next_node_entry(t, rnp);  		list_del_init(&t->rcu_node_entry); +		trace_rcu_unlock_preempted_task("rcu_preempt", +						rnp->gpnum, t->pid);  		if (&t->rcu_node_entry == rnp->gp_tasks)  			rnp->gp_tasks = np;  		if (&t->rcu_node_entry == rnp->exp_tasks) @@ -364,10 +373,17 @@ static noinline void rcu_read_unlock_special(struct task_struct *t)  		 * we aren't waiting on any CPUs, report the quiescent state.  		 * Note that rcu_report_unblock_qs_rnp() releases rnp->lock.  		 */ -		if (empty) -			raw_spin_unlock_irqrestore(&rnp->lock, flags); -		else +		if (!empty && !rcu_preempt_blocked_readers_cgp(rnp)) { +			trace_rcu_quiescent_state_report("preempt_rcu", +							 rnp->gpnum, +							 0, rnp->qsmask, +							 rnp->level, +							 rnp->grplo, +							 rnp->grphi, +							 !!rnp->gp_tasks);  			rcu_report_unblock_qs_rnp(rnp, flags); +		} else +			raw_spin_unlock_irqrestore(&rnp->lock, flags);  #ifdef CONFIG_RCU_BOOST  		/* Unboost if we were boosted. */  |