• Ben Segall's avatar
    sched: Fix potential near-infinite distribute_cfs_runtime() loop · c06f04c7
    Ben Segall authored
    distribute_cfs_runtime() intentionally only hands out enough runtime to
    bring each cfs_rq to 1 ns of runtime, expecting the cfs_rqs to then take
    the runtime they need only once they actually get to run. However, if
    they get to run sufficiently quickly, the period timer is still in
    distribute_cfs_runtime() and no runtime is available, causing them to
    throttle. Then distribute has to handle them again, and this can go on
    until distribute has handed out all of the runtime 1ns at a time, which
    takes far too long.
    
    Instead allow access to the same runtime that distribute is handing out,
    accepting that corner cases with very low quota may be able to spend the
    entire cfs_b->runtime during distribute_cfs_runtime, meaning that the
    runtime directly handed out by distribute_cfs_runtime was over quota. In
    addition, if a cfs_rq does manage to throttle like this, make sure the
    existing distribute_cfs_runtime no longer loops over it again.
    Signed-off-by: default avatarBen Segall <bsegall@google.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20140620222120.13814.21652.stgit@sword-of-the-dawn.mtv.corp.google.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    c06f04c7
fair.c 202 KB