summaryrefslogtreecommitdiffstats
path: root/kernel/sched/fair.c
diff options
context:
space:
mode:
authorMichael wang <wangyun@linux.vnet.ibm.com>2014-02-19 22:14:53 -0500
committerThomas Gleixner <tglx@linutronix.de>2014-02-21 15:43:17 -0500
commiteb7a59b2c888c2518ba2c9d0020343ca71aa9dee (patch)
treef9957db29515004d0dae2af3f48af6607f88af73 /kernel/sched/fair.c
parentd97a860c4f3de98ba5040a22f305b7159fe17cff (diff)
sched/fair: Reset se-depth when task switched to FAIR
Sasha reported: [ 522.645288] BUG: unable to handle kernel NULL pointer dereference at ... [ 522.646271] IP: [<ffffffff81186c6f>] check_preempt_wakeup+0x11f/0x210 ... [ 522.650021] Call Trace: [ 522.650021] <IRQ> [ 522.650021] [<ffffffff8117361d>] check_preempt_curr+0x3d/0xb0 [ 522.650021] [<ffffffff81175d88>] ttwu_do_wakeup+0x18/0x130 ... which was caused by the se-depth changed during the time when task is not FAIR, and we will use the wrong depth value after it switched back to FAIR. This patch reset the depth at the time when task switched to FAIR, make sure that we always have the correct value when task is FAIR. Cc: Ingo Molnar <mingo@kernel.org> Reported-by: Sasha Levin <sasha.levin@oracle.com> Tested-by: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Michael Wang <wangyun@linux.vnet.ibm.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/5305732D.70001@linux.vnet.ibm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/sched/fair.c')
-rw-r--r--kernel/sched/fair.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 235cfa7ad8fc..280da893cd0f 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -7317,7 +7317,15 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p)
7317 */ 7317 */
7318static void switched_to_fair(struct rq *rq, struct task_struct *p) 7318static void switched_to_fair(struct rq *rq, struct task_struct *p)
7319{ 7319{
7320 if (!p->se.on_rq) 7320 struct sched_entity *se = &p->se;
7321#ifdef CONFIG_FAIR_GROUP_SCHED
7322 /*
7323 * Since the real-depth could have been changed (only FAIR
7324 * class maintain depth value), reset depth properly.
7325 */
7326 se->depth = se->parent ? se->parent->depth + 1 : 0;
7327#endif
7328 if (!se->on_rq)
7321 return; 7329 return;
7322 7330
7323 /* 7331 /*