2006-01-13 10:23:43

by Con Kolivas

[permalink] [raw]
Subject: [PATCH 3/5] sched-make_task_noninteractive_use_sleep_type.patch

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 <[email protected]>

kernel/sched.c | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)

Index: linux-2.6.15/kernel/sched.c
===================================================================
--- linux-2.6.15.orig/kernel/sched.c
+++ linux-2.6.15/kernel/sched.c
@@ -1348,18 +1348,18 @@ out_activate:
* cpu bound so label them as noninteractive.
*/
p->sleep_type = SLEEP_NONINTERACTIVE;
- }
+ } else

/*
* Tasks that have marked their sleep as noninteractive get
- * woken up without updating their sleep average. (i.e. their
- * sleep is handled in a priority-neutral manner, no priority
- * boost and no penalty.)
+ * woken up with their sleep average not weighted in an
+ * interactive way.
*/
- if (old_state & TASK_NONINTERACTIVE)
- __activate_task(p, rq);
- else
- activate_task(p, rq, cpu == this_cpu);
+ if (old_state & TASK_NONINTERACTIVE)
+ p->sleep_type = SLEEP_NONINTERACTIVE;
+
+
+ activate_task(p, rq, cpu == this_cpu);
/*
* Sync wakeups (i.e. those types of wakeups where the waker
* has indicated that it will leave the CPU in short order)


Attachments:
(No filename) (1.79 kB)
(No filename) (189.00 B)
Download all attachments