All of lore.kernel.org
 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
  -- strict thread matches above, loose matches on Subject: below --
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.