Commit 1181c1f9 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] noop-iosched: kill O(N) merge scan

Profiling hit rates on merging shows that the last merge hint works
extremely well for most work loads.  So lets kill the linear merge scan in
noop-iosched, so it provides O(1) run time for any operation.

Testing credits go to Ken Chen from Intel.
Signed-off-by: default avatarJens Axboe <axboe@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 41f11a4f
...@@ -13,34 +13,13 @@ ...@@ -13,34 +13,13 @@
static int elevator_noop_merge(request_queue_t *q, struct request **req, static int elevator_noop_merge(request_queue_t *q, struct request **req,
struct bio *bio) struct bio *bio)
{ {
struct list_head *entry = &q->queue_head;
struct request *__rq;
int ret; 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; *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 ret;
}
}
return ELEVATOR_NO_MERGE;
} }
static void elevator_noop_merge_requests(request_queue_t *q, struct request *req, static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment