lkml.org 
[lkml]   [2018]   [Mar]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 081/219] blk-throttle: make sure expire time isn't too big
    Date
    From: Shaohua Li <shli@fb.com>

    [ Upstream commit 06cceedcca67a93ac7f7aa93bbd9980c7496d14e ]

    cgroup could be throttled to a limit but when all cgroups cross high
    limit, queue enters a higher state and so the group should be throttled
    to a higher limit. It's possible the cgroup is sleeping because of
    throttle and other cgroups don't dispatch IO any more. In this case,
    nobody can trigger current downgrade/upgrade logic. To fix this issue,
    we could either set up a timer to wakeup the cgroup if other cgroups are
    idle or make sure this cgroup doesn't sleep too long. Setting up a timer
    means we must change the timer very frequently. This patch chooses the
    latter. Making cgroup sleep time not too big wouldn't change cgroup
    bps/iops, but could make it wakeup more frequently, which isn't a big
    issue because throtl_slice * 8 is already quite big.

    Signed-off-by: Shaohua Li <shli@fb.com>
    Signed-off-by: Jens Axboe <axboe@fb.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    block/blk-throttle.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    diff --git a/block/blk-throttle.c b/block/blk-throttle.c
    index a3ea8260c94c..3a4c9a3c1427 100644
    --- a/block/blk-throttle.c
    +++ b/block/blk-throttle.c
    @@ -499,6 +499,17 @@ static void throtl_dequeue_tg(struct throtl_grp *tg)
    static void throtl_schedule_pending_timer(struct throtl_service_queue *sq,
    unsigned long expires)
    {
    + unsigned long max_expire = jiffies + 8 * throtl_slice;
    +
    + /*
    + * Since we are adjusting the throttle limit dynamically, the sleep
    + * time calculated according to previous limit might be invalid. It's
    + * possible the cgroup sleep time is very long and no other cgroups
    + * have IO running so notify the limit changes. Make sure the cgroup
    + * doesn't sleep too long to avoid the missed notification.
    + */
    + if (time_after(expires, max_expire))
    + expires = max_expire;
    mod_timer(&sq->pending_timer, expires);
    throtl_log(sq, "schedule timer. delay=%lu jiffies=%lu",
    expires - jiffies, jiffies);
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-04 00:52    [W:4.251 / U:0.440 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site