diff options
| -rw-r--r-- | include/linux/init_task.h | 1 | ||||
| -rw-r--r-- | kernel/rcutiny.c | 6 | ||||
| -rw-r--r-- | kernel/rcutorture.c | 2 | ||||
| -rw-r--r-- | kernel/rcutree.c | 4 | ||||
| -rw-r--r-- | kernel/rcutree_plugin.h | 2 | 
5 files changed, 14 insertions, 1 deletions
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index b1ed1cd8e2a..7996fc2c9ba 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -49,7 +49,6 @@ extern struct group_info init_groups;  		{ .first = &init_task.pids[PIDTYPE_PGID].node },	\  		{ .first = &init_task.pids[PIDTYPE_SID].node },		\  	},								\ -	.rcu		= RCU_HEAD_INIT,				\  	.level		= 0,						\  	.numbers	= { {						\  		.nr		= 0,					\ diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c index b1804ff83d5..38729d3cd23 100644 --- a/kernel/rcutiny.c +++ b/kernel/rcutiny.c @@ -245,11 +245,13 @@ void rcu_barrier(void)  {  	struct rcu_synchronize rcu; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(rcu_barrier); @@ -257,11 +259,13 @@ void rcu_barrier_bh(void)  {  	struct rcu_synchronize rcu; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu_bh(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(rcu_barrier_bh); @@ -269,11 +273,13 @@ void rcu_barrier_sched(void)  {  	struct rcu_synchronize rcu; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu_sched(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(rcu_barrier_sched); diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c index 58df55bf83e..077defb3457 100644 --- a/kernel/rcutorture.c +++ b/kernel/rcutorture.c @@ -464,9 +464,11 @@ static void rcu_bh_torture_synchronize(void)  {  	struct rcu_bh_torture_synchronize rcu; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	call_rcu_bh(&rcu.head, rcu_bh_torture_wakeme_after_cb);  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  static struct rcu_torture_ops rcu_bh_ops = { diff --git a/kernel/rcutree.c b/kernel/rcutree.c index ba6996943e2..d4437345706 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -1484,11 +1484,13 @@ void synchronize_sched(void)  	if (rcu_blocking_is_gp())  		return; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu_sched(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(synchronize_sched); @@ -1508,11 +1510,13 @@ void synchronize_rcu_bh(void)  	if (rcu_blocking_is_gp())  		return; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu_bh(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(synchronize_rcu_bh); diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index ac7d80fa895..0e4f420245d 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h @@ -557,11 +557,13 @@ void synchronize_rcu(void)  	if (!rcu_scheduler_active)  		return; +	init_rcu_head_on_stack(&rcu.head);  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu(&rcu.head, wakeme_after_rcu);  	/* Wait for it. */  	wait_for_completion(&rcu.completion); +	destroy_rcu_head_on_stack(&rcu.head);  }  EXPORT_SYMBOL_GPL(synchronize_rcu);  |