sched: HMP fix traversing the rb-tree from the curr pointer
authorMorten Rasmussen <morten.rasmussen@arm.com>
Mon, 19 Aug 2013 14:06:16 +0000 (15:06 +0100)
committerJon Medhurst <tixy@linaro.org>
Mon, 19 Aug 2013 14:41:36 +0000 (15:41 +0100)
The hmp_get_{lightest,heaviest}_task() need to use
__pick_first_entity() to get a pointer to a sched_entity on the rq.
The current is not kept on the rq while running, so its rb-tree node
pointers are no longer valid.

Signed-off-by: Chris Redpath <chris.redpath@arm.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Signed-off-by: Jon Medhurst <tixy@linaro.org>
kernel/sched/fair.c

index 81579411348dca5665a41144e9305386fe0e111a..b801eb0330e1049fe7f8ee17fdbc4a29cde97614 100644 (file)
@@ -3602,6 +3602,8 @@ static struct sched_entity *hmp_get_heaviest_task(
                hmp = hmp_faster_domain(cpu_of(se->cfs_rq->rq));
                hmp_target_mask = &hmp->cpus;
        }
+       /* The currently running task is not on the runqueue */
+       se = __pick_first_entity(cfs_rq_of(se));
 
        while (num_tasks && se) {
                if (entity_is_task(se) &&
@@ -3630,10 +3632,11 @@ static struct sched_entity *hmp_get_lightest_task(
                struct hmp_domain *hmp;
                if (hmp_cpu_is_slowest(cpu_of(se->cfs_rq->rq)))
                        return min_se;
-
                hmp = hmp_slower_domain(cpu_of(se->cfs_rq->rq));
                hmp_target_mask = &hmp->cpus;
        }
+       /* The currently running task is not on the runqueue */
+       se = __pick_first_entity(cfs_rq_of(se));
 
        while (num_tasks && se) {
                if (entity_is_task(se) &&