From 3b40d2c7e322565e640a4f3fe5be961e59d024c5 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Tue, 5 Apr 2011 17:23:48 +0200 Subject: [PATCH] --- yaml --- r: 245579 b: refs/heads/master c: 3fe1698b7fe05aeb063564e71e40d09f28d8e80c h: refs/heads/master i: 245577: fad145cd253adaa05b900eb9f4f764dba25f5bfd 245575: 8110da3ecaac418b1f9d58cfb4969aff28a522b4 v: v3 --- [refs] | 2 +- trunk/kernel/sched.c | 3 +++ trunk/kernel/sched_fair.c | 19 +++++++++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 07af4ffd72bd..4da3f8cf6c87 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 74f8e4b2335de45485b8d5b31a504747f13c8070 +refs/heads/master: 3fe1698b7fe05aeb063564e71e40d09f28d8e80c diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 46f42cac4eb1..7a5eb2620785 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -312,6 +312,9 @@ struct cfs_rq { u64 exec_clock; u64 min_vruntime; +#ifndef CONFIG_64BIT + u64 min_vruntime_copy; +#endif struct rb_root tasks_timeline; struct rb_node *rb_leftmost; diff --git a/trunk/kernel/sched_fair.c b/trunk/kernel/sched_fair.c index ad4c414f456d..054cebb81f7b 100644 --- a/trunk/kernel/sched_fair.c +++ b/trunk/kernel/sched_fair.c @@ -358,6 +358,10 @@ static void update_min_vruntime(struct cfs_rq *cfs_rq) } cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime); +#ifndef CONFIG_64BIT + smp_wmb(); + cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime; +#endif } /* @@ -1376,10 +1380,21 @@ static void task_waking_fair(struct task_struct *p) { struct sched_entity *se = &p->se; struct cfs_rq *cfs_rq = cfs_rq_of(se); + u64 min_vruntime; - lockdep_assert_held(&task_rq(p)->lock); +#ifndef CONFIG_64BIT + u64 min_vruntime_copy; - se->vruntime -= cfs_rq->min_vruntime; + do { + min_vruntime_copy = cfs_rq->min_vruntime_copy; + smp_rmb(); + min_vruntime = cfs_rq->min_vruntime; + } while (min_vruntime != min_vruntime_copy); +#else + min_vruntime = cfs_rq->min_vruntime; +#endif + + se->vruntime -= min_vruntime; } #ifdef CONFIG_FAIR_GROUP_SCHED