• Tejun Heo's avatar
    iocost: fix infinite loop bug in adjust_inuse_and_calc_cost() · aa67db24
    Tejun Heo authored
    adjust_inuse_and_calc_cost() is responsible for reducing the amount of
    donated weights dynamically in period as the budget runs low. Because we
    don't want to do full donation calculation in period, we keep latching up
    inuse by INUSE_ADJ_STEP_PCT of the active weight of the cgroup until the
    resulting hweight_inuse is satisfactory.
    
    Unfortunately, the adj_step calculation was reading the active weight before
    acquiring ioc->lock. Because the current thread could have lost race to
    activate the iocg to another thread before entering this function, it may
    read the active weight as zero before acquiring ioc->lock. When this
    happens, the adj_step is calculated as zero and the incremental adjustment
    loop becomes an infinite one.
    
    Fix it by fetching the active weight after acquiring ioc->lock.
    
    Fixes: b0853ab4 ("blk-iocost: revamp in-period donation snapbacks")
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    aa67db24
blk-iocost.c 93.4 KB