linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@suse.de>
To: Andrew Morton <akpm@digeo.com>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] deadline io scheduler
Date: Thu, 26 Sep 2002 09:34:40 +0200	[thread overview]
Message-ID: <20020926073440.GF12862@suse.de> (raw)
In-Reply-To: <3D92B369.7AFD28D4@digeo.com>

Hi,

I found a small problem where hash would not contain the right request
state. Basically we updated the hash too soon, this bug was introduced
when the merge_cleanup stuff was removed.

It's not a bit deal, it just means that the hash didn't catch as many
merges as it should. However for efficiency it needs to be correct, of
course :-)

Current deadline against 2.5.38-BK attached.

===== drivers/block/deadline-iosched.c 1.1 vs edited =====
--- 1.1/drivers/block/deadline-iosched.c	Wed Sep 25 21:16:26 2002
+++ edited/drivers/block/deadline-iosched.c	Thu Sep 26 09:24:39 2002
@@ -25,7 +25,7 @@
  * front fifo request expires.
  */
 static int read_expire = HZ / 2;	/* 500ms start timeout */
-static int fifo_batch = 64;		/* 4 seeks, or 64 contig */
+static int fifo_batch = 32;		/* 4 seeks, or 64 contig */
 static int seek_cost = 16;		/* seek is 16 times more expensive */
 
 /*
@@ -164,7 +164,7 @@
 			*req = __rq;
 			q->last_merge = &__rq->queuelist;
 			ret = ELEVATOR_BACK_MERGE;
-			goto out_ret;
+			goto out;
 		}
 	}
 
@@ -198,16 +198,18 @@
 	}
 
 out:
-	if (ret != ELEVATOR_NO_MERGE) {
-		struct deadline_rq *drq = RQ_DATA(*req);
-
-		deadline_del_rq_hash(drq);
-		deadline_add_rq_hash(dd, drq);
-	}
-out_ret:
 	return ret;
 }
 
+static void deadline_merged_request(request_queue_t *q, struct request *req)
+{
+	struct deadline_data *dd = q->elevator.elevator_data;
+	struct deadline_rq *drq = RQ_DATA(req);
+
+	deadline_del_rq_hash(drq);
+	deadline_add_rq_hash(dd, drq);
+}
+
 static void
 deadline_merge_request(request_queue_t *q, struct request *req, struct request *next)
 {
@@ -255,6 +257,15 @@
 	sector_t last_sec = dd->last_sector;
 	int batch_count = dd->fifo_batch;
 
+	/*
+	 * if dispatch is non-empty, disregard last_sector and check last one
+	 */
+	if (!list_empty(dd->dispatch)) {
+		struct request *__rq = list_entry_rq(dd->dispatch->prev);
+
+		last_sec = __rq->sector + __rq->nr_sectors;
+	}
+
 	do {
 		struct list_head *nxt = rq->queuelist.next;
 
@@ -544,6 +555,7 @@
 
 elevator_t iosched_deadline = {
 	.elevator_merge_fn = 		deadline_merge,
+	.elevator_merged_fn =		deadline_merged_request,
 	.elevator_merge_req_fn =	deadline_merge_request,
 	.elevator_next_req_fn =		deadline_next_request,
 	.elevator_add_req_fn =		deadline_add_request,
===== drivers/block/elevator.c 1.27 vs edited =====
--- 1.27/drivers/block/elevator.c	Thu Sep 26 08:23:11 2002
+++ edited/drivers/block/elevator.c	Thu Sep 26 09:20:03 2002
@@ -250,6 +250,14 @@
 	return ELEVATOR_NO_MERGE;
 }
 
+void elv_merged_request(request_queue_t *q, struct request *rq)
+{
+	elevator_t *e = &q->elevator;
+
+	if (e->elevator_merged_fn)
+		e->elevator_merged_fn(q, rq);
+}
+
 void elv_merge_requests(request_queue_t *q, struct request *rq,
 			     struct request *next)
 {
===== drivers/block/ll_rw_blk.c 1.111 vs edited =====
--- 1.111/drivers/block/ll_rw_blk.c	Thu Sep 26 08:23:11 2002
+++ edited/drivers/block/ll_rw_blk.c	Thu Sep 26 09:23:05 2002
@@ -1606,6 +1606,7 @@
 			req->biotail = bio;
 			req->nr_sectors = req->hard_nr_sectors += nr_sectors;
 			drive_stat_acct(req, nr_sectors, 0);
+			elv_merged_request(q, req);
 			attempt_back_merge(q, req);
 			goto out;
 
@@ -1629,6 +1630,7 @@
 			req->sector = req->hard_sector = sector;
 			req->nr_sectors = req->hard_nr_sectors += nr_sectors;
 			drive_stat_acct(req, nr_sectors, 0);
+			elv_merged_request(q, req);
 			attempt_front_merge(q, req);
 			goto out;
 
===== include/linux/elevator.h 1.14 vs edited =====
--- 1.14/include/linux/elevator.h	Thu Sep 26 08:23:11 2002
+++ edited/include/linux/elevator.h	Thu Sep 26 09:25:14 2002
@@ -6,6 +6,8 @@
 
 typedef void (elevator_merge_req_fn) (request_queue_t *, struct request *, struct request *);
 
+typedef void (elevator_merged_fn) (request_queue_t *, struct request *);
+
 typedef struct request *(elevator_next_req_fn) (request_queue_t *);
 
 typedef void (elevator_add_req_fn) (request_queue_t *, struct request *, struct list_head *);
@@ -19,6 +21,7 @@
 struct elevator_s
 {
 	elevator_merge_fn *elevator_merge_fn;
+	elevator_merged_fn *elevator_merged_fn;
 	elevator_merge_req_fn *elevator_merge_req_fn;
 
 	elevator_next_req_fn *elevator_next_req_fn;
@@ -42,6 +45,7 @@
 extern int elv_merge(request_queue_t *, struct request **, struct bio *);
 extern void elv_merge_requests(request_queue_t *, struct request *,
 			       struct request *);
+extern void elv_merged_request(request_queue_t *, struct request *);
 extern void elv_remove_request(request_queue_t *, struct request *);
 extern int elv_queue_empty(request_queue_t *);
 extern inline struct list_head *elv_get_sort_head(request_queue_t *, struct request *);

-- 
Jens Axboe


  parent reply	other threads:[~2002-09-26  7:29 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-09-25 17:20 [PATCH] deadline io scheduler Jens Axboe
2002-09-26  6:15 ` Andrew Morton
2002-09-26  6:27   ` David S. Miller
2002-09-26  6:44   ` Jens Axboe
2002-09-26  6:59     ` Jens Axboe
2002-09-26  7:06       ` William Lee Irwin III
2002-09-26  7:06         ` David S. Miller
2002-09-26  7:16           ` Jeff Garzik
2002-09-26  7:13             ` David S. Miller
2002-09-26  7:33               ` Jeff Garzik
2002-09-26  7:35                 ` David S. Miller
2002-09-26  8:15                   ` Michael Clark
2002-09-26  8:18                     ` William Lee Irwin III
2002-09-26 17:41                     ` Mike Anderson
2002-09-26 18:03                       ` Jeff Garzik
2002-09-26 19:21                         ` Mike Anderson
2002-09-27  5:41                           ` Andrew Vasquez
2002-09-27  5:57                             ` Jeff Garzik
2002-09-27 16:58                               ` Mike Anderson
2002-09-26 22:41                         ` Matt Porter
2002-09-26 22:35                           ` Mark Bellon
2002-09-26 20:21                     ` Thomas Tonino
2002-09-26  7:41                 ` Jeff Garzik
2002-09-26  7:23           ` William Lee Irwin III
2002-09-26  7:11         ` Jeff Garzik
2002-09-26  7:14           ` William Lee Irwin III
2002-09-26 15:54       ` Patrick Mansfield
2002-09-30  8:15         ` Jens Axboe
2002-09-30 15:39           ` Patrick Mansfield
2002-09-30 16:08             ` Jens Axboe
2002-09-26  8:28     ` Daniel Pittman
2002-09-26  8:29       ` Jens Axboe
2002-09-26 23:23         ` Daniel Pittman
2002-09-30  8:10           ` Jens Axboe
2002-09-26 15:09       ` Rik van Riel
2002-09-26  7:12   ` Andrew Morton
2002-09-26  7:17     ` Jens Axboe
2002-09-26  7:34     ` Jens Axboe [this message]
2002-09-30  7:45 ` Pavel Machek
2002-10-02  5:35   ` Jens Axboe
2002-09-27 16:01 Andrew Vasquez
2002-09-27 17:07 ` Mike Anderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020926073440.GF12862@suse.de \
    --to=axboe@suse.de \
    --cc=akpm@digeo.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).