|
@@ -1351,16 +1351,22 @@ out:
|
|
|
|
|
|
static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p)
|
|
|
{
|
|
|
- if (rq->curr->nr_cpus_allowed == 1)
|
|
|
+ /*
|
|
|
+ * Current can't be migrated, useless to reschedule,
|
|
|
+ * let's hope p can move out.
|
|
|
+ */
|
|
|
+ if (rq->curr->nr_cpus_allowed == 1 ||
|
|
|
+ !cpupri_find(&rq->rd->cpupri, rq->curr, NULL))
|
|
|
return;
|
|
|
|
|
|
+ /*
|
|
|
+ * p is migratable, so let's not schedule it and
|
|
|
+ * see if it is pushed or pulled somewhere else.
|
|
|
+ */
|
|
|
if (p->nr_cpus_allowed != 1
|
|
|
&& cpupri_find(&rq->rd->cpupri, p, NULL))
|
|
|
return;
|
|
|
|
|
|
- if (!cpupri_find(&rq->rd->cpupri, rq->curr, NULL))
|
|
|
- return;
|
|
|
-
|
|
|
/*
|
|
|
* There appears to be other cpus that can accept
|
|
|
* current and none to run 'p', so lets reschedule
|