lkml.org 
[lkml]   [2010]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] cfq-iosched: fix tree-wide handling of rq_noidle
    Date
    Patch: 8e55063 cfq-iosched: fix corner cases in idling logic
    introduced the possibility of iding even on no-idle requests
    in the no_idle tree, if any previous request in the current slice
    could idle. The implementation had a problem, though:
    - if a queue sent several possibly idling requests and a noidle
    request as last one in the same time slice, the tree was still
    marked as idle.
    This patch fixes this misbehaviour, by using a 31-bucket hash to
    keep idling/non-idling status for queues in the noidle tree.

    Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com>
    ---
    block/cfq-iosched.c | 11 ++++++++---
    1 files changed, 8 insertions(+), 3 deletions(-)

    diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
    index d1ad066..5ef9a5d 100644
    --- a/block/cfq-iosched.c
    +++ b/block/cfq-iosched.c
    @@ -214,7 +214,7 @@ struct cfq_data {
    enum wl_type_t serving_type;
    unsigned long workload_expires;
    struct cfq_group *serving_group;
    - bool noidle_tree_requires_idle;
    + u32 noidle_tree_requires_idle;

    /*
    * Each priority tree is sorted by next_request position. These
    @@ -2066,7 +2066,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
    slice = max_t(unsigned, slice, CFQ_MIN_TT);
    cfq_log(cfqd, "workload slice:%d", slice);
    cfqd->workload_expires = jiffies + slice;
    - cfqd->noidle_tree_requires_idle = false;
    + cfqd->noidle_tree_requires_idle = 0U;
    }

    static struct cfq_group *cfq_get_next_cfqg(struct cfq_data *cfqd)
    @@ -3349,7 +3349,12 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
    cfq_slice_expired(cfqd, 1);
    else if (sync && cfqq_empty &&
    !cfq_close_cooperator(cfqd, cfqq)) {
    - cfqd->noidle_tree_requires_idle |= !rq_noidle(rq);
    + u32 bitmask = 1U << (((int)cfqq) % 31);
    + if (rq_noidle(rq))
    + cfqd->noidle_tree_requires_idle &= ~bitmask;
    + else
    + cfqd->noidle_tree_requires_idle |= bitmask;
    +
    /*
    * Idling is enabled for SYNC_WORKLOAD.
    * SYNC_NOIDLE_WORKLOAD idles at the end of the tree
    --
    1.6.4.4


    \
     
     \ /
      Last update: 2010-07-07 17:25    [W:0.020 / U:93.912 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site