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

[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
Loading
Loading
Loading
Loading
+3 −24
Original line number Diff line number Diff line
@@ -13,35 +13,14 @@
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;
}

static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
					 struct request *next)