summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMa Ke <make24@iscas.ac.cn>2025-11-08 19:53:46 +0800
committerAndrew Morton <akpm@linux-foundation.org>2025-11-24 15:08:50 -0800
commitfe9d31fd1ab6cb53e45d9d6b0bb7a62d8365fe2b (patch)
treed28d27e1bb5145193c9f4466a7b9a0f97df4a423
parent50d0598cf2c9d33e1f08c3b1a357752ea8a9b94a (diff)
mm/hmm/test: fix error handling in dmirror_device_init
dmirror_device_init() calls device_initialize() which sets the device reference count to 1, but fails to call put_device() when error occurs after dev_set_name() or cdev_device_add() failures. This results in memory leaks of struct device objects. Additionally, dmirror_device_remove() lacks the final put_device() call to properly release the device reference. Found by code review. Link: https://lkml.kernel.org/r/20251108115346.6368-1-make24@iscas.ac.cn Fixes: 6a760f58c792 ("mm/hmm/test: use char dev with struct device to get device node") Signed-off-by: Ma Ke <make24@iscas.ac.cn> Cc: Haoxiang Li <make24@iscas.ac.cn> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Leon Romanovsky <leon@kernel.org> Cc: Mika Penttilä <mpenttil@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--lib/test_hmm.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index 72a8b2f38d8a..8af169d3873a 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -1740,20 +1740,25 @@ static int dmirror_device_init(struct dmirror_device *mdevice, int id)
ret = dev_set_name(&mdevice->device, "hmm_dmirror%u", id);
if (ret)
- return ret;
+ goto put_device;
ret = cdev_device_add(&mdevice->cdevice, &mdevice->device);
if (ret)
- return ret;
+ goto put_device;
/* Build a list of free ZONE_DEVICE struct pages */
return dmirror_allocate_chunk(mdevice, NULL, false);
+
+put_device:
+ put_device(&mdevice->device);
+ return ret;
}
static void dmirror_device_remove(struct dmirror_device *mdevice)
{
dmirror_device_remove_chunks(mdevice);
cdev_device_del(&mdevice->cdevice, &mdevice->device);
+ put_device(&mdevice->device);
}
static int __init hmm_dmirror_init(void)