All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <jens.axboe@oracle.com>
To: Vasily Tarasov <vtaras@openvz.org>
Cc: LKML <linux-kernel@vger.kernel.org>, OVZDL <devel@openvz.org>
Subject: Re: [PATCH] cfq: get rid of cfqq hash
Date: Wed, 25 Apr 2007 09:27:02 +0200	[thread overview]
Message-ID: <20070425072702.GJ9715@kernel.dk> (raw)
In-Reply-To: <20070425065822.GG9715@kernel.dk>

On Wed, Apr 25 2007, Jens Axboe wrote:
> On Tue, Apr 24 2007, Vasily Tarasov wrote:
> > @@ -1806,7 +1765,11 @@ static int cfq_may_queue(request_queue_t
> >  	 * so just lookup a possibly existing queue, or return 'may queue'
> >  	 * if that fails
> >  	 */
> > -	cfqq = cfq_find_cfq_hash(cfqd, key, tsk->ioprio);
> > +	cic = cfq_get_io_context_noalloc(cfqd, tsk);
> > +	if (!cic)
> > +		return ELV_MQUEUE_MAY; 
> > +
> > +	cfqq = cic->cfqq[rw & REQ_RW_SYNC];
> >  	if (cfqq) {
> >  		cfq_init_prio_data(cfqq);
> >  		cfq_prio_boost(cfqq);
> 
> Ahem, how well did you test this patch?

Incremental update to get things working below.

diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index ed1ce43..17e4660 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -202,6 +202,18 @@ static struct cfq_queue *cfq_get_queue(struct cfq_data *, int,
 static struct cfq_io_context *cfq_cic_rb_lookup(struct cfq_data *,
 						struct io_context *);
 
+static inline struct cfq_queue *cic_to_cfqq(struct cfq_io_context *cic,
+					    int is_sync)
+{
+	return cic->cfqq[!!is_sync];
+}
+
+static inline void cic_set_cfqq(struct cfq_io_context *cic,
+				struct cfq_queue *cfqq, int is_sync)
+{
+	cic->cfqq[!!is_sync] = cfqq;
+}
+
 /*
  * scheduler run of queue, if there are requests pending and no one in the
  * driver that will restart queueing
@@ -582,7 +594,7 @@ cfq_find_rq_fmerge(struct cfq_data *cfqd, struct bio *bio)
 	if (!cic)
 		return NULL;
 
-	cfqq =  cic->cfqq[bio_sync(bio)];
+	cfqq =  cic_to_cfqq(cic, bio_sync(bio));
 	if (cfqq) {
 		sector_t sector = bio->bi_sector + bio_sectors(bio);
 
@@ -693,7 +705,7 @@ static int cfq_allow_merge(request_queue_t *q, struct request *rq,
 	if (!cic)
 		return 0;
 
-	cfqq = cic->cfqq[bio_sync(bio)];
+	cfqq = cic_to_cfqq(cic, bio_sync(bio));
 	if (cfqq == RQ_CFQQ(rq))
 		return 1;
 
@@ -1330,7 +1342,7 @@ cfq_get_queue(struct cfq_data *cfqd, int is_sync, struct task_struct *tsk,
 retry:
 	cic = cfq_cic_rb_lookup(cfqd, tsk->io_context);
 	/* cic always exists here */
-	cfqq = cic->cfqq[is_sync];
+	cfqq = cic_to_cfqq(cic, is_sync);
 
 	if (!cfqq) {
 		if (new_cfqq) {
@@ -1821,7 +1833,7 @@ static int cfq_may_queue(request_queue_t *q, int rw)
 	if (!cic)
 		return ELV_MQUEUE_MAY;
 
-	cfqq = cic->cfqq[rw & REQ_RW_SYNC];
+	cfqq = cic_to_cfqq(cic, rw & REQ_RW_SYNC);
 	if (cfqq) {
 		cfq_init_prio_data(cfqq);
 		cfq_prio_boost(cfqq);
@@ -1877,15 +1889,15 @@ cfq_set_request(request_queue_t *q, struct request *rq, gfp_t gfp_mask)
 	if (!cic)
 		goto queue_fail;
 
-	if (!cic->cfqq[is_sync]) {
+	cfqq = cic_to_cfqq(cic, is_sync);
+	if (!cfqq) {
 		cfqq = cfq_get_queue(cfqd, is_sync, tsk, gfp_mask);
 
 		if (!cfqq)
 			goto queue_fail;
 
-		cic->cfqq[is_sync] = cfqq;
-	} else
-		cfqq = cic->cfqq[is_sync];
+		cic_set_cfqq(cic, cfqq, is_sync);
+	}
 
 	cfqq->allocated[rw]++;
 	cfq_clear_cfqq_must_alloc(cfqq);

-- 
Jens Axboe


  reply	other threads:[~2007-04-25  7:28 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-24 13:53 [PATCH] cfq: get rid of cfqq hash Vasily Tarasov
2007-04-24 17:02 ` Jens Axboe
2007-04-24 17:22   ` Jens Axboe
2007-04-24 18:29     ` Jens Axboe
2007-04-24 18:33       ` Jens Axboe
2007-04-25 11:31     ` Vasily Tarasov
2007-04-25  6:58 ` Jens Axboe
2007-04-25  7:27   ` Jens Axboe [this message]
2007-04-25 11:50   ` Vasily Tarasov
2007-04-25  7:57     ` Jens Axboe
2007-04-25 10:27       ` Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2007-04-24 11:53 Vasily Tarasov
2007-04-24 12:27 ` Jens Axboe
2007-04-24 12:51   ` Vasily Tarasov

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=20070425072702.GJ9715@kernel.dk \
    --to=jens.axboe@oracle.com \
    --cc=devel@openvz.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=vtaras@openvz.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.