| From 3f22ebd2f4d191631a7b867addc8bd99e948873f Mon Sep 17 00:00:00 2001 |
| From: Nathan Lynch <ntl@pobox.com> |
| Date: Thu, 9 Apr 2009 18:20:02 +0000 |
| Subject: sched: do not count frozen tasks toward load |
| |
| From: Nathan Lynch <ntl@pobox.com> |
| |
| upstream commit: e3c8ca8336707062f3f7cb1cd7e6b3c753baccdd |
| |
| 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> |
| Acked-by: Andrew Morton <akpm@linux-foundation.org> |
| Acked-by: Nigel Cunningham <nigel@tuxonice.net> |
| Tested-by: Nigel Cunningham <nigel@tuxonice.net> |
| Cc: containers@lists.linux-foundation.org |
| Cc: linux-pm@lists.linux-foundation.org |
| Cc: Matt Helsley <matthltc@us.ibm.com> |
| LKML-Reference: <20090408194512.47a99b95@manatee.lan> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| include/linux/sched.h | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/include/linux/sched.h |
| +++ b/include/linux/sched.h |
| @@ -201,7 +201,8 @@ extern unsigned long long time_sync_thre |
| #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) |