diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2015-05-08 08:23:45 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-05-19 02:39:18 -0400 |
| commit | 80ed87c8a9ca0cad7ca66cf3bbdfb17559a66dcf (patch) | |
| tree | 7da247bcde968e1ee6900dde15c875a44d145e3b | |
| parent | 8222dbe21e79338de92d5e1956cd1e3994cc9f93 (diff) | |
sched/wait: Introduce TASK_NOLOAD and TASK_IDLE
Currently people use TASK_INTERRUPTIBLE to idle kthreads and wait for
'work' because TASK_UNINTERRUPTIBLE contributes to the loadavg. Having
all idle kthreads contribute to the loadavg is somewhat silly.
Now mostly this works OK, because kthreads have all their signals
masked. However there's a few sites where this is causing problems and
TASK_UNINTERRUPTIBLE should be used, except for that loadavg issue.
This patch adds TASK_NOLOAD which, when combined with
TASK_UNINTERRUPTIBLE avoids the loadavg accounting.
As most of imagined usage sites are loops where a thread wants to
idle, waiting for work, a helper TASK_IDLE is introduced.
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: NeilBrown <neilb@suse.de>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | include/linux/sched.h | 10 | ||||
| -rw-r--r-- | include/trace/events/sched.h | 3 |
2 files changed, 9 insertions, 4 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index dd07ac03f82a..7de815c6fa78 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -218,9 +218,10 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq); | |||
| 218 | #define TASK_WAKEKILL 128 | 218 | #define TASK_WAKEKILL 128 |
| 219 | #define TASK_WAKING 256 | 219 | #define TASK_WAKING 256 |
| 220 | #define TASK_PARKED 512 | 220 | #define TASK_PARKED 512 |
| 221 | #define TASK_STATE_MAX 1024 | 221 | #define TASK_NOLOAD 1024 |
| 222 | #define TASK_STATE_MAX 2048 | ||
| 222 | 223 | ||
| 223 | #define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWP" | 224 | #define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPN" |
| 224 | 225 | ||
| 225 | extern char ___assert_task_state[1 - 2*!!( | 226 | extern char ___assert_task_state[1 - 2*!!( |
| 226 | sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; | 227 | sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; |
| @@ -230,6 +231,8 @@ extern char ___assert_task_state[1 - 2*!!( | |||
| 230 | #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) | 231 | #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) |
| 231 | #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) | 232 | #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) |
| 232 | 233 | ||
| 234 | #define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) | ||
| 235 | |||
| 233 | /* Convenience macros for the sake of wake_up */ | 236 | /* Convenience macros for the sake of wake_up */ |
| 234 | #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) | 237 | #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) |
| 235 | #define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) | 238 | #define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) |
| @@ -245,7 +248,8 @@ extern char ___assert_task_state[1 - 2*!!( | |||
| 245 | ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) | 248 | ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) |
| 246 | #define task_contributes_to_load(task) \ | 249 | #define task_contributes_to_load(task) \ |
| 247 | ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ | 250 | ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ |
| 248 | (task->flags & PF_FROZEN) == 0) | 251 | (task->flags & PF_FROZEN) == 0 && \ |
| 252 | (task->state & TASK_NOLOAD) == 0) | ||
| 249 | 253 | ||
| 250 | #ifdef CONFIG_DEBUG_ATOMIC_SLEEP | 254 | #ifdef CONFIG_DEBUG_ATOMIC_SLEEP |
| 251 | 255 | ||
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 30fedaf3e56a..d57a575fe31f 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h | |||
| @@ -147,7 +147,8 @@ TRACE_EVENT(sched_switch, | |||
| 147 | __print_flags(__entry->prev_state & (TASK_STATE_MAX-1), "|", | 147 | __print_flags(__entry->prev_state & (TASK_STATE_MAX-1), "|", |
| 148 | { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" }, | 148 | { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" }, |
| 149 | { 16, "Z" }, { 32, "X" }, { 64, "x" }, | 149 | { 16, "Z" }, { 32, "X" }, { 64, "x" }, |
| 150 | { 128, "K" }, { 256, "W" }, { 512, "P" }) : "R", | 150 | { 128, "K" }, { 256, "W" }, { 512, "P" }, |
| 151 | { 1024, "N" }) : "R", | ||
| 151 | __entry->prev_state & TASK_STATE_MAX ? "+" : "", | 152 | __entry->prev_state & TASK_STATE_MAX ? "+" : "", |
| 152 | __entry->next_comm, __entry->next_pid, __entry->next_prio) | 153 | __entry->next_comm, __entry->next_pid, __entry->next_prio) |
| 153 | ); | 154 | ); |
