Skip to content

Commit

Permalink
[PATCH] CFQ: request <-> request merging rr_list fixup
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Jens Axboe authored and Linus Torvalds committed Oct 31, 2006
1 parent eafa6cb commit 5fccbf6
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 5fccbf6

Please sign in to comment.