• Kemeng Shi's avatar
    block, bfq: initialize bfqq->decrease_time_jif correctly · 1c970450
    Kemeng Shi authored
    Inject limit is updated or reset when time_is_before_eq_jiffies(
    decrease_time_jif + several msecs) or think-time state changes.
    decrease_time_jif is initialized to 0 and will be set to current jiffies
    when inject limit is updated or reset. If the jiffies is slightly greater
    than LONG_MAX, time_is_after_eq_jiffies(0) will keep for a long time, so as
    time_is_after_eq_jiffies(decrease_time_jif + several msecs). If the
    think-time state never chages, then the injection will not work as expected
    for long time.
    
    To be more specific:
    Function bfq_update_inject_limit maybe triggered when jiffies pasts
    decrease_time_jif + msecs_to_jiffies(10) in bfq_add_request by setting
    bfqd->wait_dispatch to true.
    Function bfq_reset_inject_limit are called in two conditions:
    1. jiffies pasts bfqq->decrease_time_jif + msecs_to_jiffies(1000) in
    function bfq_add_request.
    2. jiffies pasts bfqq->decrease_time_jif + msecs_to_jiffies(100) or
    bfq think-time state change from short to long.
    
    Fix this by initializing bfqq->decrease_time_jif to current jiffies
    to trigger service injection soon when service injection conditions
    are met.
    Signed-off-by: default avatarKemeng Shi <shikemeng@huaweicloud.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20230116095153.3810101-4-shikemeng@huaweicloud.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1c970450
bfq-iosched.c 264 KB