diff options
Diffstat (limited to 'kernel/sched_rt.c')
| -rw-r--r-- | kernel/sched_rt.c | 62 | 
1 files changed, 27 insertions, 35 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 3918e01994e..2eb4bd6a526 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c @@ -3,15 +3,18 @@   * policies)   */ +#ifdef CONFIG_RT_GROUP_SCHED + +#define rt_entity_is_task(rt_se) (!(rt_se)->my_q) +  static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se)  { +#ifdef CONFIG_SCHED_DEBUG +	WARN_ON_ONCE(!rt_entity_is_task(rt_se)); +#endif  	return container_of(rt_se, struct task_struct, rt);  } -#ifdef CONFIG_RT_GROUP_SCHED - -#define rt_entity_is_task(rt_se) (!(rt_se)->my_q) -  static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq)  {  	return rt_rq->rq; @@ -26,6 +29,11 @@ static inline struct rt_rq *rt_rq_of_se(struct sched_rt_entity *rt_se)  #define rt_entity_is_task(rt_se) (1) +static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se) +{ +	return container_of(rt_se, struct task_struct, rt); +} +  static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq)  {  	return container_of(rt_rq, struct rq, rt); @@ -128,6 +136,11 @@ static void dequeue_pushable_task(struct rq *rq, struct task_struct *p)  	plist_del(&p->pushable_tasks, &rq->rt.pushable_tasks);  } +static inline int has_pushable_tasks(struct rq *rq) +{ +	return !plist_head_empty(&rq->rt.pushable_tasks); +} +  #else  static inline void enqueue_pushable_task(struct rq *rq, struct task_struct *p) @@ -602,6 +615,8 @@ static void update_curr_rt(struct rq *rq)  	curr->se.exec_start = rq->clock;  	cpuacct_charge(curr, delta_exec); +	sched_rt_avg_update(rq, delta_exec); +  	if (!rt_bandwidth_enabled())  		return; @@ -874,8 +889,6 @@ static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup)  	if (!task_current(rq, p) && p->rt.nr_cpus_allowed > 1)  		enqueue_pushable_task(rq, p); - -	inc_cpu_load(rq, p->se.load.weight);  }  static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep) @@ -886,8 +899,6 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep)  	dequeue_rt_entity(rt_se);  	dequeue_pushable_task(rq, p); - -	dec_cpu_load(rq, p->se.load.weight);  }  /* @@ -1064,6 +1075,14 @@ static struct task_struct *pick_next_task_rt(struct rq *rq)  	if (p)  		dequeue_pushable_task(rq, p); +#ifdef CONFIG_SMP +	/* +	 * We detect this state here so that we can avoid taking the RQ +	 * lock again later if there is no need to push +	 */ +	rq->post_schedule = has_pushable_tasks(rq); +#endif +  	return p;  } @@ -1162,13 +1181,6 @@ static int find_lowest_rq(struct task_struct *task)  		return -1; /* No targets found */  	/* -	 * Only consider CPUs that are usable for migration. -	 * I guess we might want to change cpupri_find() to ignore those -	 * in the first place. -	 */ -	cpumask_and(lowest_mask, lowest_mask, cpu_active_mask); - -	/*  	 * At this point we have built a mask of cpus representing the  	 * lowest priority tasks in the system.  Now we want to elect  	 * the best one based on our affinity and topology. @@ -1262,11 +1274,6 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq)  	return lowest_rq;  } -static inline int has_pushable_tasks(struct rq *rq) -{ -	return !plist_head_empty(&rq->rt.pushable_tasks); -} -  static struct task_struct *pick_next_pushable_task(struct rq *rq)  {  	struct task_struct *p; @@ -1466,23 +1473,9 @@ static void pre_schedule_rt(struct rq *rq, struct task_struct *prev)  		pull_rt_task(rq);  } -/* - * assumes rq->lock is held - */ -static int needs_post_schedule_rt(struct rq *rq) -{ -	return has_pushable_tasks(rq); -} -  static void post_schedule_rt(struct rq *rq)  { -	/* -	 * This is only called if needs_post_schedule_rt() indicates that -	 * we need to push tasks away -	 */ -	spin_lock_irq(&rq->lock);  	push_rt_tasks(rq); -	spin_unlock_irq(&rq->lock);  }  /* @@ -1758,7 +1751,6 @@ static const struct sched_class rt_sched_class = {  	.rq_online              = rq_online_rt,  	.rq_offline             = rq_offline_rt,  	.pre_schedule		= pre_schedule_rt, -	.needs_post_schedule	= needs_post_schedule_rt,  	.post_schedule		= post_schedule_rt,  	.task_wake_up		= task_wake_up_rt,  	.switched_from		= switched_from_rt,  |