|
@@ -1394,6 +1394,7 @@ static int push_rt_task(struct rq *rq)
|
|
{
|
|
{
|
|
struct task_struct *next_task;
|
|
struct task_struct *next_task;
|
|
struct rq *lowest_rq;
|
|
struct rq *lowest_rq;
|
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (!rq->rt.overloaded)
|
|
if (!rq->rt.overloaded)
|
|
return 0;
|
|
return 0;
|
|
@@ -1426,7 +1427,7 @@ retry:
|
|
if (!lowest_rq) {
|
|
if (!lowest_rq) {
|
|
struct task_struct *task;
|
|
struct task_struct *task;
|
|
/*
|
|
/*
|
|
- * find lock_lowest_rq releases rq->lock
|
|
|
|
|
|
+ * find_lock_lowest_rq releases rq->lock
|
|
* so it is possible that next_task has migrated.
|
|
* so it is possible that next_task has migrated.
|
|
*
|
|
*
|
|
* We need to make sure that the task is still on the same
|
|
* We need to make sure that the task is still on the same
|
|
@@ -1436,12 +1437,11 @@ retry:
|
|
task = pick_next_pushable_task(rq);
|
|
task = pick_next_pushable_task(rq);
|
|
if (task_cpu(next_task) == rq->cpu && task == next_task) {
|
|
if (task_cpu(next_task) == rq->cpu && task == next_task) {
|
|
/*
|
|
/*
|
|
- * If we get here, the task hasn't moved at all, but
|
|
|
|
- * it has failed to push. We will not try again,
|
|
|
|
- * since the other cpus will pull from us when they
|
|
|
|
- * are ready.
|
|
|
|
|
|
+ * The task hasn't migrated, and is still the next
|
|
|
|
+ * eligible task, but we failed to find a run-queue
|
|
|
|
+ * to push it to. Do not retry in this case, since
|
|
|
|
+ * other cpus will pull from us when ready.
|
|
*/
|
|
*/
|
|
- dequeue_pushable_task(rq, next_task);
|
|
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1460,6 +1460,7 @@ retry:
|
|
deactivate_task(rq, next_task, 0);
|
|
deactivate_task(rq, next_task, 0);
|
|
set_task_cpu(next_task, lowest_rq->cpu);
|
|
set_task_cpu(next_task, lowest_rq->cpu);
|
|
activate_task(lowest_rq, next_task, 0);
|
|
activate_task(lowest_rq, next_task, 0);
|
|
|
|
+ ret = 1;
|
|
|
|
|
|
resched_task(lowest_rq->curr);
|
|
resched_task(lowest_rq->curr);
|
|
|
|
|
|
@@ -1468,7 +1469,7 @@ retry:
|
|
out:
|
|
out:
|
|
put_task_struct(next_task);
|
|
put_task_struct(next_task);
|
|
|
|
|
|
- return 1;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static void push_rt_tasks(struct rq *rq)
|
|
static void push_rt_tasks(struct rq *rq)
|