diff options
Diffstat (limited to 'kernel/sched/rt.c')
| -rw-r--r-- | kernel/sched/rt.c | 56 | 
1 files changed, 26 insertions, 30 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 44af55e6d5d..c5565c3c515 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1803,44 +1803,40 @@ static void task_woken_rt(struct rq *rq, struct task_struct *p)  static void set_cpus_allowed_rt(struct task_struct *p,  				const struct cpumask *new_mask)  { -	int weight = cpumask_weight(new_mask); +	struct rq *rq; +	int weight;  	BUG_ON(!rt_task(p)); -	/* -	 * Update the migration status of the RQ if we have an RT task -	 * which is running AND changing its weight value. -	 */ -	if (p->on_rq && (weight != p->rt.nr_cpus_allowed)) { -		struct rq *rq = task_rq(p); - -		if (!task_current(rq, p)) { -			/* -			 * Make sure we dequeue this task from the pushable list -			 * before going further.  It will either remain off of -			 * the list because we are no longer pushable, or it -			 * will be requeued. -			 */ -			if (p->rt.nr_cpus_allowed > 1) -				dequeue_pushable_task(rq, p); +	if (!p->on_rq) +		return; -			/* -			 * Requeue if our weight is changing and still > 1 -			 */ -			if (weight > 1) -				enqueue_pushable_task(rq, p); +	weight = cpumask_weight(new_mask); -		} +	/* +	 * Only update if the process changes its state from whether it +	 * can migrate or not. +	 */ +	if ((p->rt.nr_cpus_allowed > 1) == (weight > 1)) +		return; -		if ((p->rt.nr_cpus_allowed <= 1) && (weight > 1)) { -			rq->rt.rt_nr_migratory++; -		} else if ((p->rt.nr_cpus_allowed > 1) && (weight <= 1)) { -			BUG_ON(!rq->rt.rt_nr_migratory); -			rq->rt.rt_nr_migratory--; -		} +	rq = task_rq(p); -		update_rt_migration(&rq->rt); +	/* +	 * The process used to be able to migrate OR it can now migrate +	 */ +	if (weight <= 1) { +		if (!task_current(rq, p)) +			dequeue_pushable_task(rq, p); +		BUG_ON(!rq->rt.rt_nr_migratory); +		rq->rt.rt_nr_migratory--; +	} else { +		if (!task_current(rq, p)) +			enqueue_pushable_task(rq, p); +		rq->rt.rt_nr_migratory++;  	} + +	update_rt_migration(&rq->rt);  }  /* Assumes rq->lock is held */  |