mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [BUG] events process running on wrong cpu
@ 2009-09-21  8:51 Heiko Carstens
  2009-09-21  9:02 ` Peter Zijlstra
  2009-09-21  9:06 ` [PATCH] Always show Cpus_allowed field in /proc/<pid>/status Heiko Carstens
  0 siblings, 2 replies; 8+ messages in thread
From: Heiko Carstens @ 2009-09-21  8:51 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Oleg Nesterov, Peter Zijlstra; +Cc: linux-kernel

Hi,

with todays git from time to time I get this (s390 defconfig):


BUG: using smp_processor_id() in preemptible [00000000] code: events/1/16
caller is vmstat_update+0x28/0x74
CPU: 0 Not tainted 2.6.31-06618-gebc79c4-dirty #3
Process events/1 (pid: 16, task: 000000003fcbea00, ksp: 000000003fcd7cd8)
000000003fcd7da8 000000003fcd7d28 0000000000000002 0000000000000000 
       000000003fcd7dc8 000000003fcd7d40 000000003fcd7d40 00000000003fe46a 
       000000000001ffff 000000003fcd7e70 000000000192b128 ffffffffffffc000 
       000000000000000d 000000000000000c 000000003fcd7d90 0000000000000000 
       0000000000000000 0000000000016bda 000000003fcd7d28 000000003fcd7d68 
Call Trace:
([<0000000000016aea>] show_trace+0xe6/0x134)
 [<0000000000202a5e>] debug_smp_processor_id+0x112/0x12c
 [<00000000000b302c>] vmstat_update+0x28/0x74
 [<000000000005fb9a>] worker_thread+0x19a/0x27c
 [<0000000000065f80>] kthread+0xa0/0xa8
 [<000000000001b786>] kernel_thread_starter+0x6/0xc
 [<000000000001b780>] kernel_thread_starter+0x0/0xc

Please note that events/1 is running in cpu 0 (!).

But (with a patched procfs output):

[root@h4245004 ~]# cat /proc/16/status 
Name:   events/1
State:  S (sleeping)
Tgid:   16
Pid:    16
PPid:   2
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 64
Groups:
Threads:        1
SigQ:   0/4096
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffffffffff
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: fffffffffffffeff
CapBnd: fffffffffffffeff
Cpus_allowed:   00000002  <----------
Cpus_allowed_list:      1 <----------
task: 000000003fcbea00, ksp: 000000003fcd7cd8
User PSW : 0704000180000000 000000000001b780
User GPRS: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
           0000000000000000 0000000000000000 0000000000000000 0000000000000000
           0000000000000000 0000000000065ee0 000000003fe73cf8 000000000004d414
           0000000000000000 0000000000000000 0000000000000000 000000003fcd7eb8
User ACRS: 00000000 00000000 00000000 00000000
           00000000 00000000 00000000 00000000
           00000000 00000000 00000000 00000000
           00000000 00000000 00000000 00000000
voluntary_ctxt_switches:        55
nonvoluntary_ctxt_switches:     1

So the cpus_allowed mask is correct (later on at least). Looks like the
created kthread ran before its cpus_allowed mask was set.
Looking at the code this shouldn't happen. But still...

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [BUG] events process running on wrong cpu
  2009-09-21  8:51 [BUG] events process running on wrong cpu Heiko Carstens
@ 2009-09-21  9:02 ` Peter Zijlstra
  2009-09-21  9:03   ` Ingo Molnar
  2009-09-21  9:06 ` [PATCH] Always show Cpus_allowed field in /proc/<pid>/status Heiko Carstens
  1 sibling, 1 reply; 8+ messages in thread
From: Peter Zijlstra @ 2009-09-21  9:02 UTC (permalink / raw)
  To: Heiko Carstens; +Cc: Ingo Molnar, Andrew Morton, Oleg Nesterov, linux-kernel

On Mon, 2009-09-21 at 10:51 +0200, Heiko Carstens wrote:
> Hi,
> 
> with todays git from time to time I get this (s390 defconfig):

Yep, I messed up..

Does your kernel contain the below?


---
commit 3f04e8cd5b24727a2500f8ab8f3de730ba47b02c
Author: Mike Galbraith <efault@gmx.de>
Date:   Sat Sep 19 16:52:35 2009 +0200

    sched: Re-add lost cpu_allowed check to sched_fair.c::select_task_rq_fair()
    
    While doing some testing, I pinned mplayer, only to find it
    following X around like a puppy. Looking at commit c88d591, I found
    a cpu_allowed check that went AWOL.  I plugged it back in where it
    looks like it needs to go, and now when I say "sit, stay!", mplayer
    obeys again.
    
    'c88d591 sched: Merge select_task_rq_fair() and
    sched_balance_self()' accidentally dropped the check, causing
    wake_affine() to pull pinned tasks - put it back.
    
    [ v2: use a cheaper version from Peter ]
    
    Signed-off-by: Mike Galbraith <efault@gmx.de>
    Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <new-submission>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 29b35a7..566e3bb 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -1339,7 +1339,8 @@ static int select_task_rq_fair(struct task_struct *p, int sd_flag, int wake_flag
 	int sync = wake_flags & WF_SYNC;
 
 	if (sd_flag & SD_BALANCE_WAKE) {
-		if (sched_feat(AFFINE_WAKEUPS))
+		if (sched_feat(AFFINE_WAKEUPS) &&
+		    cpumask_test_cpu(cpu, &p->cpus_allowed))
 			want_affine = 1;
 		new_cpu = prev_cpu;
 	}



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [BUG] events process running on wrong cpu
  2009-09-21  9:02 ` Peter Zijlstra
