Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler updates from Ingo Molnar: - Remove the unused per rq load array and all its infrastructure, by Dietmar Eggemann. - Add utilization clamping support by Patrick Bellasi. This is a refinement of the energy aware scheduling framework with support for boosting of interactive and capping of background workloads: to make sure critical GUI threads get maximum frequency ASAP, and to make sure background processing doesn't unnecessarily move to cpufreq governor to higher frequencies and less energy efficient CPU modes. - Add the bare minimum of tracepoints required for LISA EAS regression testing, by Qais Yousef - which allows automated testing of various power management features, including energy aware scheduling. - Restructure the former tsk_nr_cpus_allowed() facility that the -rt kernel used to modify the scheduler's CPU affinity logic such as migrate_disable() - introduce the task->cpus_ptr value instead of taking the address of &task->cpus_allowed directly - by Sebastian Andrzej Siewior. - Misc optimizations, fixes, cleanups and small enhancements - see the Git log for details. * 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (33 commits) sched/uclamp: Add uclamp support to energy_compute() sched/uclamp: Add uclamp_util_with() sched/cpufreq, sched/uclamp: Add clamps for FAIR and RT tasks sched/uclamp: Set default clamps for RT tasks sched/uclamp: Reset uclamp values on RESET_ON_FORK sched/uclamp: Extend sched_setattr() to support utilization clamping sched/core: Allow sched_setattr() to use the current policy sched/uclamp: Add system default clamps sched/uclamp: Enforce last task's UCLAMP_MAX sched/uclamp: Add bucket local max tracking sched/uclamp: Add CPU's clamp buckets refcounting sched/fair: Rename weighted_cpuload() to cpu_runnable_load() sched/debug: Export the newly added tracepoints sched/debug: Add sched_overutilized tracepoint sched/debug: Add new tracepoint to track PELT at se level sched/debug: Add new tracepoints to track PELT at rq level sched/debug: Add a new sched_trace_*() helper functions sched/autogroup: Make autogroup_path() always available sched/wait: Deduplicate code with do-while sched/topology: Remove unused 'sd' parameter from arch_scale_cpu_capacity() ...
This commit is contained in:
@@ -35,6 +35,7 @@ struct audit_context;
|
||||
struct backing_dev_info;
|
||||
struct bio_list;
|
||||
struct blk_plug;
|
||||
struct capture_control;
|
||||
struct cfs_rq;
|
||||
struct fs_struct;
|
||||
struct futex_pi_state;
|
||||
@@ -47,8 +48,9 @@ struct pid_namespace;
|
||||
struct pipe_inode_info;
|
||||
struct rcu_node;
|
||||
struct reclaim_state;
|
||||
struct capture_control;
|
||||
struct robust_list_head;
|
||||
struct root_domain;
|
||||
struct rq;
|
||||
struct sched_attr;
|
||||
struct sched_param;
|
||||
struct seq_file;
|
||||
@@ -281,6 +283,18 @@ struct vtime {
|
||||
u64 gtime;
|
||||
};
|
||||
|
||||
/*
|
||||
* Utilization clamp constraints.
|
||||
* @UCLAMP_MIN: Minimum utilization
|
||||
* @UCLAMP_MAX: Maximum utilization
|
||||
* @UCLAMP_CNT: Utilization clamp constraints count
|
||||
*/
|
||||
enum uclamp_id {
|
||||
UCLAMP_MIN = 0,
|
||||
UCLAMP_MAX,
|
||||
UCLAMP_CNT
|
||||
};
|
||||
|
||||
struct sched_info {
|
||||
#ifdef CONFIG_SCHED_INFO
|
||||
/* Cumulative counters: */
|
||||
@@ -312,6 +326,10 @@ struct sched_info {
|
||||
# define SCHED_FIXEDPOINT_SHIFT 10
|
||||
# define SCHED_FIXEDPOINT_SCALE (1L << SCHED_FIXEDPOINT_SHIFT)
|
||||
|
||||
/* Increase resolution of cpu_capacity calculations */
|
||||
# define SCHED_CAPACITY_SHIFT SCHED_FIXEDPOINT_SHIFT
|
||||
# define SCHED_CAPACITY_SCALE (1L << SCHED_CAPACITY_SHIFT)
|
||||
|
||||
struct load_weight {
|
||||
unsigned long weight;
|
||||
u32 inv_weight;
|
||||
@@ -560,6 +578,41 @@ struct sched_dl_entity {
|
||||
struct hrtimer inactive_timer;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_UCLAMP_TASK
|
||||
/* Number of utilization clamp buckets (shorter alias) */
|
||||
#define UCLAMP_BUCKETS CONFIG_UCLAMP_BUCKETS_COUNT
|
||||
|
||||
/*
|
||||
* Utilization clamp for a scheduling entity
|
||||
* @value: clamp value "assigned" to a se
|
||||
* @bucket_id: bucket index corresponding to the "assigned" value
|
||||
* @active: the se is currently refcounted in a rq's bucket
|
||||
* @user_defined: the requested clamp value comes from user-space
|
||||
*
|
||||
* The bucket_id is the index of the clamp bucket matching the clamp value
|
||||
* which is pre-computed and stored to avoid expensive integer divisions from
|
||||
* the fast path.
|
||||
*
|
||||
* The active bit is set whenever a task has got an "effective" value assigned,
|
||||
* which can be different from the clamp value "requested" from user-space.
|
||||
* This allows to know a task is refcounted in the rq's bucket corresponding
|
||||
* to the "effective" bucket_id.
|
||||
*
|
||||
* The user_defined bit is set whenever a task has got a task-specific clamp
|
||||
* value requested from userspace, i.e. the system defaults apply to this task
|
||||
* just as a restriction. This allows to relax default clamps when a less
|
||||
* restrictive task-specific value has been requested, thus allowing to
|
||||
* implement a "nice" semantic. For example, a task running with a 20%
|
||||
* default boost can still drop its own boosting to 0%.
|
||||
*/
|
||||
struct uclamp_se {
|
||||
unsigned int value : bits_per(SCHED_CAPACITY_SCALE);
|
||||
unsigned int bucket_id : bits_per(UCLAMP_BUCKETS);
|
||||
unsigned int active : 1;
|
||||
unsigned int user_defined : 1;
|
||||
};
|
||||
#endif /* CONFIG_UCLAMP_TASK */
|
||||
|
||||
union rcu_special {
|
||||
struct {
|
||||
u8 blocked;
|
||||
@@ -640,6 +693,13 @@ struct task_struct {
|
||||
#endif
|
||||
struct sched_dl_entity dl;
|
||||
|
||||
#ifdef CONFIG_UCLAMP_TASK
|
||||
/* Clamp values requested for a scheduling entity */
|
||||
struct uclamp_se uclamp_req[UCLAMP_CNT];
|
||||
/* Effective clamp values used for a scheduling entity */
|
||||
struct uclamp_se uclamp[UCLAMP_CNT];
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PREEMPT_NOTIFIERS
|
||||
/* List of struct preempt_notifier: */
|
||||
struct hlist_head preempt_notifiers;
|
||||
@@ -651,7 +711,8 @@ struct task_struct {
|
||||
|
||||
unsigned int policy;
|
||||
int nr_cpus_allowed;
|
||||
cpumask_t cpus_allowed;
|
||||
const cpumask_t *cpus_ptr;
|
||||
cpumask_t cpus_mask;
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RCU
|
||||
int rcu_read_lock_nesting;
|
||||
@@ -1399,7 +1460,7 @@ extern struct pid *cad_pid;
|
||||
#define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */
|
||||
#define PF_MEMSTALL 0x01000000 /* Stalled due to lack of memory */
|
||||
#define PF_UMH 0x02000000 /* I'm an Usermodehelper process */
|
||||
#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_allowed */
|
||||
#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */
|
||||
#define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */
|
||||
#define PF_MEMALLOC_NOCMA 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */
|
||||
#define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */
|
||||
@@ -1915,4 +1976,16 @@ static inline void rseq_syscall(struct pt_regs *regs)
|
||||
|
||||
#endif
|
||||
|
||||
const struct sched_avg *sched_trace_cfs_rq_avg(struct cfs_rq *cfs_rq);
|
||||
char *sched_trace_cfs_rq_path(struct cfs_rq *cfs_rq, char *str, int len);
|
||||
int sched_trace_cfs_rq_cpu(struct cfs_rq *cfs_rq);
|
||||
|
||||
const struct sched_avg *sched_trace_rq_avg_rt(struct rq *rq);
|
||||
const struct sched_avg *sched_trace_rq_avg_dl(struct rq *rq);
|
||||
const struct sched_avg *sched_trace_rq_avg_irq(struct rq *rq);
|
||||
|
||||
int sched_trace_rq_cpu(struct rq *rq);
|
||||
|
||||
const struct cpumask *sched_trace_rd_span(struct root_domain *rd);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user