Merge branch 'tip/sched/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rosted...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / sched / rt.c
index 44af55e6d5d0ffcea0691ad28b800c24b9567696..c5565c3c515fd2d15dc5ed95f59a970fca087815 100644 (file)
@@ -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 */