mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
sched: Deal with non-atomic min_vruntime reads on 32bits
In order to avoid reading partial updated min_vruntime values on 32bit implement a seqcount like solution. Reviewed-by: Frank Rowand <frank.rowand@am.sony.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Galbraith <efault@gmx.de> Cc: Nick Piggin <npiggin@kernel.dk> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Link: http://lkml.kernel.org/r/20110405152729.111378493@chello.nl Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
74f8e4b233
commit
3fe1698b7f
2 changed files with 20 additions and 2 deletions
|
@ -312,6 +312,9 @@ struct cfs_rq {
|
||||||
|
|
||||||
u64 exec_clock;
|
u64 exec_clock;
|
||||||
u64 min_vruntime;
|
u64 min_vruntime;
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
u64 min_vruntime_copy;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct rb_root tasks_timeline;
|
struct rb_root tasks_timeline;
|
||||||
struct rb_node *rb_leftmost;
|
struct rb_node *rb_leftmost;
|
||||||
|
|
|
@ -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);
|
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 sched_entity *se = &p->se;
|
||||||
struct cfs_rq *cfs_rq = cfs_rq_of(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
|
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
|
Loading…
Reference in a new issue