diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 39 | 
1 files changed, 28 insertions, 11 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index aa14a56f9d03..dc91a4d09ac3 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -560,18 +560,8 @@ struct rq {  static DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -static inline -void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags) -{ -	rq->curr->sched_class->check_preempt_curr(rq, p, flags); -	/* -	 * A queue event has occurred, and we're going to schedule.  In -	 * this case, we can save a useless back to back clock update. -	 */ -	if (test_tsk_need_resched(p)) -		rq->skip_clock_update = 1; -} +static void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags);  static inline int cpu_of(struct rq *rq)  { @@ -2118,6 +2108,31 @@ static inline void check_class_changed(struct rq *rq, struct task_struct *p,  		p->sched_class->prio_changed(rq, p, oldprio, running);  } +static void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags) +{ +	const struct sched_class *class; + +	if (p->sched_class == rq->curr->sched_class) { +		rq->curr->sched_class->check_preempt_curr(rq, p, flags); +	} else { +		for_each_class(class) { +			if (class == rq->curr->sched_class) +				break; +			if (class == p->sched_class) { +				resched_task(rq->curr); +				break; +			} +		} +	} + +	/* +	 * A queue event has occurred, and we're going to schedule.  In +	 * this case, we can save a useless back to back clock update. +	 */ +	if (test_tsk_need_resched(rq->curr)) +		rq->skip_clock_update = 1; +} +  #ifdef CONFIG_SMP  /*   * Is this task likely cache-hot: @@ -6960,6 +6975,8 @@ static void init_sched_groups_power(int cpu, struct sched_domain *sd)  	if (cpu != group_first_cpu(sd->groups))  		return; +	sd->groups->group_weight = cpumask_weight(sched_group_cpus(sd->groups)); +  	child = sd->child;  	sd->groups->cpu_power = 0;  | 
