Re: memory leak in scsi_cmd_cache 2.6.15

From: Jens Axboe
Date: Sun Jan 29 2006 - 14:59:11 EST


On Sun, Jan 29 2006, James Bottomley wrote:
> On Sun, 2006-01-29 at 17:50 +0200, Pasi Kärkkäinen wrote:
> > Are all sata drivers affected by this bug in 2.6.15?
>
> Well, all SCSI drivers are affected by it, yes. However, SATA devices
> are peculiarly affected because the ordered_flush method of enforcing
> barriers, which is where the leak is, can only be implemented for
> devices that don't do tag command queueing (i.e. don't have multiple
> commands outstanding for a given single device). By and large, SATA
> drivers are the only drivers in the SCSI subsystem that can't do tag
> command queueing, which is why the problem didn't show up for any other
> type of SCSI driver.

2.6.15 didn't support barriers for anything other than ordered flush
SCSI low level drivers, hence only SATA is affected.

> > Any 'official' patch available?
>
> Well, yes, 2.6.16-rc1 has this fixed. I can't see backporting this to
> 2.6.15.x since it represents a significant functionality enhancement as
> well, so I'd lean towards just forcing ordered_flush to zero in 2.6.15.x
> which seems to be the best bug fix.

Agree, backporting the barrier rewrite would be insane for stable.

> > Or is the recommended workaround to set ordered_flush to 0 to fix this..
> > does that have any downsides?
>
> setting ordered_flush to zero for 2.6.15 turns off the flushing
> functionality and restores the old behaviour. I don't see that there
> would be any down side to this.

Just the usual correctness issue, but since it's leaky it doesn't seem
like a big deal to wait for 2.6.16.

So here's a patch for 2.6.15:

---

Turn off ordered flush barriers for SCSI driver, since the SCSI barrier
code has a command leak.

Signed-off-by: Jens Axboe <axboe@xxxxxxx>

--- linux-2.6.15.1/drivers/scsi/scsi_lib.c~ 2006-01-29 11:55:08.000000000 -0800
+++ linux-2.6.15.1/drivers/scsi/scsi_lib.c 2006-01-29 11:55:38.000000000 -0800
@@ -1534,11 +1534,6 @@
*/
if (shost->ordered_tag)
blk_queue_ordered(q, QUEUE_ORDERED_TAG);
- else if (shost->ordered_flush) {
- blk_queue_ordered(q, QUEUE_ORDERED_FLUSH);
- q->prepare_flush_fn = scsi_prepare_flush_fn;
- q->end_flush_fn = scsi_end_flush_fn;
- }

if (!shost->use_clustering)
clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);

--
Jens Axboe

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/