lkml.org 
[lkml]   [2016]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC V8 06/22] block, cfq: get rid of queue preemption
    Date
    From: Arianna Avanzini <avanzini.arianna@gmail.com>

    CFQ implements a request-triggered queue preemption, based on the
    priority class of the queues, and aimed at reducing latencies. There
    is no such preemption in BFQ, where a low latency is guaranteed only
    by the overall request-scheduling policy.

    Signed-off-by: Arianna Avanzini <avanzini.arianna@gmail.com>
    Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
    ---
    block/cfq-iosched.c | 99 +----------------------------------------------------
    1 file changed, 1 insertion(+), 98 deletions(-)

    diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
    index fab01e2..174dc94 100644
    --- a/block/cfq-iosched.c
    +++ b/block/cfq-iosched.c
    @@ -1069,8 +1069,7 @@ static inline void cfq_slice_expired(struct cfq_data *cfqd, bool timed_out)
    }

    /*
    - * Get next queue for service. Unless we have a queue preemption,
    - * we'll simply select the first cfqq in the service tree.
    + * Get next queue for service.
    */
    static struct cfq_queue *cfq_get_next_queue(struct cfq_data *cfqd)
    {
    @@ -1929,93 +1928,6 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
    }

    /*
    - * Check if new_cfqq should preempt the currently active queue. Return 0 for
    - * no or if we aren't sure, a 1 will cause a preempt.
    - */
    -static bool
    -cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
    - struct request *rq)
    -{
    - struct cfq_queue *cfqq;
    -
    - cfqq = cfqd->active_queue;
    - if (!cfqq)
    - return false;
    -
    - if (cfq_class_idle(new_cfqq))
    - return false;
    -
    - if (cfq_class_idle(cfqq))
    - return true;
    -
    - /*
    - * Don't allow a non-RT request to preempt an ongoing RT cfqq timeslice.
    - */
    - if (cfq_class_rt(cfqq) && !cfq_class_rt(new_cfqq))
    - return false;
    -
    - /*
    - * if the new request is sync, but the currently running queue is
    - * not, let the sync request have priority.
    - */
    - if (rq_is_sync(rq) && !cfq_cfqq_sync(cfqq))
    - return true;
    -
    - if (cfq_slice_used(cfqq))
    - return true;
    -
    - /*
    - * Allow an RT request to pre-empt an ongoing non-RT cfqq timeslice.
    - */
    - if (cfq_class_rt(new_cfqq) && !cfq_class_rt(cfqq))
    - return true;
    -
    - WARN_ON_ONCE(cfqq->ioprio_class != new_cfqq->ioprio_class);
    - /* Allow preemption only if we are idling on sync-noidle tree */
    - if (cfqd->serving_wl_type == SYNC_NOIDLE_WORKLOAD &&
    - cfqq_type(new_cfqq) == SYNC_NOIDLE_WORKLOAD &&
    - 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.
    - */
    - if ((rq->cmd_flags & REQ_PRIO) && !cfqq->prio_pending)
    - return true;
    -
    - /* An idle queue should not be idle now for some reason */
    - if (RB_EMPTY_ROOT(&cfqq->sort_list) && !cfq_should_idle(cfqd, cfqq))
    - return true;
    -
    - if (!cfqd->active_cic || !cfq_cfqq_wait_request(cfqq))
    - return false;
    -
    - return false;
    -}
    -
    -/*
    - * cfqq preempts the active queue. if we allowed preempt with no slice left,
    - * let it have half of its nominal slice.
    - */
    -static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
    -{
    - cfq_log_cfqq(cfqd, cfqq, "preempt");
    - cfq_slice_expired(cfqd, 1);
    -
    - /*
    - * Put the new queue at the front of the of the current list,
    - * so we know that it will be selected next.
    - */
    - BUG_ON(!cfq_cfqq_on_rr(cfqq));
    -
    - cfq_service_tree_add(cfqd, cfqq, 1);
    -
    - cfqq->slice_end = 0;
    - cfq_mark_cfqq_slice_new(cfqq);
    -}
    -
    -/*
    * Called when a new fs request (rq) is added (to cfqq). Check if there's
    * something we should do about it
    */
    @@ -2055,15 +1967,6 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
    } else
    cfq_mark_cfqq_must_dispatch(cfqq);
    }
    - } else if (cfq_should_preempt(cfqd, cfqq, rq)) {
    - /*
    - * not the active queue - expire current slice if it is
    - * idle and has expired it's mean thinktime or this new queue
    - * has some old slice time left and is of higher priority or
    - * this new queue is RT and the current one is BE
    - */
    - cfq_preempt_queue(cfqd, cfqq);
    - __blk_run_queue(cfqd->queue);
    }
    }

    --
    1.9.1
    \
     
     \ /
      Last update: 2016-07-27 19:01    [W:2.584 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site