Skip to contentSkip to conversation

Fix block queue and elevator memory leak in scsi_alloc_sdev

PATCH New Anton Blanchard 1 participant 1 message Nov 2, 2011 SCSI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fix block queue and elevator memory leak in scsi_alloc_sdev

When looking at memory consumption issues I noticed quite a lot of memory in the kmalloc-2048 bucket:

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
6561 6471 98% 2.30K 243 27 15552K kmalloc-2048

Over 15MB. slub debug shows that cfq is responsible for almost all of it:

# sort -nr /sys/kernel/slab/kmalloc-2048/alloc_calls
6402 .cfq_init_queue+0xec/0x460 age=43423/43564/43655 pid=1 cpus=4,11,13

In scsi_alloc_sdev we do scsi_alloc_queue but if slave_alloc fails we don't free it with scsi_free_queue.

The patch below fixes the issue:

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
135 72 53% 2.30K 5 27 320K kmalloc-2048

# cat /sys/kernel/slab/kmalloc-2048/alloc_calls
3 .cfq_init_queue+0xec/0x460 age=3811/3876/3925 pid=1 cpus=4,11,13

---

drivers/scsi/scsi_scan.c +1 -0
index 44e8ca3..72273a0 100644
@@ -322,6 +322,7 @@ out_device_destroy:
 	scsi_device_set_state(sdev, SDEV_DEL);
 	transport_destroy_device(&sdev->sdev_gendev);
 	put_device(&sdev->sdev_dev);
+	scsi_free_queue(sdev->request_queue);
 	put_device(&sdev->sdev_gendev);
 out:
 	if (display_failure_msg)