From: Jens Axboe Date: Tue, 31 Oct 2006 13:21:55 +0000 (+0100) Subject: [PATCH] CFQ: request <-> request merging rr_list fixup X-Git-Tag: v2.6.19-rc5~99 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=5fccbf61be2a7f32d2002b04afca4c5009612a58;hp=eafa6cb18ec7e5424ce54017b5ce6d11dff58b79;p=linux-2.6-block.git [PATCH] CFQ: request <-> request merging rr_list fixup In very rare circumstances would we be pruning a merged request and at the same time delete the implicated cfqq from the rr_list, and not readd it when the merged request got added. This could cause io stalls until that process issued io again. Fix it up by putting the rr_list add handling into cfq_add_rq_rb(), identical to how pruning is handled in cfq_del_rq_rb(). This fixes a hang reproducible with fsx-linux. Signed-off-by: Jens Axboe Signed-off-by: Linus Torvalds --- diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 25c4e7ed0d00..1d9c3c70a9a0 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -456,6 +456,9 @@ static void cfq_add_rq_rb(struct request *rq) */ while ((__alias = elv_rb_add(&cfqq->sort_list, rq)) != NULL) cfq_dispatch_insert(cfqd->queue, __alias); + + if (!cfq_cfqq_on_rr(cfqq)) + cfq_add_cfqq_rr(cfqd, cfqq); } static inline void @@ -1652,9 +1655,6 @@ static void cfq_insert_request(request_queue_t *q, struct request *rq) cfq_add_rq_rb(rq); - if (!cfq_cfqq_on_rr(cfqq)) - cfq_add_cfqq_rr(cfqd, cfqq); - list_add_tail(&rq->queuelist, &cfqq->fifo); cfq_rq_enqueued(cfqd, cfqq, rq);