diff options
Diffstat (limited to 'kernel/rcu/tasks.h')
| -rw-r--r-- | kernel/rcu/tasks.h | 26 | 
1 files changed, 13 insertions, 13 deletions
| diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h index e1bf33018e6d..ba3440a45b6d 100644 --- a/kernel/rcu/tasks.h +++ b/kernel/rcu/tasks.h @@ -858,7 +858,7 @@ static void rcu_tasks_wait_gp(struct rcu_tasks *rtp)  //	not know to synchronize with this RCU Tasks grace period) have  //	completed exiting.  The synchronize_rcu() in rcu_tasks_postgp()  //	will take care of any tasks stuck in the non-preemptible region -//	of do_exit() following its call to exit_tasks_rcu_stop(). +//	of do_exit() following its call to exit_tasks_rcu_finish().  // check_all_holdout_tasks(), repeatedly until holdout list is empty:  //	Scans the holdout list, attempting to identify a quiescent state  //	for each task on the list.  If there is a quiescent state, the @@ -1220,7 +1220,7 @@ void exit_tasks_rcu_start(void)   * Remove the task from the "yet another list" because do_exit() is now   * non-preemptible, allowing synchronize_rcu() to wait beyond this point.   */ -void exit_tasks_rcu_stop(void) +void exit_tasks_rcu_finish(void)  {  	unsigned long flags;  	struct rcu_tasks_percpu *rtpcp; @@ -1231,22 +1231,12 @@ void exit_tasks_rcu_stop(void)  	raw_spin_lock_irqsave_rcu_node(rtpcp, flags);  	list_del_init(&t->rcu_tasks_exit_list);  	raw_spin_unlock_irqrestore_rcu_node(rtpcp, flags); -} -/* - * Contribute to protect against tasklist scan blind spot while the - * task is exiting and may be removed from the tasklist. See - * corresponding synchronize_srcu() for further details. - */ -void exit_tasks_rcu_finish(void) -{ -	exit_tasks_rcu_stop(); -	exit_tasks_rcu_finish_trace(current); +	exit_tasks_rcu_finish_trace(t);  }  #else /* #ifdef CONFIG_TASKS_RCU */  void exit_tasks_rcu_start(void) { } -void exit_tasks_rcu_stop(void) { }  void exit_tasks_rcu_finish(void) { exit_tasks_rcu_finish_trace(current); }  #endif /* #else #ifdef CONFIG_TASKS_RCU */ @@ -1757,6 +1747,16 @@ static void rcu_tasks_trace_pregp_step(struct list_head *hop)  	// allow safe access to the hop list.  	for_each_online_cpu(cpu) {  		rcu_read_lock(); +		// Note that cpu_curr_snapshot() picks up the target +		// CPU's current task while its runqueue is locked with +		// an smp_mb__after_spinlock().  This ensures that either +		// the grace-period kthread will see that task's read-side +		// critical section or the task will see the updater's pre-GP +		// accesses.  The trailing smp_mb() in cpu_curr_snapshot() +		// does not currently play a role other than simplify +		// that function's ordering semantics.  If these simplified +		// ordering semantics continue to be redundant, that smp_mb() +		// might be removed.  		t = cpu_curr_snapshot(cpu);  		if (rcu_tasks_trace_pertask_prep(t, true))  			trc_add_holdout(t, hop); | 
