All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails
@ 2012-04-25 11:59 he, bo
  2012-04-25 12:20 ` Peter Zijlstra
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: he, bo @ 2012-04-25 11:59 UTC (permalink / raw)
  To: akpm, mingo, a.p.zijlstra, rusty, william.douglas, linux-kernel,
	a.p.zijlstra, yanmin_zhang
  Cc: yanmin.zhang, bo.he

From: "he, bo" <bo.he@intel.com>

Under extreme memory used up situation, percpu allocation
might fails. We hit it when system go to suspend-to-ram.

EIP: [<c124411a>] build_sched_domains+0x23a/0xad0
SS:ESP 0068:de725d04
CR2: 0000000034811000
---[ end trace d6086359b670b975 ]---
Kernel panic - not syncing: Fatal exception
Pid: 3026, comm: kworker/u:3 Tainted: G      D W
3.0.8-137473-gf42fbef #1
Call Trace:
 [<c18cc4f2>] panic+0x66/0x16c
 [<c12521a1>] ? oops_exit+0x61/0x90
 [<c1205f89>] oops_end+0xb9/0xd0
 [<c1227796>] no_context+0xc6/0x1f0
 [<c1227958>] __bad_area_nosemaphore+0x98/0x140
 [<c1204ebf>] ? dump_trace+0x7f/0xf0
 [<c1227d30>] ? pgtable_bad+0x130/0x130
 [<c1227a17>] bad_area_nosemaphore+0x17/0x20
 [<c1227fa0>] do_page_fault+0x270/0x3c0
 [<c1306afa>] ? pcpu_alloc+0x12ca/0x1300
 [<c1227d30>] ? pgtable_bad+0x130/0x130
 [<c1227d30>] ? pgtable_bad+0x130/0x130
 [<c18d09d3>] error_code+0x5f/0x64
 [<c13000d8>] ? shmem_setattr+0x198/0x230
 [<c1227d30>] ? pgtable_bad+0x130/0x130
 [<c124411a>] ? build_sched_domains+0x23a/0xad0
 [<c18d01a6>] ? _raw_spin_unlock_irqrestore+0x26/0x50
 [<c1244c37>] partition_sched_domains+0x287/0x4b0
 [<c12a77be>] cpuset_update_active_cpus+0x1fe/0x210
 [<c1673017>] ? __cpufreq_remove_dev+0x167/0x360
 [<c18cf03c>] ? down_write+0x1c/0x40
 [<c123712d>] cpuset_cpu_inactive+0x1d/0x30
 [<c127dff2>] notifier_call_chain+0x52/0x90
 [<c127e04e>] __raw_notifier_call_chain+0x1e/0x30
 [<c18b37c9>] _cpu_down+0x89/0x230
 [<c12547f9>] disable_nonboot_cpus+0x79/0x100
 [<c1299fb3>] suspend_devices_and_enter+0x133/0x2e0
 [<c129a27d>] enter_state+0x11d/0x180
 [<c129a307>] pm_suspend+0x27/0x70
 [<c129b8b6>] suspend+0x96/0x1d0
 [<c1271aa3>] process_one_work+0x103/0x400
 [<c129b820>] ? power_suspend_late+0x90/0x90
 [<c12728ac>] worker_thread+0x12c/0x4b0
 [<c123748d>] ? sub_preempt_count+0x3d/0x50
 [<c18d01a6>] ? _raw_spin_unlock_irqrestore+0x26/0x50
 [<c1272780>] ? manage_workers+0x520/0x520
 [<c1276f44>] kthread+0x74/0x80
 [<c1276ed0>] ? __init_kthread_worker+0x30/0x30
 [<c18d113a>] kernel_thread_helper+0x6/0x10

Signed-off-by: he, bo <bo.he@intel.com>
Reviewed-by: Zhang, Yanmin <yanmin.zhang@intel.com>
---
 kernel/sched/core.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4603b9d..0533a68 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6405,16 +6405,26 @@ static void __sdt_free(const struct cpumask *cpu_map)
 		struct sd_data *sdd = &tl->data;
 
 		for_each_cpu(j, cpu_map) {
-			struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j);
-			if (sd && (sd->flags & SD_OVERLAP))
-				free_sched_groups(sd->groups, 0);
-			kfree(*per_cpu_ptr(sdd->sd, j));
-			kfree(*per_cpu_ptr(sdd->sg, j));
-			kfree(*per_cpu_ptr(sdd->sgp, j));
+			struct sched_domain *sd;
+
+			if (sdd->sd) {
+				sd = *per_cpu_ptr(sdd->sd, j);
+				if (sd && (sd->flags & SD_OVERLAP))
+					free_sched_groups(sd->groups, 0);
+				kfree(*per_cpu_ptr(sdd->sd, j));
+			}
+
+			if (sdd->sg)
+				kfree(*per_cpu_ptr(sdd->sg, j));
+			if (sdd->sgp)
+				kfree(*per_cpu_ptr(sdd->sgp, j));
 		}
 		free_percpu(sdd->sd);
+		sdd->sd = NULL;
 		free_percpu(sdd->sg);
+		sdd->sg = NULL;
 		free_percpu(sdd->sgp);
+		sdd->sgp = NULL;
 	}
 }
 
-- 
1.7.6




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

* Re: [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails
  2012-04-25 11:59 [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails he, bo
@ 2012-04-25 12:20 ` Peter Zijlstra
  2012-04-25 12:59 ` Srivatsa S. Bhat
  2012-04-26 11:56 ` [tip:sched/urgent] sched: Fix OOPS when build_sched_domains() " tip-bot for he, bo
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Zijlstra @ 2012-04-25 12:20 UTC (permalink / raw)
  To: he, bo
  Cc: akpm, mingo, rusty, william.douglas, linux-kernel, yanmin_zhang,
	yanmin.zhang