@ 2009-09-21  9:03   ` Ingo Molnar
  2009-09-21  9:08     ` Heiko Carstens
  0 siblings, 1 reply; 8+ messages in thread
From: Ingo Molnar @ 2009-09-21  9:03 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: Heiko Carstens, Andrew Morton, Oleg Nesterov, linux-kernel


* Peter Zijlstra <a.p.zijlstra@chello.nl> wrote:

> On Mon, 2009-09-21 at 10:51 +0200, Heiko Carstens wrote:
> > Hi,
> > 
> > with todays git from time to time I get this (s390 defconfig):
> 
> Yep, I messed up..
> 
> Does your kernel contain the below?

FYI, that fix will go Linuswards later today.

	Ingo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH] Always show Cpus_allowed field in /proc/<pid>/status.
  2009-09-21  8:51 [BUG] events process running on wrong cpu Heiko Carstens
  2009-09-21  9:02 ` Peter Zijlstra
@ 2009-09-21  9:06 ` Heiko Carstens
  2009-09-21  9:17   ` Heiko Carstens
  2009-09-21 12:52   ` [tip:sched/core] sched: " tip-bot for Heiko Carstens
  1 sibling, 2 replies; 8+ messages in thread
From: Heiko Carstens @ 2009-09-21  9:06 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Oleg Nesterov, Peter Zijlstra; +Cc: linux-kernel

Subject: [PATCH] Always show Cpus_allowed fields in /proc/<pid>/status.

From: Heiko Carstens <heiko.carstens@de.ibm.com>

The Cpus_allowed fields in /proc/<pid>/status is currently only shown in
case of CONFIG_CPUSETS. However their contents are also useful for the
!CONFIG_CPUSETS case.
So change the current behaviour and always show these fields.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
---
 fs/proc/array.c |   11 +++++++++++
 kernel/cpuset.c |    8 +-------
 2 files changed, 12 insertions(+), 7 deletions(-)

Index: linux-2.6/fs/proc/array.c
===================================================================
--- linux-2.6.orig/fs/proc/array.c
+++ linux-2.6/fs/proc/array.c
@@ -321,6 +321,16 @@ static inline void task_context_switch_c
 			p->nivcsw);
 }
 
