diff options
Diffstat (limited to 'kernel/rcutiny.c')
| -rw-r--r-- | kernel/rcutiny.c | 21 | 
1 files changed, 11 insertions, 10 deletions
| diff --git a/kernel/rcutiny.c b/kernel/rcutiny.c index a0714a51b6d..aa344111de3 100644 --- a/kernel/rcutiny.c +++ b/kernel/rcutiny.c @@ -44,7 +44,6 @@  /* Forward declarations for rcutiny_plugin.h. */  struct rcu_ctrlblk; -static void invoke_rcu_callbacks(void);  static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp);  static void rcu_process_callbacks(struct softirq_action *unused);  static void __call_rcu(struct rcu_head *head, @@ -205,7 +204,7 @@ static int rcu_is_cpu_rrupt_from_idle(void)   */  static int rcu_qsctr_help(struct rcu_ctrlblk *rcp)  { -	reset_cpu_stall_ticks(rcp); +	RCU_TRACE(reset_cpu_stall_ticks(rcp));  	if (rcp->rcucblist != NULL &&  	    rcp->donetail != rcp->curtail) {  		rcp->donetail = rcp->curtail; @@ -227,7 +226,7 @@ void rcu_sched_qs(int cpu)  	local_irq_save(flags);  	if (rcu_qsctr_help(&rcu_sched_ctrlblk) +  	    rcu_qsctr_help(&rcu_bh_ctrlblk)) -		invoke_rcu_callbacks(); +		raise_softirq(RCU_SOFTIRQ);  	local_irq_restore(flags);  } @@ -240,7 +239,7 @@ void rcu_bh_qs(int cpu)  	local_irq_save(flags);  	if (rcu_qsctr_help(&rcu_bh_ctrlblk)) -		invoke_rcu_callbacks(); +		raise_softirq(RCU_SOFTIRQ);  	local_irq_restore(flags);  } @@ -252,12 +251,11 @@ void rcu_bh_qs(int cpu)   */  void rcu_check_callbacks(int cpu, int user)  { -	check_cpu_stalls(); +	RCU_TRACE(check_cpu_stalls());  	if (user || rcu_is_cpu_rrupt_from_idle())  		rcu_sched_qs(cpu);  	else if (!in_softirq())  		rcu_bh_qs(cpu); -	rcu_preempt_check_callbacks();  }  /* @@ -278,7 +276,7 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)  					      ACCESS_ONCE(rcp->rcucblist),  					      need_resched(),  					      is_idle_task(current), -					      rcu_is_callbacks_kthread())); +					      false));  		return;  	} @@ -290,7 +288,6 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)  	*rcp->donetail = NULL;  	if (rcp->curtail == rcp->donetail)  		rcp->curtail = &rcp->rcucblist; -	rcu_preempt_remove_callbacks(rcp);  	rcp->donetail = &rcp->rcucblist;  	local_irq_restore(flags); @@ -309,14 +306,13 @@ static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp)  	RCU_TRACE(rcu_trace_sub_qlen(rcp, cb_count));  	RCU_TRACE(trace_rcu_batch_end(rcp->name, cb_count, 0, need_resched(),  				      is_idle_task(current), -				      rcu_is_callbacks_kthread())); +				      false));  }  static void rcu_process_callbacks(struct softirq_action *unused)  {  	__rcu_process_callbacks(&rcu_sched_ctrlblk);  	__rcu_process_callbacks(&rcu_bh_ctrlblk); -	rcu_preempt_process_callbacks();  }  /* @@ -382,3 +378,8 @@ void call_rcu_bh(struct rcu_head *head, void (*func)(struct rcu_head *rcu))  	__call_rcu(head, func, &rcu_bh_ctrlblk);  }  EXPORT_SYMBOL_GPL(call_rcu_bh); + +void rcu_init(void) +{ +	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); +} | 
