mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [tip:sched/urgent] sched/numa: Fix NULL pointer dereference in task_numa_migrate()
@ 2013-11-13 17:25 tip-bot for Rik van Riel
  2013-11-13 17:48 ` Peter Zijlstra
  0 siblings, 1 reply; 2+ messages in thread
From: tip-bot for Rik van Riel @ 2013-11-13 17:25 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, peterz, riel, mgorman, tglx, prarit

Commit-ID:  46a73e8a1c1720f7713b5e2df68e9dd272015b5d
Gitweb:     http://git.kernel.org/tip/46a73e8a1c1720f7713b5e2df68e9dd272015b5d
Author:     Rik van Riel <riel@redhat.com>
AuthorDate: Mon, 11 Nov 2013 19:29:25 -0500
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 13 Nov 2013 13:33:51 +0100

sched/numa: Fix NULL pointer dereference in task_numa_migrate()

The cpusets code can split up the scheduler's domain tree into
smaller domains.  Some of those smaller domains may not cross
NUMA nodes at all, leading to a NULL pointer dereference on the
per-cpu sd_numa pointer.

Tasks cannot be migrated out of their domain, so the patch
also sets p->numa_preferred_nid to whereever they are, to
prevent the migration from being retried over and over again.

Reported-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Mel Gorman <mgorman@suse.de>
Link: http://lkml.kernel.org/n/tip-oosqomw0Jput0Jkvoowhrqtu@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/sched/fair.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index df77c60..c11e36f 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -1201,9 +1201,21 @@ static int task_numa_migrate(struct task_struct *p)
 	 */
 	rcu_read_lock();
 	sd = rcu_dereference(per_cpu(sd_numa, env.src_cpu));
-	env.imbalance_pct = 100 + (sd->imbalance_pct - 100) / 2;
+	if (sd)
+		env.imbalance_pct = 100 + (sd->imbalance_pct - 100) / 2;
 	rcu_read_unlock();
 
+	/*
+	 * Cpusets can break the scheduler domain tree into smaller
+	 * balance domains, some of which do not cross NUMA boundaries.
+	 * Tasks that are "trapped" in such domains cannot be migrated
+	 * elsewhere, so there is no point in (re)trying.
+	 */
+	if (unlikely(!sd)) {
+		p->numa_preferred_nid = cpu_to_node(task_cpu(p));
+		return -EINVAL;
+	}
+
 	taskweight = task_weight(p, env.src_nid);
 	groupweight = group_weight(p, env.src_nid);
 	update_numa_stats(&env.src_stats, env.src_nid);

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

* Re: [tip:sched/urgent] sched/numa: Fix NULL pointer dereference in task_numa_migrate()
  2013-11-13 17:25 [tip:sched/urgent] sched/numa: Fix NULL pointer dereference in task_numa_migrate() tip-bot for Rik van Riel
@ 2013-11-13 17:48 ` Peter Zijlstra
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Zijlstra @ 2013-11-13 17:48 UTC (permalink / raw)
  To: mingo, hpa, linux-kernel, riel, mgorman, tglx, prarit; +Cc: linux-tip-commits

On Wed, Nov 13, 2013 at 09:25:22AM -0800, tip-bot for Rik van Riel wrote:
> +	if (unlikely(!sd)) {
> +		p->numa_preferred_nid = cpu_to_node(task_cpu(p));

't is only now I notice, but I added a convenience helper for this:
task_node(p) :-)

No biggie, I'll try and remember when next something near there needs
changing.

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

end of thread, other threads:[~2013-11-13 17:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-13 17:25 [tip:sched/urgent] sched/numa: Fix NULL pointer dereference in task_numa_migrate() tip-bot for Rik van Riel
2013-11-13 17:48 ` Peter Zijlstra

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

all inboxes | Powered by JetHome®