* [PATCH 0/6] a perf and some sched patches
@ 2009-12-17 12:16 Peter Zijlstra
2009-12-17 12:16 ` [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits Peter Zijlstra
` (6 more replies)
0 siblings, 7 replies; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML
Fixes an issue with the per-task-per-cpu counters, reported by acme.
Fixes an false positive in the set_task_cpu() debug check, reported by Ingo.
Fixes up the task->state to char bits, gumbled at by tglx.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:30 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 2/6] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR Peter Zijlstra
` (5 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra
[-- Attachment #1: sched-state.patch --]
[-- Type: text/plain, Size: 924 bytes --]
So that we don't keep forgetting about it
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
---
include/linux/sched.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-2.6/include/linux/sched.h
===================================================================
--- linux-2.6.orig/include/linux/sched.h
+++ linux-2.6/include/linux/sched.h
@@ -193,6 +193,8 @@ print_cfs_rq(struct seq_file *m, int cpu
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
+#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
+
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
@@ -2595,8 +2597,6 @@ static inline void mm_init_owner(struct
}
#endif /* CONFIG_MM_OWNER */
-#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
-
#endif /* __KERNEL__ */
#endif
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/6] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
2009-12-17 12:16 ` [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 3/6] sched: Update task_state_arraypwith new states Peter Zijlstra
` (4 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra
[-- Attachment #1: sched-state-1.patch --]
[-- Type: text/plain, Size: 756 bytes --]
We grew 3 new task states since the last time someone touched it.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
---
include/linux/sched.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: linux-2.6/include/linux/sched.h
===================================================================
--- linux-2.6.orig/include/linux/sched.h
+++ linux-2.6/include/linux/sched.h
@@ -193,7 +193,7 @@ print_cfs_rq(struct seq_file *m, int cpu
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
-#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
+#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/6] sched: Update task_state_arraypwith new states
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
2009-12-17 12:16 ` [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits Peter Zijlstra
2009-12-17 12:16 ` [PATCH 2/6] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 4/6] sched: Assert task state bits at build time Peter Zijlstra
` (3 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra
[-- Attachment #1: sched-state-2.patch --]
[-- Type: text/plain, Size: 841 bytes --]
Neglected because its hidden... (who reads comments anyway)
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
---
fs/proc/array.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Index: linux-2.6/fs/proc/array.c
===================================================================
--- linux-2.6.orig/fs/proc/array.c
+++ linux-2.6/fs/proc/array.c
@@ -138,9 +138,12 @@ static const char *task_state_array[] =
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
- "T (tracing stop)", /* 8 */
+ "t (tracing stop)", /* 8 */
"Z (zombie)", /* 16 */
- "X (dead)" /* 32 */
+ "X (dead)", /* 32 */
+ "x (dead)", /* 64 */
+ "K (wakekill)", /* 128 */
+ "W (waking)", /* 256 */
};
static inline const char *get_task_state(struct task_struct *tsk)
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/6] sched: Assert task state bits at build time
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
` (2 preceding siblings ...)
2009-12-17 12:16 ` [PATCH 3/6] sched: Update task_state_arraypwith new states Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 5/6] sched: Fix broken assertion Peter Zijlstra
` (2 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra
[-- Attachment #1: sched-state-3.patch --]
[-- Type: text/plain, Size: 2104 bytes --]
Since everybody is lazy and prone to forgetting things, make the
compiler help us a bit.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
---
fs/proc/array.c | 18 ++++++++++--------
include/linux/sched.h | 4 ++++
2 files changed, 14 insertions(+), 8 deletions(-)
Index: linux-2.6/fs/proc/array.c
===================================================================
--- linux-2.6.orig/fs/proc/array.c
+++ linux-2.6/fs/proc/array.c
@@ -134,14 +134,14 @@ static inline void task_name(struct seq_
* simple bit tests.
*/
static const char *task_state_array[] = {
- "R (running)", /* 0 */
- "S (sleeping)", /* 1 */
- "D (disk sleep)", /* 2 */
- "T (stopped)", /* 4 */
- "t (tracing stop)", /* 8 */
- "Z (zombie)", /* 16 */
- "X (dead)", /* 32 */
- "x (dead)", /* 64 */
+ "R (running)", /* 0 */
+ "S (sleeping)", /* 1 */
+ "D (disk sleep)", /* 2 */
+ "T (stopped)", /* 4 */
+ "t (tracing stop)", /* 8 */
+ "Z (zombie)", /* 16 */
+ "X (dead)", /* 32 */
+ "x (dead)", /* 64 */
"K (wakekill)", /* 128 */
"W (waking)", /* 256 */
};
@@ -151,6 +151,8 @@ static inline const char *get_task_state
unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;
const char **p = &task_state_array[0];
+ BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array));
+
while (state) {
p++;
state >>= 1;
Index: linux-2.6/include/linux/sched.h
===================================================================
--- linux-2.6.orig/include/linux/sched.h
+++ linux-2.6/include/linux/sched.h
@@ -192,9 +192,13 @@ print_cfs_rq(struct seq_file *m, int cpu
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
+#define TASK_STATE_MAX 512
#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
+extern char ___assert_task_state[1 - 2*!!(
+ sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
+
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 5/6] sched: Fix broken assertion
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
` (3 preceding siblings ...)
2009-12-17 12:16 ` [PATCH 4/6] sched: Assert task state bits at build time Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 6/6] perf: Dont report side-band events on each cpu for per-task-per-cpu events Peter Zijlstra
2009-12-17 12:23 ` [PATCH 0/6] a perf and some sched patches Ingo Molnar
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra
[-- Attachment #1: foo14.patch --]
[-- Type: text/plain, Size: 987 bytes --]
There's a preemption race in the set_task_cpu() debug check in that
when we get preempted after setting task->state we'd still be on the
rq proper, but fail the test.
Check for preempted tasks, since those are always on the RQ.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
---
kernel/sched.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Index: linux-2.6/kernel/sched.c
===================================================================
--- linux-2.6.orig/kernel/sched.c
+++ linux-2.6/kernel/sched.c
@@ -2041,7 +2041,8 @@ void set_task_cpu(struct task_struct *p,
* We should never call set_task_cpu() on a blocked task,
* ttwu() will sort out the placement.
*/
- WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING);
+ WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING &&
+ !(task_thread_info(p)->preempt_count & PREEMPT_ACTIVE));
#endif
trace_sched_migrate_task(p, new_cpu);
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 6/6] perf: Dont report side-band events on each cpu for per-task-per-cpu events
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
` (4 preceding siblings ...)
2009-12-17 12:16 ` [PATCH 5/6] sched: Fix broken assertion Peter Zijlstra
@ 2009-12-17 12:16 ` Peter Zijlstra
2009-12-17 12:30 ` [tip:perf/urgent] perf events: " tip-bot for Peter Zijlstra
2009-12-17 12:23 ` [PATCH 0/6] a perf and some sched patches Ingo Molnar
6 siblings, 1 reply; 14+ messages in thread
From: Peter Zijlstra @ 2009-12-17 12:16 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Thomas Gleixner, LKML, Peter Zijlstra, Paul Mackerras
[-- Attachment #1: perf4.patch --]
[-- Type: text/plain, Size: 3283 bytes --]
Acme noticed that his FORK/MMAP numbers were inflated by about the
same factor as his cpu-count.
This led to the discovery of a few more sites that need to respect the
event->cpu filter.
Reported-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
---
kernel/perf_event.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
Index: linux-2.6/kernel/perf_event.c
===================================================================
--- linux-2.6.orig/kernel/perf_event.c
+++ linux-2.6/kernel/perf_event.c
@@ -1381,6 +1381,9 @@ static void perf_ctx_adjust_freq(struct
if (event->state != PERF_EVENT_STATE_ACTIVE)
continue;
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ continue;
+
hwc = &event->hw;
interrupts = hwc->interrupts;
@@ -3265,6 +3268,9 @@ static void perf_event_task_output(struc
static int perf_event_task_match(struct perf_event *event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.comm || event->attr.mmap || event->attr.task)
return 1;
@@ -3290,12 +3296,11 @@ static void perf_event_task_event(struct
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_task_ctx(&cpuctx->ctx, task_event);
- put_cpu_var(perf_cpu_context);
-
if (!ctx)
ctx = rcu_dereference(task_event->task->perf_event_ctxp);
if (ctx)
perf_event_task_ctx(ctx, task_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
}
@@ -3372,6 +3377,9 @@ static void perf_event_comm_output(struc
static int perf_event_comm_match(struct perf_event *event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.comm)
return 1;
@@ -3408,15 +3416,10 @@ static void perf_event_comm_event(struct
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_comm_ctx(&cpuctx->ctx, comm_event);
- put_cpu_var(perf_cpu_context);
-
- /*
- * doesn't really matter which of the child contexts the
- * events ends up in.
- */
ctx = rcu_dereference(current->perf_event_ctxp);
if (ctx)
perf_event_comm_ctx(ctx, comm_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
}
@@ -3491,6 +3494,9 @@ static void perf_event_mmap_output(struc
static int perf_event_mmap_match(struct perf_event *event,
struct perf_mmap_event *mmap_event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.mmap)
return 1;
@@ -3564,15 +3570,10 @@ got_name:
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_mmap_ctx(&cpuctx->ctx, mmap_event);
- put_cpu_var(perf_cpu_context);
-
- /*
- * doesn't really matter which of the child contexts the
- * events ends up in.
- */
ctx = rcu_dereference(current->perf_event_ctxp);
if (ctx)
perf_event_mmap_ctx(ctx, mmap_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
kfree(buf);
@@ -3863,6 +3864,9 @@ static int perf_swevent_match(struct per
struct perf_sample_data *data,
struct pt_regs *regs)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (!perf_swevent_is_counting(event))
return 0;
--
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/6] a perf and some sched patches
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
` (5 preceding siblings ...)
2009-12-17 12:16 ` [PATCH 6/6] perf: Dont report side-band events on each cpu for per-task-per-cpu events Peter Zijlstra
@ 2009-12-17 12:23 ` Ingo Molnar
6 siblings, 0 replies; 14+ messages in thread
From: Ingo Molnar @ 2009-12-17 12:23 UTC (permalink / raw)
To: Peter Zijlstra; +Cc: Thomas Gleixner, LKML, Mike Galbraith
* Peter Zijlstra <a.p.zijlstra@chello.nl> wrote:
> Fixes an issue with the per-task-per-cpu counters, reported by acme. Fixes
> an false positive in the set_task_cpu() debug check, reported by Ingo. Fixes
> up the task->state to char bits, gumbled at by tglx.
Applied, thanks Peter!
Ingo
^ permalink raw reply [flat|nested] 14+ messages in thread
* [tip:perf/urgent] perf events: Dont report side-band events on each cpu for per-task-per-cpu events
2009-12-17 12:16 ` [PATCH 6/6] perf: Dont report side-band events on each cpu for per-task-per-cpu events Peter Zijlstra
@ 2009-12-17 12:30 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:30 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, hpa, mingo, a.p.zijlstra, acme, tglx, mingo
Commit-ID: 5d27c23df09b702868d9a3bff86ec6abd22963ac
Gitweb: http://git.kernel.org/tip/5d27c23df09b702868d9a3bff86ec6abd22963ac
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:32 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:21:36 +0100
perf events: Dont report side-band events on each cpu for per-task-per-cpu events
Acme noticed that his FORK/MMAP numbers were inflated by about
the same factor as his cpu-count.
This led to the discovery of a few more sites that need to
respect the event->cpu filter.
Reported-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <20091217121830.215333434@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/perf_event.c | 32 ++++++++++++++++++--------------
1 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/kernel/perf_event.c b/kernel/perf_event.c
index 8ab8698..03cc061 100644
--- a/kernel/perf_event.c
+++ b/kernel/perf_event.c
@@ -1381,6 +1381,9 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx)
if (event->state != PERF_EVENT_STATE_ACTIVE)
continue;
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ continue;
+
hwc = &event->hw;
interrupts = hwc->interrupts;
@@ -3265,6 +3268,9 @@ static void perf_event_task_output(struct perf_event *event,
static int perf_event_task_match(struct perf_event *event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.comm || event->attr.mmap || event->attr.task)
return 1;
@@ -3290,12 +3296,11 @@ static void perf_event_task_event(struct perf_task_event *task_event)
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_task_ctx(&cpuctx->ctx, task_event);
- put_cpu_var(perf_cpu_context);
-
if (!ctx)
ctx = rcu_dereference(task_event->task->perf_event_ctxp);
if (ctx)
perf_event_task_ctx(ctx, task_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
}
@@ -3372,6 +3377,9 @@ static void perf_event_comm_output(struct perf_event *event,
static int perf_event_comm_match(struct perf_event *event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.comm)
return 1;
@@ -3408,15 +3416,10 @@ static void perf_event_comm_event(struct perf_comm_event *comm_event)
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_comm_ctx(&cpuctx->ctx, comm_event);
- put_cpu_var(perf_cpu_context);
-
- /*
- * doesn't really matter which of the child contexts the
- * events ends up in.
- */
ctx = rcu_dereference(current->perf_event_ctxp);
if (ctx)
perf_event_comm_ctx(ctx, comm_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
}
@@ -3491,6 +3494,9 @@ static void perf_event_mmap_output(struct perf_event *event,
static int perf_event_mmap_match(struct perf_event *event,
struct perf_mmap_event *mmap_event)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (event->attr.mmap)
return 1;
@@ -3564,15 +3570,10 @@ got_name:
rcu_read_lock();
cpuctx = &get_cpu_var(perf_cpu_context);
perf_event_mmap_ctx(&cpuctx->ctx, mmap_event);
- put_cpu_var(perf_cpu_context);
-
- /*
- * doesn't really matter which of the child contexts the
- * events ends up in.
- */
ctx = rcu_dereference(current->perf_event_ctxp);
if (ctx)
perf_event_mmap_ctx(ctx, mmap_event);
+ put_cpu_var(perf_cpu_context);
rcu_read_unlock();
kfree(buf);
@@ -3863,6 +3864,9 @@ static int perf_swevent_match(struct perf_event *event,
struct perf_sample_data *data,
struct pt_regs *regs)
{
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
+ return 0;
+
if (!perf_swevent_is_counting(event))
return 0;
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [tip:sched/urgent] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits
2009-12-17 12:16 ` [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits Peter Zijlstra
@ 2009-12-17 12:30 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:30 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: 733421516b42c44b9e21f1793c430cc801ef8324
Gitweb: http://git.kernel.org/tip/733421516b42c44b9e21f1793c430cc801ef8324
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:27 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:22:43 +0100
sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits
So that we don't keep forgetting about it.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20091217121829.815779372@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
include/linux/sched.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 973b2b8..c28ed1b 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -193,6 +193,8 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
+#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
+
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
@@ -2595,8 +2597,6 @@ static inline void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
}
#endif /* CONFIG_MM_OWNER */
-#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
-
#endif /* __KERNEL__ */
#endif
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [tip:sched/urgent] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR
2009-12-17 12:16 ` [PATCH 2/6] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR Peter Zijlstra
@ 2009-12-17 12:31 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:31 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: 44d90df6b757c59651ddd55f1a84f28132b50d29
Gitweb: http://git.kernel.org/tip/44d90df6b757c59651ddd55f1a84f28132b50d29
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:28 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:22:44 +0100
sched: Add missing state chars to TASK_STATE_TO_CHAR_STR
We grew 3 new task states since the last time someone touched
it.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20091217121829.892737686@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
include/linux/sched.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index c28ed1b..94858df 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -193,7 +193,7 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
-#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
+#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [tip:sched/urgent] sched: Update task_state_arraypwith new states
2009-12-17 12:16 ` [PATCH 3/6] sched: Update task_state_arraypwith new states Peter Zijlstra
@ 2009-12-17 12:31 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:31 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: 464763cf1c6df632dccc8f2f4c7e50163154a2c0
Gitweb: http://git.kernel.org/tip/464763cf1c6df632dccc8f2f4c7e50163154a2c0
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:29 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:22:45 +0100
sched: Update task_state_arraypwith new states
Neglected because its hidden... (who reads comments anyway)
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20091217121829.970166036@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
fs/proc/array.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/fs/proc/array.c b/fs/proc/array.c
index 4badde1..96361e8 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -138,9 +138,12 @@ static const char *task_state_array[] = {
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
- "T (tracing stop)", /* 8 */
+ "t (tracing stop)", /* 8 */
"Z (zombie)", /* 16 */
- "X (dead)" /* 32 */
+ "X (dead)", /* 32 */
+ "x (dead)", /* 64 */
+ "K (wakekill)", /* 128 */
+ "W (waking)", /* 256 */
};
static inline const char *get_task_state(struct task_struct *tsk)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [tip:sched/urgent] sched: Assert task state bits at build time
2009-12-17 12:16 ` [PATCH 4/6] sched: Assert task state bits at build time Peter Zijlstra
@ 2009-12-17 12:31 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:31 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: e1781538cf5c870ab696e9b8f0a5c498d3900f2f
Gitweb: http://git.kernel.org/tip/e1781538cf5c870ab696e9b8f0a5c498d3900f2f
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:30 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:22:45 +0100
sched: Assert task state bits at build time
Since everybody is lazy and prone to forgetting things, make the
compiler help us a bit.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20091217121830.060186433@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
fs/proc/array.c | 18 ++++++++++--------
include/linux/sched.h | 4 ++++
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/fs/proc/array.c b/fs/proc/array.c
index 96361e8..f560325 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -134,14 +134,14 @@ static inline void task_name(struct seq_file *m, struct task_struct *p)
* simple bit tests.
*/
static const char *task_state_array[] = {
- "R (running)", /* 0 */
- "S (sleeping)", /* 1 */
- "D (disk sleep)", /* 2 */
- "T (stopped)", /* 4 */
- "t (tracing stop)", /* 8 */
- "Z (zombie)", /* 16 */
- "X (dead)", /* 32 */
- "x (dead)", /* 64 */
+ "R (running)", /* 0 */
+ "S (sleeping)", /* 1 */
+ "D (disk sleep)", /* 2 */
+ "T (stopped)", /* 4 */
+ "t (tracing stop)", /* 8 */
+ "Z (zombie)", /* 16 */
+ "X (dead)", /* 32 */
+ "x (dead)", /* 64 */
"K (wakekill)", /* 128 */
"W (waking)", /* 256 */
};
@@ -151,6 +151,8 @@ static inline const char *get_task_state(struct task_struct *tsk)
unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;
const char **p = &task_state_array[0];
+ BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array));
+
while (state) {
p++;
state >>= 1;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 94858df..3754387 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -192,9 +192,13 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
+#define TASK_STATE_MAX 512
#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
+extern char ___assert_task_state[1 - 2*!!(
+ sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
+
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [tip:sched/urgent] sched: Fix broken assertion
2009-12-17 12:16 ` [PATCH 5/6] sched: Fix broken assertion Peter Zijlstra
@ 2009-12-17 12:31 ` tip-bot for Peter Zijlstra
0 siblings, 0 replies; 14+ messages in thread
From: tip-bot for Peter Zijlstra @ 2009-12-17 12:31 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: 077614ee1e93245a3b9a4e1213659405dbeb0ba6
Gitweb: http://git.kernel.org/tip/077614ee1e93245a3b9a4e1213659405dbeb0ba6
Author: Peter Zijlstra <a.p.zijlstra@chello.nl>
AuthorDate: Thu, 17 Dec 2009 13:16:31 +0100
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Thu, 17 Dec 2009 13:22:46 +0100
sched: Fix broken assertion
There's a preemption race in the set_task_cpu() debug check in
that when we get preempted after setting task->state we'd still
be on the rq proper, but fail the test.
Check for preempted tasks, since those are always on the RQ.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20091217121830.137155561@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/sched.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/kernel/sched.c b/kernel/sched.c
index 7be88a7..720df10 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2041,7 +2041,8 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu)
* We should never call set_task_cpu() on a blocked task,
* ttwu() will sort out the placement.
*/
- WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING);
+ WARN_ON_ONCE(p->state != TASK_RUNNING && p->state != TASK_WAKING &&
+ !(task_thread_info(p)->preempt_count & PREEMPT_ACTIVE));
#endif
trace_sched_migrate_task(p, new_cpu);
^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2009-12-17 12:33 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-17 12:16 [PATCH 0/6] a perf and some sched patches Peter Zijlstra
2009-12-17 12:16 ` [PATCH 1/6] sched: Move TASK_STATE_TO_CHAR_STR near the TASK_state bits Peter Zijlstra
2009-12-17 12:30 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 2/6] sched: Add missing state chars to TASK_STATE_TO_CHAR_STR Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 3/6] sched: Update task_state_arraypwith new states Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 4/6] sched: Assert task state bits at build time Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 5/6] sched: Fix broken assertion Peter Zijlstra
2009-12-17 12:31 ` [tip:sched/urgent] " tip-bot for Peter Zijlstra
2009-12-17 12:16 ` [PATCH 6/6] perf: Dont report side-band events on each cpu for per-task-per-cpu events Peter Zijlstra
2009-12-17 12:30 ` [tip:perf/urgent] perf events: " tip-bot for Peter Zijlstra
2009-12-17 12:23 ` [PATCH 0/6] a perf and some sched patches Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox