]> git.baikalelectronics.ru Git - kernel.git/commit
sched/fair: Fix unlocked reads of some cfs_b->quota/period
authorBen Segall <bsegall@google.com>
Mon, 19 May 2014 22:49:45 +0000 (15:49 -0700)
committerIngo Molnar <mingo@kernel.org>
Thu, 5 Jun 2014 09:52:00 +0000 (11:52 +0200)
commit83e957b649910dd02278902e33d22ecae334f33e
tree3c4f8405eacae93ef43707c2d335f8a12212eaeb
parentbc962953a46bc766d97b6cef8c66164f9f3cc266
sched/fair: Fix unlocked reads of some cfs_b->quota/period

sched_cfs_period_timer() reads cfs_b->period without locks before calling
do_sched_cfs_period_timer(), and similarly unthrottle_offline_cfs_rqs()
would read cfs_b->period without the right lock. Thus a simultaneous
change of bandwidth could cause corruption on any platform where ktime_t
or u64 writes/reads are not atomic.

Extend cfs_b->lock from do_sched_cfs_period_timer() to include the read of
cfs_b->period to solve that issue; unthrottle_offline_cfs_rqs() can just
use 1 rather than the exact quota, much like distribute_cfs_runtime()
does.

There is also an unlocked read of cfs_b->runtime_expires, but a race
there would only delay runtime expiry by a tick. Still, the comparison
should just be != anyway, which clarifies even that problem.

Signed-off-by: Ben Segall <bsegall@google.com>
Tested-by: Roman Gushchin <klamm@yandex-team.ru>
[peterz: Fix compile warn]
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20140519224945.20303.93530.stgit@sword-of-the-dawn.mtv.corp.google.com
Cc: pjt@google.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
kernel/sched/fair.c