• Shaohua Li's avatar
    blk-throttle: add upgrade logic for LIMIT_LOW state · c79892c5
    Shaohua Li authored
    When queue is in LIMIT_LOW state and all cgroups with low limit cross
    the bps/iops limitation, we will upgrade queue's state to
    LIMIT_MAX. To determine if a cgroup exceeds its limitation, we check if
    the cgroup has pending request. Since cgroup is throttled according to
    the limit, pending request means the cgroup reaches the limit.
    
    If a cgroup has limit set for both read and write, we consider the
    combination of them for upgrade. The reason is read IO and write IO can
    interfere with each other. If we do the upgrade based in one direction
    IO, the other direction IO could be severly harmed.
    
    For a cgroup hierarchy, there are two cases. Children has lower low
    limit than parent. Parent's low limit is meaningless. If children's
    bps/iops cross low limit, we can upgrade queue state. The other case is
    children has higher low limit than parent. Children's low limit is
    meaningless. As long as parent's bps/iops (which is a sum of childrens
    bps/iops) cross low limit, we can upgrade queue state.
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    c79892c5
blk-throttle.c 48.9 KB