On Wed, 2012-04-25 at 19:59 +0800, he, bo wrote:
> From: "he, bo" <bo.he@intel.com>
> 
> Under extreme memory used up situation, percpu allocation
> might fails. We hit it when system go to suspend-to-ram.

Thanks!


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

* Re: [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails
  2012-04-25 11:59 [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails he, bo
  2012-04-25 12:20 ` Peter Zijlstra
@ 2012-04-25 12:59 ` Srivatsa S. Bhat
  2012-04-26 11:56 ` [tip:sched/urgent] sched: Fix OOPS when build_sched_domains() " tip-bot for he, bo
  2 siblings, 0 replies; 4+ messages in thread
From: Srivatsa S. Bhat @ 2012-04-25 12:59 UTC (permalink / raw)
  To: he, bo
  Cc: akpm, mingo, a.p.zijlstra, rusty, william.douglas, linux-kernel,
	yanmin_zhang, yanmin.zhang

On 04/25/2012 05:29 PM, he, bo wrote:

> From: "he, bo" <bo.he@intel.com>
> 
> Under extreme memory used up situation, percpu allocation
> might fails. We hit it when system go to suspend-to-ram.
> 
> EIP: [<c124411a>] build_sched_domains+0x23a/0xad0
> SS:ESP 0068:de725d04
> CR2: 0000000034811000
> ---[ end trace d6086359b670b975 ]---
> Kernel panic - not syncing: Fatal exception
> Pid: 3026, comm: kworker/u:3 Tainted: G      D W
> 3.0.8-137473-gf42fbef #1
> Call Trace:
>  [<c18cc4f2>] panic+0x66/0x16c
>  [<c12521a1>] ? oops_exit+0x61/0x90
>  [<c1205f89>] oops_end+0xb9/0xd0
>  [<c1227796>] no_context+0xc6/0x1f0
>  [<c1227958>] __bad_area_nosemaphore+0x98/0x140
>  [<c1204ebf>] ? dump_trace+0x7f/0xf0
>  [<c1227d30>] ? pgtable_bad+0x130/0x130
>  [<c1227a17>] bad_area_nosemaphore+0x17/0x20
>  [<c1227fa0>] do_page_fault+0x270/0x3c0
>  [<c1306afa>] ? pcpu_alloc+0x12ca/0x1300
>  [<c1227d30>] ? pgtable_bad+0x130/0x130
>  [<c1227d30>] ? pgtable_bad+0x130/0x130
>  [<c18d09d3>] error_code+0x5f/0x64
>  [<c13000d8>] ? shmem_setattr+0x198/0x230
>  [<c1227d30>] ? pgtable_bad+0x130/0x130
>  [<c124411a>] ? build_sched_domains+0x23a/0xad0
>  [<c18d01a6>] ? _raw_spin_unlock_irqrestore+0x26/0x50
>  [<c1244c37>] partition_sched_domains+0x287/0x4b0
>  [<c12a77be>] cpuset_update_active_cpus+0x1fe/0x210
>  [<c1673017>] ? __cpufreq_remove_dev+0x167/0x360
>  [<c18cf03c>] ? down_write+0x1c/0x40
>  [<c123712d>] cpuset_cpu_inactive+0x1d/0x30
>  [<c127dff2>] notifier_call_chain+0x52/0x90
>  [<c127e04e>] __raw_notifier_call_chain+0x1e/0x30
>  [<c18b37c9>] _cpu_down+0x89/0x230
>  [<c12547f9>] disable_nonboot_cpus+0x79/0x100
>  [<c1299fb3>] suspend_devices_and_enter+0x133/0x2e0
>  [<c129a27d>] enter_state+0x11d/0x180
>  [<c129a307>] pm_suspend+0x27/0x70
>  [<c129b8b6>] suspend+0x96/0x1d0
>  [<c1271aa3>] process_one_work+0x103/0x400
>  [<c129b820>] ? power_suspend_late+0x90/0x90
>  [<c12728ac>] worker_thread+0x12c/0x4b0
>  [<c123748d>] ? sub_preempt_count+0x3d/0x50
>  [<c18d01a6>] ? _raw_spin_unlock_irqrestore+0x26/0x50
>  [<c1272780>] ? manage_workers+0x520/0x520
>  [<c1276f44>] kthread+0x74/0x80
>  [<c1276ed0>] ? __init_kthread_worker+0x30/0x30
>  [<c18d113a>] kernel_thread_helper+0x6/0x10
> 
> Signed-off-by: he, bo <bo.he@intel.com>
> Reviewed-by: Zhang, Yanmin <yanmin.zhang@intel.com>


Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>


Regards,
Srivatsa S. Bhat


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

* [tip:sched/urgent] sched: Fix OOPS when build_sched_domains() percpu allocation fails
  2012-04-25 11:59 [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails he, bo
  2012-04-25 12:20 ` Peter Zijlstra
  2012-04-25 12:59 ` Srivatsa S. Bhat
@ 2012-04-26 11:56 ` tip-bot for he, bo
  2 siblings, 0 replies; 4+ messages in thread
From: tip-bot for he, bo @ 2012-04-26 11:56 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, torvalds, a.p.zijlstra, srivatsa.bhat,
	akpm, stable, bo.he, yanmin.zhang, tglx

Commit-ID:  fb2cf2c660971bea0ad86a9a5c19ad39eab61344
Gitweb:     http://git.kernel.org/tip/fb2cf2c660971bea0ad86a9a5c19ad39eab61344
Author:     he, bo <bo.he@intel.com>
AuthorDate: Wed, 25 Apr 2012 19:59:21 +0800
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 26 Apr 2012 12:54:53 +0200

sched: Fix OOPS when build_sched_domains() percpu allocation fails

Under extreme memory used up situations, percpu allocation
might fail. We hit it when system goes to suspend-to-ram,
causing a kworker panic:

 EIP: [<c124411a>] build_sched_domains+0x23a/0xad0
 Kernel panic - not syncing: Fatal exception
 Pid: 3026, comm: kworker/u:3
 3.0.8-137473-gf42fbef #1

 Call Trace:
  [<c18cc4f2>] panic+0x66/0x16c
  [...]
  [<c1244c37>] partition_sched_domains+0x287/0x4b0
  [<c12a77be>] cpuset_update_active_cpus+0x1fe/0x210
  [<c123712d>] cpuset_cpu_inactive+0x1d/0x30
  [...]

With this fix applied build_sched_domains() will return -ENOMEM and
the suspend attempt fails.

Signed-off-by: he, bo <bo.he@intel.com>
Reviewed-by: Zhang, Yanmin <yanmin.zhang@intel.com>
Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: <stable@kernel.org>
Link: http://lkml.kernel.org/r/1335355161.5892.17.camel@hebo
[ So, we fail to deallocate a CPU because we cannot allocate RAM :-/
  I don't like that kind of sad behavior but nevertheless it should
  not crash under high memory load. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/sched/core.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 4603b9d..0533a68 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6405,16 +6405,26 @@ static void __sdt_free(const struct cpumask *cpu_map)
 		struct sd_data *sdd = &tl->data;
 
 		for_each_cpu(j, cpu_map) {
-			struct sched_domain *sd = *per_cpu_ptr(sdd->sd, j);
-			if (sd && (sd->flags & SD_OVERLAP))
-				free_sched_groups(sd->groups, 0);
-			kfree(*per_cpu_ptr(sdd->sd, j));
-			kfree(*per_cpu_ptr(sdd->sg, j));
-			kfree(*per_cpu_ptr(sdd->sgp, j));
+			struct sched_domain *sd;
+
+			if (sdd->sd) {
+				sd = *per_cpu_ptr(sdd->sd, j);
+				if (sd && (sd->flags & SD_OVERLAP))
+					free_sched_groups(sd->groups, 0);
+				kfree(*per_cpu_ptr(sdd->sd, j));
+			}
+
+			if (sdd->sg)
+				kfree(*per_cpu_ptr(sdd->sg, j));
+			if (sdd->sgp)
+				kfree(*per_cpu_ptr(sdd->sgp, j));
 		}
 		free_percpu(sdd->sd);
+		sdd->sd = NULL;
 		free_percpu(sdd->sg);
+		sdd->sg = NULL;
 		free_percpu(sdd->sgp);
+		sdd->sgp = NULL;
 	}
 }
 

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

end of thread, other threads:[~2012-04-26 11:57 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-25 11:59 [PATCH] sched: fix OOPS when build_sched_domains percpu allocation fails he, bo
2012-04-25 12:20 ` Peter Zijlstra
2012-04-25 12:59 ` Srivatsa S. Bhat
2012-04-26 11:56 ` [tip:sched/urgent] sched: Fix OOPS when build_sched_domains() " tip-bot for he, bo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.