lkml.org 
[lkml]   [2009]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/21] blkio: Provide some isolation between groups
    Date
    o Do not allow following three operations across groups for isolation.
    - selection of co-operating queues
    - preemtpions across groups
    - request merging across groups.

    o Async queues are currently global and not per group. Allow preemption of
    an async queue if a sync queue in other group gets backlogged.

    Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
    ---
    block/cfq-iosched.c | 30 ++++++++++++++++++++----------
    1 files changed, 20 insertions(+), 10 deletions(-)

    diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
    index 8abc25b..ed18746 100644
    --- a/block/cfq-iosched.c
    +++ b/block/cfq-iosched.c
    @@ -1463,6 +1463,9 @@ static int cfq_allow_merge(struct request_queue *q, struct request *rq,
    struct cfq_io_context *cic;
    struct cfq_queue *cfqq;

    + /* Deny merge if bio and rq don't belong to same cfq group */
    + if ((RQ_CFQQ(rq))->cfqg != cfq_get_cfqg(cfqd, 0))
    + return false;
    /*
    * Disallow merge of a sync bio into an async request.
    */
    @@ -1700,6 +1703,10 @@ static struct cfq_queue *cfq_close_cooperator(struct cfq_data *cfqd,
    if (!cfqq)
    return NULL;

    + /* If new queue belongs to different cfq_group, don't choose it */
    + if (cur_cfqq->cfqg != cfqq->cfqg)
    + return NULL;
    +
    /*
    * It only makes sense to merge sync queues.
    */
    @@ -2952,22 +2959,12 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
    if (!cfqq)
    return false;

    - if (cfq_slice_used(cfqq))
    - return true;
    -
    if (cfq_class_idle(new_cfqq))
    return false;

    if (cfq_class_idle(cfqq))
    return true;

    - /* Allow preemption only if we are idling on sync-noidle tree */
    - if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD &&
    - cfqq_type(new_cfqq) == SYNC_NOIDLE_WORKLOAD &&
    - new_cfqq->service_tree->count == 2 &&
    - RB_EMPTY_ROOT(&cfqq->sort_list))
    - return true;
    -
    /*
    * if the new request is sync, but the currently running queue is
    * not, let the sync request have priority.
    @@ -2975,6 +2972,19 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
    if (rq_is_sync(rq) && !cfq_cfqq_sync(cfqq))
    return true;

    + if (new_cfqq->cfqg != cfqq->cfqg)
    + return false;
    +
    + if (cfq_slice_used(cfqq))
    + return true;
    +
    + /* Allow preemption only if we are idling on sync-noidle tree */
    + if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD &&
    + cfqq_type(new_cfqq) == SYNC_NOIDLE_WORKLOAD &&
    + new_cfqq->service_tree->count == 2 &&
    + RB_EMPTY_ROOT(&cfqq->sort_list))
    + return true;
    +
    /*
    * So both queues are sync. Let the new request get disk time if
    * it's a metadata request and the current queue is doing regular IO.
    --
    1.6.2.5


    \
     
     \ /
      Last update: 2009-11-30 04:07    [W:3.291 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site