| From f7c9c6bb14f3104608a3a83cadea10a6943d2804 Mon Sep 17 00:00:00 2001 |
| From: Anton Blanchard <anton@samba.org> |
| Date: Thu, 3 Nov 2011 08:56:22 +1100 |
| Subject: [SCSI] Fix block queue and elevator memory leak in scsi_alloc_sdev |
| |
| From: Anton Blanchard <anton@samba.org> |
| |
| commit f7c9c6bb14f3104608a3a83cadea10a6943d2804 upstream. |
| |
| 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 |
| |
| Signed-off-by: Anton Blanchard <anton@samba.org> |
| Signed-off-by: James Bottomley <JBottomley@Parallels.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/scsi_scan.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/scsi/scsi_scan.c |
| +++ b/drivers/scsi/scsi_scan.c |
| @@ -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) |