sched: do not use cpu_to_node() to find an offlined cpu's node.
authorTang Chen <>
Sat, 23 Feb 2013 00:33:33 +0000 (16:33 -0800)
committerLinus Torvalds <>
Sun, 24 Feb 2013 01:50:13 +0000 (17:50 -0800)
sched: do not use cpu_to_node() to find an offlined cpu's node.

If a cpu is offline, its nid will be set to -1, and cpu_to_node(cpu)
will return -1.  As a result, cpumask_of_node(nid) will return NULL.  In
this case, find_next_bit() in for_each_cpu will get a NULL pointer and
cause panic.

Here is a call trace:
  Call Trace:

There is a hrtimer process sleeping, whose cpu has already been
offlined.  When it is waken up, it tries to find another cpu to run, and
get a -1 nid.  As a result, cpumask_of_node(-1) returns NULL, and causes
ernel panic.

This patch fixes this problem by judging if the nid is -1.  If nid is
not -1, a cpu on the same node will be picked.  Else, a online cpu on
another node will be picked.

Signed-off-by: Tang Chen <>
Signed-off-by: Wen Congyang <>
Cc: Yasuaki Ishimatsu <>
Cc: David Rientjes <>
Cc: Jiang Liu <>
Cc: Minchan Kim <>
Cc: KOSAKI Motohiro <>
Cc: Mel Gorman <>
Cc: Thomas Gleixner <>
Cc: Ingo Molnar <>
Cc: "H. Peter Anvin" <>
Cc: Peter Zijlstra <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>