diff options
| author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2008-04-19 13:45:00 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-04-19 13:45:00 -0400 |
| commit | ac884dec6d4a7df252150af875cffddf8f1d9c15 (patch) | |
| tree | 6ba7140a8b6e7b332fd687d24de45d2f6ded8035 /kernel | |
| parent | 58d6c2d72f8628f39e8689fbde8aa177fcf00a37 (diff) | |
sched: fair-group scheduling vs latency
Currently FAIR_GROUP sched grows the scheduler latency outside of
sysctl_sched_latency, invert this so it stays within.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched_fair.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index b89fec93a237..9e301a2bab6f 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -362,29 +362,47 @@ static u64 __sched_period(unsigned long nr_running) | |||
| 362 | */ | 362 | */ |
| 363 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) | 363 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) |
| 364 | { | 364 | { |
| 365 | return calc_delta_mine(__sched_period(cfs_rq->nr_running), | 365 | u64 slice = __sched_period(cfs_rq->nr_running); |
| 366 | se->load.weight, &cfs_rq->load); | 366 | |
| 367 | for_each_sched_entity(se) { | ||
| 368 | cfs_rq = cfs_rq_of(se); | ||
| 369 | |||
| 370 | slice *= se->load.weight; | ||
| 371 | do_div(slice, cfs_rq->load.weight); | ||
| 372 | } | ||
| 373 | |||
| 374 | |||
| 375 | return slice; | ||
| 367 | } | 376 | } |
| 368 | 377 | ||
| 369 | /* | 378 | /* |
| 370 | * We calculate the vruntime slice. | 379 | * We calculate the vruntime slice of a to be inserted task |
| 371 | * | 380 | * |
| 372 | * vs = s/w = p/rw | 381 | * vs = s/w = p/rw |
| 373 | */ | 382 | */ |
| 374 | static u64 __sched_vslice(unsigned long rq_weight, unsigned long nr_running) | 383 | static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se) |
| 375 | { | 384 | { |
| 376 | u64 vslice = __sched_period(nr_running); | 385 | unsigned long nr_running = cfs_rq->nr_running; |
| 386 | unsigned long weight; | ||
| 387 | u64 vslice; | ||
| 377 | 388 | ||
| 378 | vslice *= NICE_0_LOAD; | 389 | if (!se->on_rq) |
| 379 | do_div(vslice, rq_weight); | 390 | nr_running++; |
| 380 | 391 | ||
| 381 | return vslice; | 392 | vslice = __sched_period(nr_running); |
| 382 | } | ||
| 383 | 393 | ||
| 384 | static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se) | 394 | for_each_sched_entity(se) { |
| 385 | { | 395 | cfs_rq = cfs_rq_of(se); |
| 386 | return __sched_vslice(cfs_rq->load.weight + se->load.weight, | 396 | |
| 387 | cfs_rq->nr_running + 1); | 397 | weight = cfs_rq->load.weight; |
| 398 | if (!se->on_rq) | ||
| 399 | weight += se->load.weight; | ||
| 400 | |||
| 401 | vslice *= NICE_0_LOAD; | ||
| 402 | do_div(vslice, weight); | ||
| 403 | } | ||
| 404 | |||
| 405 | return vslice; | ||
| 388 | } | 406 | } |
| 389 | 407 | ||
| 390 | /* | 408 | /* |
