diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2022-03-23 09:58:40 +0100 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2022-03-23 09:58:40 +0100 | 
| commit | b690490d6d466972ade172ee2e7f6ffa49e7e910 (patch) | |
| tree | 50a93da28c9128e19eb7a3038aecf75dab6b36e1 /kernel/sched/fair.c | |
| parent | f97ec5d75e9261a5da78dc28a8955b7cc0c4468b (diff) | |
| parent | 0f203948230720e849ad50d158adac1cd32c282f (diff) | |
Merge branch 'for-5.18/amd-sfh' into for-linus
- dead code elimination (Christophe JAILLET)
Diffstat (limited to 'kernel/sched/fair.c')
| -rw-r--r-- | kernel/sched/fair.c | 87 | 
1 files changed, 20 insertions, 67 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 6e476f6d9435..095b0aa378df 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1502,7 +1502,6 @@ struct task_numa_env {  static unsigned long cpu_load(struct rq *rq);  static unsigned long cpu_runnable(struct rq *rq); -static unsigned long cpu_util(int cpu);  static inline long adjust_numa_imbalance(int imbalance,  					int dst_running, int dst_weight); @@ -1569,7 +1568,7 @@ static void update_numa_stats(struct task_numa_env *env,  		ns->load += cpu_load(rq);  		ns->runnable += cpu_runnable(rq); -		ns->util += cpu_util(cpu); +		ns->util += cpu_util_cfs(cpu);  		ns->nr_running += rq->cfs.h_nr_running;  		ns->compute_capacity += capacity_of(cpu); @@ -3240,7 +3239,7 @@ static inline void cfs_rq_util_change(struct cfs_rq *cfs_rq, int flags)  		 * As is, the util number is not freq-invariant (we'd have to  		 * implement arch_scale_freq_capacity() for that).  		 * -		 * See cpu_util(). +		 * See cpu_util_cfs().  		 */  		cpufreq_update_util(rq, flags);  	} @@ -4070,7 +4069,8 @@ done:  	trace_sched_util_est_se_tp(&p->se);  } -static inline int task_fits_capacity(struct task_struct *p, long capacity) +static inline int task_fits_capacity(struct task_struct *p, +				     unsigned long capacity)  {  	return fits_capacity(uclamp_task_util(p), capacity);  } @@ -5509,11 +5509,9 @@ static inline void hrtick_update(struct rq *rq)  #endif  #ifdef CONFIG_SMP -static inline unsigned long cpu_util(int cpu); -  static inline bool cpu_overutilized(int cpu)  { -	return !fits_capacity(cpu_util(cpu), capacity_of(cpu)); +	return !fits_capacity(cpu_util_cfs(cpu), capacity_of(cpu));  }  static inline void update_overutilized_status(struct rq *rq) @@ -6345,7 +6343,7 @@ select_idle_capacity(struct task_struct *p, struct sched_domain *sd, int target)  	return best_cpu;  } -static inline bool asym_fits_capacity(int task_util, int cpu) +static inline bool asym_fits_capacity(unsigned long task_util, int cpu)  {  	if (static_branch_unlikely(&sched_asym_cpucapacity))  		return fits_capacity(task_util, capacity_of(cpu)); @@ -6398,8 +6396,10 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)  	 * pattern is IO completions.  	 */  	if (is_per_cpu_kthread(current) && +	    in_task() &&  	    prev == smp_processor_id() && -	    this_rq()->nr_running <= 1) { +	    this_rq()->nr_running <= 1 && +	    asym_fits_capacity(task_util, prev)) {  		return prev;  	} @@ -6456,58 +6456,6 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)  	return target;  } -/** - * cpu_util - Estimates the amount of capacity of a CPU used by CFS tasks. - * @cpu: the CPU to get the utilization of - * - * The unit of the return value must be the one of capacity so we can compare - * the utilization with the capacity of the CPU that is available for CFS task - * (ie cpu_capacity). - * - * cfs_rq.avg.util_avg is the sum of running time of runnable tasks plus the - * recent utilization of currently non-runnable tasks on a CPU. It represents - * the amount of utilization of a CPU in the range [0..capacity_orig] where - * capacity_orig is the cpu_capacity available at the highest frequency - * (arch_scale_freq_capacity()). - * The utilization of a CPU converges towards a sum equal to or less than the - * current capacity (capacity_curr <= capacity_orig) of the CPU because it is - * the running time on this CPU scaled by capacity_curr. - * - * The estimated utilization of a CPU is defined to be the maximum between its - * cfs_rq.avg.util_avg and the sum of the estimated utilization of the tasks - * currently RUNNABLE on that CPU. - * This allows to properly represent the expected utilization of a CPU which - * has just got a big task running since a long sleep period. At the same time - * however it preserves the benefits of the "blocked utilization" in - * describing the potential for other tasks waking up on the same CPU. - * - * Nevertheless, cfs_rq.avg.util_avg can be higher than capacity_curr or even - * higher than capacity_orig because of unfortunate rounding in - * cfs.avg.util_avg or just after migrating tasks and new task wakeups until - * the average stabilizes with the new running time. We need to check that the - * utilization stays within the range of [0..capacity_orig] and cap it if - * necessary. Without utilization capping, a group could be seen as overloaded - * (CPU0 utilization at 121% + CPU1 utilization at 80%) whereas CPU1 has 20% of - * available capacity. We allow utilization to overshoot capacity_curr (but not - * capacity_orig) as it useful for predicting the capacity required after task - * migrations (scheduler-driven DVFS). - * - * Return: the (estimated) utilization for the specified CPU - */ -static inline unsigned long cpu_util(int cpu) -{ -	struct cfs_rq *cfs_rq; -	unsigned int util; - -	cfs_rq = &cpu_rq(cpu)->cfs; -	util = READ_ONCE(cfs_rq->avg.util_avg); - -	if (sched_feat(UTIL_EST)) -		util = max(util, READ_ONCE(cfs_rq->avg.util_est.enqueued)); - -	return min_t(unsigned long, util, capacity_orig_of(cpu)); -} -  /*   * cpu_util_without: compute cpu utilization without any contributions from *p   * @cpu: the CPU which utilization is requested @@ -6528,7 +6476,7 @@ static unsigned long cpu_util_without(int cpu, struct task_struct *p)  	/* Task has no contribution or is new */  	if (cpu != task_cpu(p) || !READ_ONCE(p->se.avg.last_update_time)) -		return cpu_util(cpu); +		return cpu_util_cfs(cpu);  	cfs_rq = &cpu_rq(cpu)->cfs;  	util = READ_ONCE(cfs_rq->avg.util_avg); @@ -6592,7 +6540,7 @@ static unsigned long cpu_util_without(int cpu, struct task_struct *p)  	/*  	 * Utilization (estimated) can exceed the CPU capacity, thus let's  	 * clamp to the maximum CPU capacity to ensure consistency with -	 * the cpu_util call. +	 * cpu_util.  	 */  	return min_t(unsigned long, util, capacity_orig_of(cpu));  } @@ -6624,7 +6572,7 @@ static unsigned long cpu_util_next(int cpu, struct task_struct *p, int dst_cpu)  		 * During wake-up, the task isn't enqueued yet and doesn't  		 * appear in the cfs_rq->avg.util_est.enqueued of any rq,  		 * so just add it (if needed) to "simulate" what will be -		 * cpu_util() after the task has been enqueued. +		 * cpu_util after the task has been enqueued.  		 */  		if (dst_cpu == cpu)  			util_est += _task_util_est(p); @@ -6915,6 +6863,11 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags)  			break;  		} +		/* +		 * Usually only true for WF_EXEC and WF_FORK, as sched_domains +		 * usually do not have SD_BALANCE_WAKE set. That means wakeup +		 * will usually go to the fast path. +		 */  		if (tmp->flags & sd_flag)  			sd = tmp;  		else if (!want_affine) @@ -8681,7 +8634,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,  		struct rq *rq = cpu_rq(i);  		sgs->group_load += cpu_load(rq); -		sgs->group_util += cpu_util(i); +		sgs->group_util += cpu_util_cfs(i);  		sgs->group_runnable += cpu_runnable(rq);  		sgs->sum_h_nr_running += rq->cfs.h_nr_running; @@ -9699,7 +9652,7 @@ static struct rq *find_busiest_queue(struct lb_env *env,  			break;  		case migrate_util: -			util = cpu_util(cpu_of(rq)); +			util = cpu_util_cfs(i);  			/*  			 * Don't try to pull utilization from a CPU with one @@ -11068,7 +11021,7 @@ static inline void task_tick_core(struct rq *rq, struct task_struct *curr)  	 * MIN_NR_TASKS_DURING_FORCEIDLE - 1 tasks and use that to check  	 * if we need to give up the CPU.  	 */ -	if (rq->core->core_forceidle && rq->cfs.nr_running == 1 && +	if (rq->core->core_forceidle_count && rq->cfs.nr_running == 1 &&  	    __entity_slice_used(&curr->se, MIN_NR_TASKS_DURING_FORCEIDLE))  		resched_curr(rq);  }  | 
