lkml.org 
[lkml]   [2005]   [Mar]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [patch] new fifo I/O elevator that really does nothing at all
    On Mon, Mar 28 2005, Chen, Kenneth W wrote:
    > The noop elevator is still too fat for db transaction processing
    > workload. Since the db application already merged all blocks before
    > sending it down, the I/O presented to the elevator are actually not
    > merge-able anymore. Since I/O are also random, we don't want to sort
    > them either. However the noop elevator is still doing a linear search
    > on the entire list of requests in the queue. A noop elevator after
    > all isn't really noop.
    >
    > We are proposing a true no-op elevator algorithm, no merge, no
    > nothing. Just do first in and first out list management for the I/O
    > request. The best name I can come up with is "FIFO". I also piggy
    > backed the code onto noop-iosched.c. I can easily pull those code
    > into a separate file if people object. Though, I hope Jens is OK with
    > it.

    It's not quite ok, because you don't honor the insertion point in
    fifo_add_request. The only 'fat' part of the noop io scheduler is the
    merge stuff, the original plan was to move that to a hash table lookup
    instead like the other io schedulers do. So I would suggest just
    changing noop to hash the request on the end point for back merges and
    forget about front merges, since they are rare anyways. Hmm actually,
    the last merge hint should catch most of the merges at almost zero cost.
    How about this patch?

    Signed-off-by: Jens Axboe <axboe@suse.de>

    ===== drivers/block/noop-iosched.c 1.7 vs edited =====
    --- 1.7/drivers/block/noop-iosched.c 2005-01-14 17:35:40 +01:00
    +++ edited/drivers/block/noop-iosched.c 2005-03-29 10:05:21 +02:00
    @@ -13,34 +13,13 @@
    static int elevator_noop_merge(request_queue_t *q, struct request **req,
    struct bio *bio)
    {
    - struct list_head *entry = &q->queue_head;
    - struct request *__rq;
    int ret;

    - if ((ret = elv_try_last_merge(q, bio))) {
    + ret = elv_try_last_merge(q, bio);
    + if (ret != ELEVATOR_NO_MERGE)
    *req = q->last_merge;
    - return ret;
    - }

    - while ((entry = entry->prev) != &q->queue_head) {
    - __rq = list_entry_rq(entry);
    -
    - if (__rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER))
    - break;
    - else if (__rq->flags & REQ_STARTED)
    - break;
    -
    - if (!blk_fs_request(__rq))
    - continue;
    -
    - if ((ret = elv_try_merge(__rq, bio))) {
    - *req = __rq;
    - q->last_merge = __rq;
    - return ret;
    - }
    - }
    -
    - return ELEVATOR_NO_MERGE;
    + return ret;
    }

    static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
    --
    Jens Axboe

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-04-06 13:31    [W:2.996 / U:0.476 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site