+void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
+{
+	seq_printf(m, "Cpus_allowed:\t");
+	seq_cpumask(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+	seq_printf(m, "Cpus_allowed_list:\t");
+	seq_cpumask_list(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+}
+
 int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
 			struct pid *pid, struct task_struct *task)
 {
@@ -335,6 +345,7 @@ int proc_pid_status(struct seq_file *m, 
 	}
 	task_sig(m, task);
 	task_cap(m, task);
+	task_cpus_allowed(m, task);
 	cpuset_task_status_allowed(m, task);
 #if defined(CONFIG_S390)
 	task_show_regs(m, task);
Index: linux-2.6/kernel/cpuset.c
===================================================================
--- linux-2.6.orig/kernel/cpuset.c
+++ linux-2.6/kernel/cpuset.c
@@ -2499,15 +2499,9 @@ const struct file_operations proc_cpuset
 };
 #endif /* CONFIG_PROC_PID_CPUSET */
 
-/* Display task cpus_allowed, mems_allowed in /proc/<pid>/status file. */
+/* Display task mems_allowed in /proc/<pid>/status file. */
 void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task)
 {
-	seq_printf(m, "Cpus_allowed:\t");
-	seq_cpumask(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
-	seq_printf(m, "Cpus_allowed_list:\t");
-	seq_cpumask_list(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
 	seq_printf(m, "Mems_allowed:\t");
 	seq_nodemask(m, &task->mems_allowed);
 	seq_printf(m, "\n");

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [BUG] events process running on wrong cpu
  2009-09-21  9:03   ` Ingo Molnar
@ 2009-09-21  9:08     ` Heiko Carstens
  0 siblings, 0 replies; 8+ messages in thread
From: Heiko Carstens @ 2009-09-21  9:08 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Peter Zijlstra, Andrew Morton, Oleg Nesterov, linux-kernel

On Mon, Sep 21, 2009 at 11:03:24AM +0200, Ingo Molnar wrote:
> 
> * Peter Zijlstra <a.p.zijlstra@chello.nl> wrote:
> 
> > On Mon, 2009-09-21 at 10:51 +0200, Heiko Carstens wrote:
> > > Hi,
> > > 
> > > with todays git from time to time I get this (s390 defconfig):
> > 
> > Yep, I messed up..
> > 
> > Does your kernel contain the below?
> 
> FYI, that fix will go Linuswards later today.

Ok, so it's already fixed. Thanks! ;)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Always show Cpus_allowed field in /proc/<pid>/status.
  2009-09-21  9:06 ` [PATCH] Always show Cpus_allowed field in /proc/<pid>/status Heiko Carstens
@ 2009-09-21  9:17   ` Heiko Carstens
  2009-09-21 22:33     ` Paul Menage
  2009-09-21 12:52   ` [tip:sched/core] sched: " tip-bot for Heiko Carstens
  1 sibling, 1 reply; 8+ messages in thread
From: Heiko Carstens @ 2009-09-21  9:17 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Oleg Nesterov, Peter Zijlstra; +Cc: linux-kernel

On Mon, Sep 21, 2009 at 11:06:27AM +0200, Heiko Carstens wrote:

> +void task_cpus_allowed(struct seq_file *m, struct task_struct *task)

sigh. This should have been static.. updated patch below.


Subject: [PATCH] Always show Cpus_allowed fields in /proc/<pid>/status.

From: Heiko Carstens <heiko.carstens@de.ibm.com>

The Cpus_allowed fields in /proc/<pid>/status is currently only shown in
case of CONFIG_CPUSETS. However their contents are also useful for the
!CONFIG_CPUSETS case.
So change the current behaviour and always show these fields.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
---
 fs/proc/array.c |   11 +++++++++++
 kernel/cpuset.c |    8 +-------
 2 files changed, 12 insertions(+), 7 deletions(-)

Index: linux-2.6/fs/proc/array.c
===================================================================
--- linux-2.6.orig/fs/proc/array.c
+++ linux-2.6/fs/proc/array.c
@@ -321,6 +321,16 @@ static inline void task_context_switch_c
 			p->nivcsw);
 }
 
+static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
+{
+	seq_printf(m, "Cpus_allowed:\t");
+	seq_cpumask(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+	seq_printf(m, "Cpus_allowed_list:\t");
+	seq_cpumask_list(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+}
+
 int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
 			struct pid *pid, struct task_struct *task)
 {
@@ -335,6 +345,7 @@ int proc_pid_status(struct seq_file *m, 
 	}
 	task_sig(m, task);
 	task_cap(m, task);
+	task_cpus_allowed(m, task);
 	cpuset_task_status_allowed(m, task);
 #if defined(CONFIG_S390)
 	task_show_regs(m, task);
Index: linux-2.6/kernel/cpuset.c
===================================================================
--- linux-2.6.orig/kernel/cpuset.c
+++ linux-2.6/kernel/cpuset.c
@@ -2499,15 +2499,9 @@ const struct file_operations proc_cpuset
 };
 #endif /* CONFIG_PROC_PID_CPUSET */
 
-/* Display task cpus_allowed, mems_allowed in /proc/<pid>/status file. */
+/* Display task mems_allowed in /proc/<pid>/status file. */
 void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task)
 {
-	seq_printf(m, "Cpus_allowed:\t");
-	seq_cpumask(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
-	seq_printf(m, "Cpus_allowed_list:\t");
-	seq_cpumask_list(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
 	seq_printf(m, "Mems_allowed:\t");
 	seq_nodemask(m, &task->mems_allowed);
 	seq_printf(m, "\n");

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [tip:sched/core] sched: Always show Cpus_allowed field in /proc/<pid>/status
  2009-09-21  9:06 ` [PATCH] Always show Cpus_allowed field in /proc/<pid>/status Heiko Carstens
  2009-09-21  9:17   ` Heiko Carstens
@ 2009-09-21 12:52   ` tip-bot for Heiko Carstens
  1 sibling, 0 replies; 8+ messages in thread
From: tip-bot for Heiko Carstens @ 2009-09-21 12:52 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, a.p.zijlstra, akpm, heiko.carstens,
	tglx, oleg, mingo

Commit-ID:  d01d4827858cdc2e1c437c87ab65ec0a00fd40f8
Gitweb:     http://git.kernel.org/tip/d01d4827858cdc2e1c437c87ab65ec0a00fd40f8
Author:     Heiko Carstens <heiko.carstens@de.ibm.com>
AuthorDate: Mon, 21 Sep 2009 11:06:27 +0200
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Mon, 21 Sep 2009 11:37:27 +0200

sched: Always show Cpus_allowed field in /proc/<pid>/status

The Cpus_allowed fields in /proc/<pid>/status is currently only
shown in case of CONFIG_CPUSETS. However their contents are also
useful for the !CONFIG_CPUSETS case.

So change the current behaviour and always show these fields.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20090921090627.GD4649@osiris.boeblingen.de.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>


---
 fs/proc/array.c |   11 +++++++++++
 kernel/cpuset.c |    8 +-------
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index 725a650..762aea9 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -321,6 +321,16 @@ static inline void task_context_switch_counts(struct seq_file *m,
 			p->nivcsw);
 }
 
+static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
+{
+	seq_printf(m, "Cpus_allowed:\t");
+	seq_cpumask(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+	seq_printf(m, "Cpus_allowed_list:\t");
+	seq_cpumask_list(m, &task->cpus_allowed);
+	seq_printf(m, "\n");
+}
+
 int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
 			struct pid *pid, struct task_struct *task)
 {
@@ -335,6 +345,7 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
 	}
 	task_sig(m, task);
 	task_cap(m, task);
+	task_cpus_allowed(m, task);
 	cpuset_task_status_allowed(m, task);
 #if defined(CONFIG_S390)
 	task_show_regs(m, task);
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 7e75a41..b81f7f0 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -2499,15 +2499,9 @@ const struct file_operations proc_cpuset_operations = {
 };
 #endif /* CONFIG_PROC_PID_CPUSET */
 
-/* Display task cpus_allowed, mems_allowed in /proc/<pid>/status file. */
+/* Display task mems_allowed in /proc/<pid>/status file. */
 void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task)
 {
-	seq_printf(m, "Cpus_allowed:\t");
-	seq_cpumask(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
-	seq_printf(m, "Cpus_allowed_list:\t");
-	seq_cpumask_list(m, &task->cpus_allowed);
-	seq_printf(m, "\n");
 	seq_printf(m, "Mems_allowed:\t");
 	seq_nodemask(m, &task->mems_allowed);
 	seq_printf(m, "\n");

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Always show Cpus_allowed field in /proc/<pid>/status.
  2009-09-21  9:17   ` Heiko Carstens
@ 2009-09-21 22:33     ` Paul Menage
  0 siblings, 0 replies; 8+ messages in thread
From: Paul Menage @ 2009-09-21 22:33 UTC (permalink / raw)
  To: Heiko Carstens
  Cc: Ingo Molnar, Andrew Morton, Oleg Nesterov, Peter Zijlstra, linux-kernel

On Mon, Sep 21, 2009 at 2:17 AM, Heiko Carstens
<heiko.carstens@de.ibm.com> wrote:
> On Mon, Sep 21, 2009 at 11:06:27AM +0200, Heiko Carstens wrote:
>
>> +void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
>
> sigh. This should have been static.. updated patch below.
>
>
> Subject: [PATCH] Always show Cpus_allowed fields in /proc/<pid>/status.
>
> From: Heiko Carstens <heiko.carstens@de.ibm.com>
>
> The Cpus_allowed fields in /proc/<pid>/status is currently only shown in
> case of CONFIG_CPUSETS. However their contents are also useful for the
> !CONFIG_CPUSETS case.
> So change the current behaviour and always show these fields.
>
> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>

Acked-by: Paul Menage <menage@google.com>

Sounds reasonable.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-09-21 22:33 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-21  8:51 [BUG] events process running on wrong cpu Heiko Carstens
2009-09-21  9:02 ` Peter Zijlstra
2009-09-21  9:03   ` Ingo Molnar
2009-09-21  9:08     ` Heiko Carstens
2009-09-21  9:06 ` [PATCH] Always show Cpus_allowed field in /proc/<pid>/status Heiko Carstens
2009-09-21  9:17   ` Heiko Carstens
2009-09-21 22:33     ` Paul Menage
2009-09-21 12:52   ` [tip:sched/core] sched: " tip-bot for Heiko Carstens

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome