aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched_fair.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r--kernel/sched_fair.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 9e301a2bab6f..ed8ce329899b 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -533,6 +533,7 @@ account_entity_enqueue(struct cfs_rq *cfs_rq, struct sched_entity *se)
533 add_cfs_task_weight(cfs_rq, se->load.weight); 533 add_cfs_task_weight(cfs_rq, se->load.weight);
534 cfs_rq->nr_running++; 534 cfs_rq->nr_running++;
535 se->on_rq = 1; 535 se->on_rq = 1;
536 list_add(&se->group_node, &cfs_rq->tasks);
536} 537}
537 538
538static void 539static void
@@ -545,6 +546,7 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
545 add_cfs_task_weight(cfs_rq, -se->load.weight); 546 add_cfs_task_weight(cfs_rq, -se->load.weight);
546 cfs_rq->nr_running--; 547 cfs_rq->nr_running--;
547 se->on_rq = 0; 548 se->on_rq = 0;
549 list_del_init(&se->group_node);
548} 550}
549 551
550static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) 552static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
@@ -1289,21 +1291,24 @@ static void put_prev_task_fair(struct rq *rq, struct task_struct *prev)
1289 * the current task: 1291 * the current task:
1290 */ 1292 */
1291static struct task_struct * 1293static struct task_struct *
1292__load_balance_iterator(struct cfs_rq *cfs_rq, struct rb_node *curr) 1294__load_balance_iterator(struct cfs_rq *cfs_rq, struct list_head *next)
1293{ 1295{
1294 struct task_struct *p = NULL; 1296 struct task_struct *p = NULL;
1295 struct sched_entity *se; 1297 struct sched_entity *se;
1296 1298
1297 if (!curr) 1299 if (next == &cfs_rq->tasks)
1298 return NULL; 1300 return NULL;
1299 1301
1300 /* Skip over entities that are not tasks */ 1302 /* Skip over entities that are not tasks */
1301 do { 1303 do {
1302 se = rb_entry(curr, struct sched_entity, run_node); 1304 se = list_entry(next, struct sched_entity, group_node);
1303 curr = rb_next(curr); 1305 next = next->next;
1304 } while (curr && !entity_is_task(se)); 1306 } while (next != &cfs_rq->tasks && !entity_is_task(se));
1305 1307
1306 cfs_rq->rb_load_balance_curr = curr; 1308 if (next == &cfs_rq->tasks)
1309 return NULL;
1310
1311 cfs_rq->balance_iterator = next;
1307 1312
1308 if (entity_is_task(se)) 1313 if (entity_is_task(se))
1309 p = task_of(se); 1314 p = task_of(se);
@@ -1315,14 +1320,14 @@ static struct task_struct *load_balance_start_fair(void *arg)
1315{ 1320{
1316 struct cfs_rq *cfs_rq = arg; 1321 struct cfs_rq *cfs_rq = arg;
1317 1322
1318 return __load_balance_iterator(cfs_rq, first_fair(cfs_rq)); 1323 return __load_balance_iterator(cfs_rq, cfs_rq->tasks.next);
1319} 1324}
1320 1325
1321static struct task_struct *load_balance_next_fair(void *arg) 1326static struct task_struct *load_balance_next_fair(void *arg)
1322{ 1327{
1323 struct cfs_rq *cfs_rq = arg; 1328 struct cfs_rq *cfs_rq = arg;
1324 1329
1325 return __load_balance_iterator(cfs_rq, cfs_rq->rb_load_balance_curr); 1330 return __load_balance_iterator(cfs_rq, cfs_rq->balance_iterator);
1326} 1331}
1327 1332
1328static unsigned long 1333static unsigned long