[PATCH] block: Fix possible memory leak for rq_wb on add_disk failure

Chen Zhongjin posted 1 patch 3 years, 5 months ago
block/genhd.c | 1 +
1 file changed, 1 insertion(+)
[PATCH] block: Fix possible memory leak for rq_wb on add_disk failure
Posted by Chen Zhongjin 3 years, 5 months ago
kmemleak reported memory leaks in device_add_disk():

kmemleak: 3 new suspected memory leaks

unreferenced object 0xffff88800f420800 (size 512):
  comm "modprobe", pid 4275, jiffies 4295639067 (age 223.512s)
  hex dump (first 32 bytes):
    04 00 00 00 08 00 00 00 01 00 00 00 00 00 00 00  ................
    00 e1 f5 05 00 00 00 00 00 00 00 00 00 00 00 00  ................
  backtrace:
    [<00000000d3662699>] kmalloc_trace+0x26/0x60
    [<00000000edc7aadc>] wbt_init+0x50/0x6f0
    [<0000000069601d16>] wbt_enable_default+0x157/0x1c0
    [<0000000028fc393f>] blk_register_queue+0x2a4/0x420
    [<000000007345a042>] device_add_disk+0x6fd/0xe40
    [<0000000060e6aab0>] nbd_dev_add+0x828/0xbf0 [nbd]
    ...

It is because the memory allocated in wbt_enable_default() is not
released in device_add_disk() error path.
Normally, these memory are freed in:

del_gendisk()
  rq_qos_exit()
    rqos->ops->exit(rqos);
      wbt_exit()

So rq_qos_exit() is called to free the rq_wb memory for wbt_init().
However in the error path of device_add_disk(), only
blk_unregister_queue() is called and make rq_wb memory leaked.

Add rq_qos_exit() to the error path to fix it.

Fixes: 83cbce957446 ("block: add error handling for device_add_disk / add_disk")
Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
---
 block/genhd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/block/genhd.c b/block/genhd.c
index fee90eb98b4a..0f9769db2de8 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -527,6 +527,7 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
 		bdi_unregister(disk->bdi);
 out_unregister_queue:
 	blk_unregister_queue(disk);
+	rq_qos_exit(disk->queue);
 out_put_slave_dir:
 	kobject_put(disk->slave_dir);
 out_put_holder_dir:
-- 
2.17.1
Re: [PATCH] block: Fix possible memory leak for rq_wb on add_disk failure
Posted by Jens Axboe 3 years, 5 months ago
On Sat, 29 Oct 2022 15:13:55 +0800, Chen Zhongjin wrote:
> kmemleak reported memory leaks in device_add_disk():
> 
> kmemleak: 3 new suspected memory leaks
> 
> unreferenced object 0xffff88800f420800 (size 512):
>   comm "modprobe", pid 4275, jiffies 4295639067 (age 223.512s)
>   hex dump (first 32 bytes):
>     04 00 00 00 08 00 00 00 01 00 00 00 00 00 00 00  ................
>     00 e1 f5 05 00 00 00 00 00 00 00 00 00 00 00 00  ................
>   backtrace:
>     [<00000000d3662699>] kmalloc_trace+0x26/0x60
>     [<00000000edc7aadc>] wbt_init+0x50/0x6f0
>     [<0000000069601d16>] wbt_enable_default+0x157/0x1c0
>     [<0000000028fc393f>] blk_register_queue+0x2a4/0x420
>     [<000000007345a042>] device_add_disk+0x6fd/0xe40
>     [<0000000060e6aab0>] nbd_dev_add+0x828/0xbf0 [nbd]
>     ...
> 
> [...]

Applied, thanks!

[1/1] block: Fix possible memory leak for rq_wb on add_disk failure
      (no commit info)

Best regards,
-- 
Jens Axboe
Re: [PATCH] block: Fix possible memory leak for rq_wb on add_disk failure
Posted by Christoph Hellwig 3 years, 5 months ago
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>