Messages in this thread Patch in this message | | | Date | Wed, 8 Apr 2009 19:45:12 -0500 | From | Nathan Lynch <> | Subject | [PATCH/RFC] do not count frozen tasks toward load |
| |
Freezing tasks via the cgroup freezer causes the load average to climb because the freezer's current implementation puts frozen tasks in uninterruptible sleep (D state).
Some applications which perform job-scheduling functions consult the load average when making decisions. If a cgroup is frozen, the load average does not provide a useful measure of the system's utilization to such applications. This is especially inconvenient if the job scheduler employs the cgroup freezer as a mechanism for preempting low priority jobs. Contrast this with using SIGSTOP for the same purpose: the stopped tasks do not count toward system load.
Change task_contributes_to_load() to return false if the task is frozen. This results in /proc/loadavg behavior that better meets users' expectations.
Signed-off-by: Nathan Lynch <ntl@pobox.com> --- include/linux/sched.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h index 011db2f..f8af167 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -202,7 +202,8 @@ extern unsigned long long time_sync_thresh; #define task_is_stopped_or_traced(task) \ ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) #define task_contributes_to_load(task) \ - ((task->state & TASK_UNINTERRUPTIBLE) != 0) + ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ + (task->flags & PF_FROZEN) == 0) #define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0) -- 1.6.0.6
| |