mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	rcu: Fix accelerated GPs for last non-dynticked CPU
This patch disables irqs across the call to rcu_needs_cpu(). It also enforces a hold-off period so that the idle loop doesn't softirq itself to death when there are lots of RCU callbacks in flight on the last non-dynticked CPU. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: laijs@cn.fujitsu.com Cc: dipankar@in.ibm.com Cc: mathieu.desnoyers@polymtl.ca Cc: josh@joshtriplett.org Cc: dvhltc@us.ibm.com Cc: niv@us.ibm.com Cc: peterz@infradead.org Cc: rostedt@goodmis.org Cc: Valdis.Kletnieks@vt.edu Cc: dhowells@redhat.com LKML-Reference: <1267231138-27856-3-git-send-email-paulmck@linux.vnet.ibm.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									0b1c87278a
								
							
						
					
					
						commit
						71da81324c
					
				
					 1 changed files with 9 additions and 1 deletions
				
			
		|  | @ -986,6 +986,7 @@ static void rcu_needs_cpu_flush(void) | |||
| 
 | ||||
| #define RCU_NEEDS_CPU_FLUSHES 5 | ||||
| static DEFINE_PER_CPU(int, rcu_dyntick_drain); | ||||
| static DEFINE_PER_CPU(unsigned long, rcu_dyntick_holdoff); | ||||
| 
 | ||||
| /*
 | ||||
|  * Check to see if any future RCU-related work will need to be done | ||||
|  | @ -1013,6 +1014,7 @@ int rcu_needs_cpu(int cpu) | |||
| 	for_each_cpu_not(thatcpu, nohz_cpu_mask) | ||||
| 		if (thatcpu != cpu) { | ||||
| 			per_cpu(rcu_dyntick_drain, cpu) = 0; | ||||
| 			per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1; | ||||
| 			return rcu_needs_cpu_quick_check(cpu); | ||||
| 		} | ||||
| 
 | ||||
|  | @ -1022,6 +1024,7 @@ int rcu_needs_cpu(int cpu) | |||
| 		per_cpu(rcu_dyntick_drain, cpu) = RCU_NEEDS_CPU_FLUSHES; | ||||
| 	} else if (--per_cpu(rcu_dyntick_drain, cpu) <= 0) { | ||||
| 		/* We have hit the limit, so time to give up. */ | ||||
| 		per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; | ||||
| 		return rcu_needs_cpu_quick_check(cpu); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1038,8 +1041,10 @@ int rcu_needs_cpu(int cpu) | |||
| 	} | ||||
| 
 | ||||
| 	/* If RCU callbacks are still pending, RCU still needs this CPU. */ | ||||
| 	if (c) | ||||
| 	if (c) { | ||||
| 		raise_softirq(RCU_SOFTIRQ); | ||||
| 		per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; | ||||
| 	} | ||||
| 	return c; | ||||
| } | ||||
| 
 | ||||
|  | @ -1050,10 +1055,13 @@ int rcu_needs_cpu(int cpu) | |||
| static void rcu_needs_cpu_flush(void) | ||||
| { | ||||
| 	int cpu = smp_processor_id(); | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (per_cpu(rcu_dyntick_drain, cpu) <= 0) | ||||
| 		return; | ||||
| 	local_irq_save(flags); | ||||
| 	(void)rcu_needs_cpu(cpu); | ||||
| 	local_irq_restore(flags); | ||||
| } | ||||
| 
 | ||||
| #endif /* #else #if !defined(CONFIG_RCU_FAST_NO_HZ) */ | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Paul E. McKenney
						Paul E. McKenney