diff options
Diffstat (limited to 'kernel/sched_fair.c')
| -rw-r--r-- | kernel/sched_fair.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index c62ebae65cf0..77e9166d7bbf 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -1062,6 +1062,9 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
| 1062 | struct sched_entity *se = __pick_next_entity(cfs_rq); | 1062 | struct sched_entity *se = __pick_next_entity(cfs_rq); |
| 1063 | s64 delta = curr->vruntime - se->vruntime; | 1063 | s64 delta = curr->vruntime - se->vruntime; |
| 1064 | 1064 | ||
| 1065 | if (delta < 0) | ||
| 1066 | return; | ||
| 1067 | |||
| 1065 | if (delta > ideal_runtime) | 1068 | if (delta > ideal_runtime) |
| 1066 | resched_task(rq_of(cfs_rq)->curr); | 1069 | resched_task(rq_of(cfs_rq)->curr); |
| 1067 | } | 1070 | } |
| @@ -1362,27 +1365,27 @@ static long effective_load(struct task_group *tg, int cpu, long wl, long wg) | |||
| 1362 | return wl; | 1365 | return wl; |
| 1363 | 1366 | ||
| 1364 | for_each_sched_entity(se) { | 1367 | for_each_sched_entity(se) { |
| 1365 | long S, rw, s, a, b; | 1368 | long lw, w; |
| 1366 | 1369 | ||
| 1367 | S = se->my_q->tg->shares; | 1370 | tg = se->my_q->tg; |
| 1368 | s = se->load.weight; | 1371 | w = se->my_q->load.weight; |
| 1369 | rw = se->my_q->load.weight; | ||
| 1370 | 1372 | ||
| 1371 | a = S*(rw + wl); | 1373 | /* use this cpu's instantaneous contribution */ |
| 1372 | b = S*rw + s*wg; | 1374 | lw = atomic_read(&tg->load_weight); |
| 1375 | lw -= se->my_q->load_contribution; | ||
| 1376 | lw += w + wg; | ||
| 1373 | 1377 | ||
| 1374 | wl = s*(a-b); | 1378 | wl += w; |
| 1375 | 1379 | ||
| 1376 | if (likely(b)) | 1380 | if (lw > 0 && wl < lw) |
| 1377 | wl /= b; | 1381 | wl = (wl * tg->shares) / lw; |
| 1382 | else | ||
| 1383 | wl = tg->shares; | ||
| 1378 | 1384 | ||
| 1379 | /* | 1385 | /* zero point is MIN_SHARES */ |
| 1380 | * Assume the group is already running and will | 1386 | if (wl < MIN_SHARES) |
| 1381 | * thus already be accounted for in the weight. | 1387 | wl = MIN_SHARES; |
| 1382 | * | 1388 | wl -= se->load.weight; |
| 1383 | * That is, moving shares between CPUs, does not | ||
| 1384 | * alter the group weight. | ||
| 1385 | */ | ||
| 1386 | wg = 0; | 1389 | wg = 0; |
| 1387 | } | 1390 | } |
| 1388 | 1391 | ||
