sched: Add new API wake_up_if_idle() to wake up the idle cpu
Implementing one new API wake_up_if_idle(), which is used to wake up the idle CPU. Suggested-by: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Chuansheng Liu <chuansheng.liu@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: daniel.lezcano@linaro.org Cc: rjw@rjwysocki.net Cc: linux-pm@vger.kernel.org Cc: changcheng.liu@intel.com Cc: xiaoming.wang@intel.com Cc: souvik.k.chakravarty@intel.com Cc: chuansheng.liu@intel.com Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: http://lkml.kernel.org/r/1409815075-4180-1-git-send-email-chuansheng.liu@intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
					parent
					
						
							
								ba7e5a279e
							
						
					
				
			
			
				commit
				
					
						f6be8af1c9
					
				
			
		
					 2 changed files with 20 additions and 0 deletions
				
			
		|  | @ -1024,6 +1024,7 @@ struct sched_domain_topology_level { | ||||||
| extern struct sched_domain_topology_level *sched_domain_topology; | extern struct sched_domain_topology_level *sched_domain_topology; | ||||||
| 
 | 
 | ||||||
| extern void set_sched_topology(struct sched_domain_topology_level *tl); | extern void set_sched_topology(struct sched_domain_topology_level *tl); | ||||||
|  | extern void wake_up_if_idle(int cpu); | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_SCHED_DEBUG | #ifdef CONFIG_SCHED_DEBUG | ||||||
| # define SD_INIT_NAME(type)		.name = #type | # define SD_INIT_NAME(type)		.name = #type | ||||||
|  |  | ||||||
|  | @ -1634,6 +1634,25 @@ static void ttwu_queue_remote(struct task_struct *p, int cpu) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void wake_up_if_idle(int cpu) | ||||||
|  | { | ||||||
|  | 	struct rq *rq = cpu_rq(cpu); | ||||||
|  | 	unsigned long flags; | ||||||
|  | 
 | ||||||
|  | 	if (!is_idle_task(rq->curr)) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	if (set_nr_if_polling(rq->idle)) { | ||||||
|  | 		trace_sched_wake_idle_without_ipi(cpu); | ||||||
|  | 	} else { | ||||||
|  | 		raw_spin_lock_irqsave(&rq->lock, flags); | ||||||
|  | 		if (is_idle_task(rq->curr)) | ||||||
|  | 			smp_send_reschedule(cpu); | ||||||
|  | 		/* Else cpu is not in idle, do nothing here */ | ||||||
|  | 		raw_spin_unlock_irqrestore(&rq->lock, flags); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool cpus_share_cache(int this_cpu, int that_cpu) | bool cpus_share_cache(int this_cpu, int that_cpu) | ||||||
| { | { | ||||||
| 	return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu); | 	return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Chuansheng Liu
				Chuansheng Liu