]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/memory_hotplug: fix memory block reference leak on remove
authorMuchun Song <songmuchun@bytedance.com>
Tue, 28 Apr 2026 08:52:17 +0000 (16:52 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 14 May 2026 00:40:03 +0000 (17:40 -0700)
Patch series "mm: Fix memory block leaks and locking", v2.

This series fixes two memory block device reference leaks and one locking
issue around the per-memory_block hwpoison counter.

This patch (of 2):

remove_memory_blocks_and_altmaps() looks up each memory block with
find_memory_block(), which acquires a reference to the memory block
device.

That reference is never dropped on this path, resulting in a leaked device
reference when removing memory blocks and their altmaps.  Drop the
reference after retrieving mem->altmap and clearing mem->altmap, before
removing the memory block device.

Link: https://lore.kernel.org/20260428085219.1316047-1-songmuchun@bytedance.com
Link: https://lore.kernel.org/20260428085219.1316047-2-songmuchun@bytedance.com
Fixes: 6b8f0798b85a ("mm/memory_hotplug: split memmap_on_memory requests across memblocks")
Signed-off-by: Muchun Song <songmuchun@bytedance.com>
Acked-by: Oscar Salvador <osalvador@suse.de>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Huang, Ying" <huang.ying.caritas@gmail.com>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory_hotplug.c

index 2a943ec57c85b7f423bd1a6cea9cf6ea84699a05..40c7915dabe058a52361e53a06f8fd43336ddec8 100644 (file)
@@ -1422,6 +1422,8 @@ static void remove_memory_blocks_and_altmaps(u64 start, u64 size)
 
                altmap = mem->altmap;
                mem->altmap = NULL;
+               /* drop the ref. we got via find_memory_block() */
+               put_device(&mem->dev);
 
                remove_memory_block_devices(cur_start, memblock_size);