lkml.org 
[lkml]   [2019]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 093/103] blok, bfq: do not plug I/O if all queues are weight-raised
    Date
    From: Paolo Valente <paolo.valente@linaro.org>

    [ Upstream commit c8765de0adfcaaf4ffb2d951e07444f00ffa9453 ]

    To reduce latency for interactive and soft real-time applications, bfq
    privileges the bfq_queues containing the I/O of these
    applications. These privileged queues, referred-to as weight-raised
    queues, get a much higher share of the device throughput
    w.r.t. non-privileged queues. To preserve this higher share, the I/O
    of any non-weight-raised queue must be plugged whenever a sync
    weight-raised queue, while being served, remains temporarily empty. To
    attain this goal, bfq simply plugs any I/O (from any queue), if a sync
    weight-raised queue remains empty while in service.

    Unfortunately, this plugging typically lowers throughput with random
    I/O, on devices with internal queueing (because it reduces the filling
    level of the internal queues of the device).

    This commit addresses this issue by restricting the cases where
    plugging is performed: if a sync weight-raised queue remains empty
    while in service, then I/O plugging is performed only if some of the
    active bfq_queues are *not* weight-raised (which is actually the only
    circumstance where plugging is needed to preserve the higher share of
    the throughput of weight-raised queues). This restriction proved able
    to boost throughput in really many use cases needing only maximum
    throughput.

    Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/bfq-iosched.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
    index e65b0da1007b4..93863c6173e66 100644
    --- a/block/bfq-iosched.c
    +++ b/block/bfq-iosched.c
    @@ -3314,7 +3314,12 @@ static bool bfq_bfqq_may_idle(struct bfq_queue *bfqq)
    * whether bfqq is being weight-raised, because
    * bfq_symmetric_scenario() does not take into account also
    * weight-raised queues (see comments on
    - * bfq_weights_tree_add()).
    + * bfq_weights_tree_add()). In particular, if bfqq is being
    + * weight-raised, it is important to idle only if there are
    + * other, non-weight-raised queues that may steal throughput
    + * to bfqq. Actually, we should be even more precise, and
    + * differentiate between interactive weight raising and
    + * soft real-time weight raising.
    *
    * As a side note, it is worth considering that the above
    * device-idling countermeasures may however fail in the
    @@ -3326,7 +3331,8 @@ static bool bfq_bfqq_may_idle(struct bfq_queue *bfqq)
    * to let requests be served in the desired order until all
    * the requests already queued in the device have been served.
    */
    - asymmetric_scenario = bfqq->wr_coeff > 1 ||
    + asymmetric_scenario = (bfqq->wr_coeff > 1 &&
    + bfqd->wr_busy_queues < bfqd->busy_queues) ||
    !bfq_symmetric_scenario(bfqd);

    /*
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-11-08 12:57    [W:4.097 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site