<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Jens Axboe &lt;axboe@suse.de&gt;

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: Jens Axboe &lt;axboe@suse.de&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 25-akpm/drivers/block/noop-iosched.c |   27 +++------------------------
 1 files changed, 3 insertions(+), 24 deletions(-)

diff -puN drivers/block/noop-iosched.c~noop-iosched-kill-on-merge-scan drivers/block/noop-iosched.c
--- 25/drivers/block/noop-iosched.c~noop-iosched-kill-on-merge-scan	2005-04-13 00:56:45.975952040 -0700
+++ 25-akpm/drivers/block/noop-iosched.c	2005-04-13 00:56:45.978951584 -0700
@@ -13,34 +13,13 @@
 static int elevator_noop_merge(request_queue_t *q, struct request **req,
 			       struct bio *bio)
 {
-	struct list_head *entry = &amp;q-&gt;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-&gt;last_merge;
-		return ret;
-	}
 
-	while ((entry = entry-&gt;prev) != &amp;q-&gt;queue_head) {
-		__rq = list_entry_rq(entry);
-
-		if (__rq-&gt;flags &amp; (REQ_SOFTBARRIER | REQ_HARDBARRIER))
-			break;
-		else if (__rq-&gt;flags &amp; REQ_STARTED)
-			break;
-
-		if (!blk_fs_request(__rq))
-			continue;
-
-		if ((ret = elv_try_merge(__rq, bio))) {
-			*req = __rq;
-			q-&gt;last_merge = __rq;
-			return ret;
-		}
-	}
-
-	return ELEVATOR_NO_MERGE;
+	return ret;
 }
 
 static void elevator_noop_merge_requests(request_queue_t *q, struct request *req,
_
</pre></body></html>