From: Jens Axboe <axboe@suse.de>
To: "Chen, Kenneth W" <kenneth.w.chen@intel.com>
Cc: "'Andrew Morton'" <akpm@osdl.org>, linux-kernel@vger.kernel.org
Subject: Re: Cache queue_congestion_on/off_threshold
Date: Mon, 10 May 2004 16:30:24 +0200 [thread overview]
Message-ID: <20040510143024.GF14403@suse.de> (raw)
In-Reply-To: <200405072200.i47M0AF00868@unix-os.sc.intel.com>
On Fri, May 07 2004, Chen, Kenneth W wrote:
> >>>> Jens Axboe wrote on Friday, May 07, 2004 2:39 AM
> > On Thu, May 06 2004, Chen, Kenneth W wrote:
> > > (3) can we allocate request structure up front in __make_request?
> > > For I/O that cannot be merged, the elevator code executes twice
> > > in __make_request.
> > >
> >
> > Actually, with the good working batching we might get away with killing
> > freereq completely. Have you tested that (if not, could you?)
>
> Sorry, I'm clueless on "good working batching". If you could please give
> me some pointers, I will definitely test it.
Something like this.
--- linux-2.6.6/drivers/block/ll_rw_blk.c~ 2004-05-10 16:23:45.684726955 +0200
+++ linux-2.6.6/drivers/block/ll_rw_blk.c 2004-05-10 16:29:04.333792268 +0200
@@ -2138,8 +2138,8 @@
static int __make_request(request_queue_t *q, struct bio *bio)
{
- struct request *req, *freereq = NULL;
int el_ret, rw, nr_sectors, cur_nr_sectors, barrier, ra;
+ struct request *req;
sector_t sector;
sector = bio->bi_sector;
@@ -2161,15 +2161,15 @@
ra = bio->bi_rw & (1 << BIO_RW_AHEAD);
-again:
+ if (barrier)
+ goto get_rq_nolock;
+
spin_lock_irq(q->queue_lock);
if (elv_queue_empty(q)) {
blk_plug_device(q);
goto get_rq;
}
- if (barrier)
- goto get_rq;
el_ret = elv_merge(q, &req, bio);
switch (el_ret) {
@@ -2230,21 +2230,17 @@
* a free slot.
*/
get_rq:
- if (freereq) {
- req = freereq;
- freereq = NULL;
- } else {
- spin_unlock_irq(q->queue_lock);
- if ((freereq = get_request(q, rw, GFP_ATOMIC)) == NULL) {
- /*
- * READA bit set
- */
- if (ra)
- goto end_io;
+ spin_unlock_irq(q->queue_lock);
+get_rq_nolock:
+ req = get_request(q, rw, GFP_ATOMIC);
+ if (!req) {
+ /*
+ * READA bit set
+ */
+ if (ra)
+ goto end_io;
- freereq = get_request_wait(q, rw);
- }
- goto again;
+ req = get_request_wait(q, rw);
}
req->flags |= REQ_CMD;
@@ -2276,10 +2272,9 @@
req->rq_disk = bio->bi_bdev->bd_disk;
req->start_time = jiffies;
+ spin_lock_irq(q->queue_lock);
add_request(q, req);
out:
- if (freereq)
- __blk_put_request(q, freereq);
if (blk_queue_plugged(q)) {
int nrq = q->rq.count[READ] + q->rq.count[WRITE] - q->in_flight;
--
Jens Axboe
next prev parent reply other threads:[~2004-05-10 14:30 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-05 22:12 Cache queue_congestion_on/off_threshold Chen, Kenneth W
2004-05-06 6:20 ` Jens Axboe
2004-05-06 6:34 ` Andrew Morton
2004-05-06 6:43 ` Jens Axboe
2004-05-06 20:30 ` Chen, Kenneth W
2004-05-07 3:02 ` Andrew Morton
2004-05-07 9:35 ` Jens Axboe
2004-05-06 20:29 ` Chen, Kenneth W
2004-05-07 9:39 ` Jens Axboe
2004-05-07 22:00 ` Chen, Kenneth W
2004-05-10 14:30 ` Jens Axboe [this message]
2004-05-10 14:43 ` Nick Piggin
2004-05-10 14:44 ` Jens Axboe
2004-05-11 3:22 ` Nick Piggin
2004-05-12 5:32 ` Chen, Kenneth W
2004-05-12 7:05 ` Jens Axboe
2004-05-12 13:48 ` Jens Axboe
2004-05-12 14:22 ` Jens Axboe
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=20040510143024.GF14403@suse.de \
--to=axboe@suse.de \
--cc=akpm@osdl.org \
--cc=kenneth.w.chen@intel.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