diff options
Diffstat (limited to 'include/linux/sched.h')
| -rw-r--r-- | include/linux/sched.h | 90 | 
1 files changed, 82 insertions, 8 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 11837410690f..8dc1811487f5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -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,12 +578,47 @@ 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;  		u8			need_qs;  		u8			exp_hint; /* Hint for performance. */ -		u8			pad; /* No garbage from compiler! */ +		u8			deferred_qs;  	} b; /* Bits. */  	u32 s; /* Set of bits. */  }; @@ -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; @@ -831,6 +892,11 @@ struct task_struct {  	/* Effective (overridable) subjective task credentials (COW): */  	const struct cred __rcu		*cred; +#ifdef CONFIG_KEYS +	/* Cached requested key. */ +	struct key			*cached_requested_key; +#endif +  	/*  	 * executable name, excluding path.  	 * @@ -1399,7 +1465,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 */ @@ -1518,10 +1584,6 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p, const struct cpuma  }  #endif -#ifndef cpu_relax_yield -#define cpu_relax_yield() cpu_relax() -#endif -  extern int yield_to(struct task_struct *p, bool preempt);  extern void set_user_nice(struct task_struct *p, long nice);  extern int task_prio(const struct task_struct *p); @@ -1919,4 +1981,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  |