diff options
Diffstat (limited to 'kernel/sched/sched.h')
| -rw-r--r-- | kernel/sched/sched.h | 146 | 
1 files changed, 55 insertions, 91 deletions
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 2e5a95486a42..001fe047bd5d 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -273,8 +273,6 @@ struct rt_bandwidth {  	unsigned int		rt_period_active;  }; -void __dl_clear_params(struct task_struct *p); -  static inline int dl_bandwidth_enabled(void)  {  	return sysctl_sched_rt_runtime >= 0; @@ -315,6 +313,33 @@ extern bool dl_param_changed(struct task_struct *p, const struct sched_attr *att  extern int  dl_cpuset_cpumask_can_shrink(const struct cpumask *cur, const struct cpumask *trial);  extern int  dl_bw_check_overflow(int cpu); +/* + * SCHED_DEADLINE supports servers (nested scheduling) with the following + * interface: + * + *   dl_se::rq -- runqueue we belong to. + * + *   dl_se::server_has_tasks() -- used on bandwidth enforcement; we 'stop' the + *                                server when it runs out of tasks to run. + * + *   dl_se::server_pick() -- nested pick_next_task(); we yield the period if this + *                           returns NULL. + * + *   dl_server_update() -- called from update_curr_common(), propagates runtime + *                         to the server. + * + *   dl_server_start() + *   dl_server_stop()  -- start/stop the server when it has (no) tasks. + * + *   dl_server_init() -- initializes the server. + */ +extern void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec); +extern void dl_server_start(struct sched_dl_entity *dl_se); +extern void dl_server_stop(struct sched_dl_entity *dl_se); +extern void dl_server_init(struct sched_dl_entity *dl_se, struct rq *rq, +		    dl_server_has_tasks_f has_tasks, +		    dl_server_pick_f pick); +  #ifdef CONFIG_CGROUP_SCHED  struct cfs_rq; @@ -436,10 +461,21 @@ static inline int walk_tg_tree(tg_visitor down, tg_visitor up, void *data)  extern int tg_nop(struct task_group *tg, void *data); +#ifdef CONFIG_FAIR_GROUP_SCHED  extern void free_fair_sched_group(struct task_group *tg);  extern int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent);  extern void online_fair_sched_group(struct task_group *tg);  extern void unregister_fair_sched_group(struct task_group *tg); +#else +static inline void free_fair_sched_group(struct task_group *tg) { } +static inline int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent) +{ +       return 1; +} +static inline void online_fair_sched_group(struct task_group *tg) { } +static inline void unregister_fair_sched_group(struct task_group *tg) { } +#endif +  extern void init_tg_cfs_entry(struct task_group *tg, struct cfs_rq *cfs_rq,  			struct sched_entity *se, int cpu,  			struct sched_entity *parent); @@ -2179,6 +2215,10 @@ extern const u32		sched_prio_to_wmult[40];   * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location   *        in the runqueue.   * + * NOCLOCK - skip the update_rq_clock() (avoids double updates) + * + * MIGRATION - p->on_rq == TASK_ON_RQ_MIGRATING (used for DEADLINE) + *   * ENQUEUE_HEAD      - place at front of runqueue (tail if not specified)   * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline)   * ENQUEUE_MIGRATED  - the task was migrated during wakeup @@ -2189,6 +2229,7 @@ extern const u32		sched_prio_to_wmult[40];  #define DEQUEUE_SAVE		0x02 /* Matches ENQUEUE_RESTORE */  #define DEQUEUE_MOVE		0x04 /* Matches ENQUEUE_MOVE */  #define DEQUEUE_NOCLOCK		0x08 /* Matches ENQUEUE_NOCLOCK */ +#define DEQUEUE_MIGRATING	0x100 /* Matches ENQUEUE_MIGRATING */  #define ENQUEUE_WAKEUP		0x01  #define ENQUEUE_RESTORE		0x02 @@ -2203,6 +2244,7 @@ extern const u32		sched_prio_to_wmult[40];  #define ENQUEUE_MIGRATED	0x00  #endif  #define ENQUEUE_INITIAL		0x80 +#define ENQUEUE_MIGRATING	0x100  #define RETRY_TASK		((void *)-1UL) @@ -2212,6 +2254,8 @@ struct affinity_context {  	unsigned int flags;  }; +extern s64 update_curr_common(struct rq *rq); +  struct sched_class {  #ifdef CONFIG_UCLAMP_TASK @@ -2425,8 +2469,7 @@ extern struct rt_bandwidth def_rt_bandwidth;  extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime);  extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); -extern void init_dl_task_timer(struct sched_dl_entity *dl_se); -extern void init_dl_inactive_task_timer(struct sched_dl_entity *dl_se); +extern void init_dl_entity(struct sched_dl_entity *dl_se);  #define BW_SHIFT		20  #define BW_UNIT			(1 << BW_SHIFT) @@ -2822,6 +2865,7 @@ DEFINE_LOCK_GUARD_2(double_rq_lock, struct rq,  		    double_rq_lock(_T->lock, _T->lock2),  		    double_rq_unlock(_T->lock, _T->lock2)) +extern struct sched_entity *__pick_root_entity(struct cfs_rq *cfs_rq);  extern struct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq);  extern struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq); @@ -2961,24 +3005,14 @@ static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) {}  #endif  #ifdef CONFIG_SMP -/** - * enum cpu_util_type - CPU utilization type - * @FREQUENCY_UTIL:	Utilization used to select frequency - * @ENERGY_UTIL:	Utilization used during energy calculation - * - * The utilization signals of all scheduling classes (CFS/RT/DL) and IRQ time - * need to be aggregated differently depending on the usage made of them. This - * enum is used within effective_cpu_util() to differentiate the types of - * utilization expected by the callers, and adjust the aggregation accordingly. - */ -enum cpu_util_type { -	FREQUENCY_UTIL, -	ENERGY_UTIL, -}; -  unsigned long effective_cpu_util(int cpu, unsigned long util_cfs, -				 enum cpu_util_type type, -				 struct task_struct *p); +				 unsigned long *min, +				 unsigned long *max); + +unsigned long sugov_effective_cpu_perf(int cpu, unsigned long actual, +				 unsigned long min, +				 unsigned long max); +  /*   * Verify the fitness of task @p to run on @cpu taking into account the @@ -3035,59 +3069,6 @@ static inline bool uclamp_rq_is_idle(struct rq *rq)  	return rq->uclamp_flags & UCLAMP_FLAG_IDLE;  } -/** - * uclamp_rq_util_with - clamp @util with @rq and @p effective uclamp values. - * @rq:		The rq to clamp against. Must not be NULL. - * @util:	The util value to clamp. - * @p:		The task to clamp against. Can be NULL if you want to clamp - *		against @rq only. - * - * Clamps the passed @util to the max(@rq, @p) effective uclamp values. - * - * If sched_uclamp_used static key is disabled, then just return the util - * without any clamping since uclamp aggregation at the rq level in the fast - * path is disabled, rendering this operation a NOP. - * - * Use uclamp_eff_value() if you don't care about uclamp values at rq level. It - * will return the correct effective uclamp value of the task even if the - * static key is disabled. - */ -static __always_inline -unsigned long uclamp_rq_util_with(struct rq *rq, unsigned long util, -				  struct task_struct *p) -{ -	unsigned long min_util = 0; -	unsigned long max_util = 0; - -	if (!static_branch_likely(&sched_uclamp_used)) -		return util; - -	if (p) { -		min_util = uclamp_eff_value(p, UCLAMP_MIN); -		max_util = uclamp_eff_value(p, UCLAMP_MAX); - -		/* -		 * Ignore last runnable task's max clamp, as this task will -		 * reset it. Similarly, no need to read the rq's min clamp. -		 */ -		if (uclamp_rq_is_idle(rq)) -			goto out; -	} - -	min_util = max_t(unsigned long, min_util, uclamp_rq_get(rq, UCLAMP_MIN)); -	max_util = max_t(unsigned long, max_util, uclamp_rq_get(rq, UCLAMP_MAX)); -out: -	/* -	 * Since CPU's {min,max}_util clamps are MAX aggregated considering -	 * RUNNABLE tasks with _different_ clamps, we can end up with an -	 * inversion. Fix it now when the clamps are applied. -	 */ -	if (unlikely(min_util >= max_util)) -		return min_util; - -	return clamp(util, min_util, max_util); -} -  /* Is the rq being capped/throttled by uclamp_max? */  static inline bool uclamp_rq_is_capped(struct rq *rq)  { @@ -3125,13 +3106,6 @@ static inline unsigned long uclamp_eff_value(struct task_struct *p,  	return SCHED_CAPACITY_SCALE;  } -static inline -unsigned long uclamp_rq_util_with(struct rq *rq, unsigned long util, -				  struct task_struct *p) -{ -	return util; -} -  static inline bool uclamp_rq_is_capped(struct rq *rq) { return false; }  static inline bool uclamp_is_used(void) @@ -3261,16 +3235,6 @@ extern int sched_dynamic_mode(const char *str);  extern void sched_dynamic_update(int mode);  #endif -static inline void update_current_exec_runtime(struct task_struct *curr, -						u64 now, u64 delta_exec) -{ -	curr->se.sum_exec_runtime += delta_exec; -	account_group_exec_runtime(curr, delta_exec); - -	curr->se.exec_start = now; -	cgroup_account_cputime(curr, delta_exec); -} -  #ifdef CONFIG_SCHED_MM_CID  #define SCHED_MM_CID_PERIOD_NS	(100ULL * 1000000)	/* 100ms */  |