tree e20298522f411f1184d748206df6e15b3b949117
parent 49e31cbac5be2202f351626fd4fb33ad4d4819b8
author Brian King <[EMAIL PROTECTED]> Wed, 07 Sep 2005 05:18:04 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Thu, 08 Sep 2005 06:57:39 -0700

[PATCH] block: CFQ refcounting fix

I ran across a memory leak related to the cfq scheduler. The cfq
init function increments the refcnt of the associated request_queue.

This refcount gets decremented in cfq's exit function. Since blk_cleanup_queue
only calls the elevator exit function when its refcnt goes to zero, the
request_q never gets cleaned up. It didn't look like other io schedulers were
incrementing this refcnt, so I removed the refcnt increment and it fixed the
memory leak for me.

To reproduce the problem, simply use cfq and use the scsi_host scan sysfs
attribute to scan "- - -" repeatedly on a scsi host and watch the memory

Signed-off-by: Brian King <[EMAIL PROTECTED]>
Acked-by: Jens Axboe <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>

 drivers/block/cfq-iosched.c |    3 ---
 1 files changed, 3 deletions(-)

diff --git a/drivers/block/cfq-iosched.c b/drivers/block/cfq-iosched.c
--- a/drivers/block/cfq-iosched.c
+++ b/drivers/block/cfq-iosched.c
@@ -2260,8 +2260,6 @@ static void cfq_put_cfqd(struct cfq_data
        if (!atomic_dec_and_test(&cfqd->ref))
-       blk_put_queue(q);
        q->elevator->elevator_data = NULL;
@@ -2318,7 +2316,6 @@ static int cfq_init_queue(request_queue_
        e->elevator_data = cfqd;
        cfqd->queue = q;
-       atomic_inc(&q->refcnt);
        cfqd->max_queued = q->nr_requests / 4;
        q->nr_batching = cfq_queued;
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to