diff options
author | Con Kolivas <kernel@kolivas.org> | 2006-03-31 05:31:25 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-31 15:18:58 -0500 |
commit | e7c38cb49c6cc05bc11f70d9e9889da1c4a0d37f (patch) | |
tree | 538e26f5ba32d052083dea53536c5366978838c8 | |
parent | 3dee386e14045484a6c41c8f03a263f9d79de740 (diff) |
[PATCH] sched: make task_noninteractive use sleep_type
Alterations to the pipe code in the kernel made it possible for relative
starvation to occur with tasks that slept waiting on a pipe getting unfair
priority bonuses even if they were otherwise fully cpu bound so the
TASK_NONINTERACTIVE flag was introduced which prevented any change to
sleep_avg while sleeping waiting on a pipe. This change also leads to the
converse though, preventing any priority boost from occurring in truly
interactive tasks that wait on pipes.
Convert the TASK_NONINTERACTIVE flag to set sleep_type to SLEEP_NONINTERACTIVE
which will allow a linear bonus to priority based on sleep time thus allowing
interactive tasks to get high priority if they sleep enough.
Signed-off-by: Con Kolivas <kernel@kolivas.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | kernel/sched.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index f55ce5adac55..589e55a42214 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1273,18 +1273,18 @@ out_activate: | |||
1273 | * sleep_avg beyond just interactive state. | 1273 | * sleep_avg beyond just interactive state. |
1274 | */ | 1274 | */ |
1275 | p->sleep_type = SLEEP_NONINTERACTIVE; | 1275 | p->sleep_type = SLEEP_NONINTERACTIVE; |
1276 | } | 1276 | } else |
1277 | 1277 | ||
1278 | /* | 1278 | /* |
1279 | * Tasks that have marked their sleep as noninteractive get | 1279 | * Tasks that have marked their sleep as noninteractive get |
1280 | * woken up without updating their sleep average. (i.e. their | 1280 | * woken up with their sleep average not weighted in an |
1281 | * sleep is handled in a priority-neutral manner, no priority | 1281 | * interactive way. |
1282 | * boost and no penalty.) | ||
1283 | */ | 1282 | */ |
1284 | if (old_state & TASK_NONINTERACTIVE) | 1283 | if (old_state & TASK_NONINTERACTIVE) |
1285 | __activate_task(p, rq); | 1284 | p->sleep_type = SLEEP_NONINTERACTIVE; |
1286 | else | 1285 | |
1287 | activate_task(p, rq, cpu == this_cpu); | 1286 | |
1287 | activate_task(p, rq, cpu == this_cpu); | ||
1288 | /* | 1288 | /* |
1289 | * Sync wakeups (i.e. those types of wakeups where the waker | 1289 | * Sync wakeups (i.e. those types of wakeups where the waker |
1290 | * has indicated that it will leave the CPU in short order) | 1290 | * has indicated that it will leave the CPU in short order) |