]> err.no Git - linux-2.6/commitdiff
[PATCH] Fix cfq_find_next_crq()
authorJens Axboe <axboe@suse.de>
Mon, 27 Jun 2005 08:55:49 +0000 (10:55 +0200)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 27 Jun 2005 21:33:29 +0000 (14:33 -0700)
In cfq_find_next_crq(), cfq tries to find the next request by choosing
one of two requests before and after the current one.  Currently, when
choosing the next request, if there's no next request, the next
candidate is NULL, resulting in selection of the previous request.  This
results in weird scheduling.  Once we reach the end, we always seek
backward.

The correct behavior is using the first request as the next candidate.
cfq_choose_req() already has logics for handling wrapped requests.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/block/cfq-iosched.c

index 35f6e569d5e5373636d40a0103db513a9a6d63c6..baa3e268250adbf261d499a6b1d6e96de8a8d500 100644 (file)
@@ -375,9 +375,10 @@ cfq_find_next_crq(struct cfq_data *cfqd, struct cfq_queue *cfqq,
        struct cfq_rq *crq_next = NULL, *crq_prev = NULL;
        struct rb_node *rbnext, *rbprev;
 
+       rbnext = NULL;
        if (ON_RB(&last->rb_node))
                rbnext = rb_next(&last->rb_node);
-       else {
+       if (!rbnext) {
                rbnext = rb_first(&cfqq->sort_list);
                if (rbnext == &last->rb_node)
                        rbnext = NULL;