mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	sched/deadline: Move CPU frequency selection triggering points
Since SCHED_DEADLINE doesn't track utilization signal (but reserves a fraction of CPU bandwidth to tasks admitted to the system), there is no point in evaluating frequency changes during each tick event. Move frequency selection triggering points to where running_bw changes. Co-authored-by: Claudio Scordino <claudio@evidence.eu.com> Signed-off-by: Juri Lelli <juri.lelli@arm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Luca Abeni <luca.abeni@santannapisa.it> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rafael J . Wysocki <rafael.j.wysocki@intel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: alessio.balsini@arm.com Cc: bristot@redhat.com Cc: dietmar.eggemann@arm.com Cc: joelaf@google.com Cc: juri.lelli@redhat.com Cc: mathieu.poirier@linaro.org Cc: morten.rasmussen@arm.com Cc: patrick.bellasi@arm.com Cc: rjw@rjwysocki.net Cc: rostedt@goodmis.org Cc: tkjos@android.com Cc: tommaso.cucinotta@santannapisa.it Cc: vincent.guittot@linaro.org Link: http://lkml.kernel.org/r/20171204102325.5110-3-juri.lelli@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									d4edd662ac
								
							
						
					
					
						commit
						e0367b1267
					
				
					 2 changed files with 10 additions and 9 deletions
				
			
		| 
						 | 
					@ -86,6 +86,8 @@ void add_running_bw(u64 dl_bw, struct dl_rq *dl_rq)
 | 
				
			||||||
	dl_rq->running_bw += dl_bw;
 | 
						dl_rq->running_bw += dl_bw;
 | 
				
			||||||
	SCHED_WARN_ON(dl_rq->running_bw < old); /* overflow */
 | 
						SCHED_WARN_ON(dl_rq->running_bw < old); /* overflow */
 | 
				
			||||||
	SCHED_WARN_ON(dl_rq->running_bw > dl_rq->this_bw);
 | 
						SCHED_WARN_ON(dl_rq->running_bw > dl_rq->this_bw);
 | 
				
			||||||
 | 
						/* kick cpufreq (see the comment in kernel/sched/sched.h). */
 | 
				
			||||||
 | 
						cpufreq_update_util(rq_of_dl_rq(dl_rq), SCHED_CPUFREQ_DL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline
 | 
					static inline
 | 
				
			||||||
| 
						 | 
					@ -98,6 +100,8 @@ void sub_running_bw(u64 dl_bw, struct dl_rq *dl_rq)
 | 
				
			||||||
	SCHED_WARN_ON(dl_rq->running_bw > old); /* underflow */
 | 
						SCHED_WARN_ON(dl_rq->running_bw > old); /* underflow */
 | 
				
			||||||
	if (dl_rq->running_bw > old)
 | 
						if (dl_rq->running_bw > old)
 | 
				
			||||||
		dl_rq->running_bw = 0;
 | 
							dl_rq->running_bw = 0;
 | 
				
			||||||
 | 
						/* kick cpufreq (see the comment in kernel/sched/sched.h). */
 | 
				
			||||||
 | 
						cpufreq_update_util(rq_of_dl_rq(dl_rq), SCHED_CPUFREQ_DL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline
 | 
					static inline
 | 
				
			||||||
| 
						 | 
					@ -1134,9 +1138,6 @@ static void update_curr_dl(struct rq *rq)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* kick cpufreq (see the comment in kernel/sched/sched.h). */
 | 
					 | 
				
			||||||
	cpufreq_update_util(rq, SCHED_CPUFREQ_DL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	schedstat_set(curr->se.statistics.exec_max,
 | 
						schedstat_set(curr->se.statistics.exec_max,
 | 
				
			||||||
		      max(curr->se.statistics.exec_max, delta_exec));
 | 
							      max(curr->se.statistics.exec_max, delta_exec));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2055,14 +2055,14 @@ DECLARE_PER_CPU(struct update_util_data *, cpufreq_update_util_data);
 | 
				
			||||||
 * The way cpufreq is currently arranged requires it to evaluate the CPU
 | 
					 * The way cpufreq is currently arranged requires it to evaluate the CPU
 | 
				
			||||||
 * performance state (frequency/voltage) on a regular basis to prevent it from
 | 
					 * performance state (frequency/voltage) on a regular basis to prevent it from
 | 
				
			||||||
 * being stuck in a completely inadequate performance level for too long.
 | 
					 * being stuck in a completely inadequate performance level for too long.
 | 
				
			||||||
 * That is not guaranteed to happen if the updates are only triggered from CFS,
 | 
					 * That is not guaranteed to happen if the updates are only triggered from CFS
 | 
				
			||||||
 * though, because they may not be coming in if RT or deadline tasks are active
 | 
					 * and DL, though, because they may not be coming in if only RT tasks are
 | 
				
			||||||
 * all the time (or there are RT and DL tasks only).
 | 
					 * active all the time (or there are RT tasks only).
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * As a workaround for that issue, this function is called by the RT and DL
 | 
					 * As a workaround for that issue, this function is called periodically by the
 | 
				
			||||||
 * sched classes to trigger extra cpufreq updates to prevent it from stalling,
 | 
					 * RT sched class to trigger extra cpufreq updates to prevent it from stalling,
 | 
				
			||||||
 * but that really is a band-aid.  Going forward it should be replaced with
 | 
					 * but that really is a band-aid.  Going forward it should be replaced with
 | 
				
			||||||
 * solutions targeted more specifically at RT and DL tasks.
 | 
					 * solutions targeted more specifically at RT tasks.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static inline void cpufreq_update_util(struct rq *rq, unsigned int flags)
 | 
					static inline void cpufreq_update_util(struct rq *rq, unsigned int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue