Skip to content

Commit 03a2cc1

Browse files
songmuchunakpm00
authored andcommitted
drivers/base/memory: fix memory block reference leak in poison accounting
memblk_nr_poison_inc() and memblk_nr_poison_sub() look up a memory block via find_memory_block_by_id(), which acquires a reference to the memory block device. Both helpers use the returned memory block without dropping that reference, leaking the device reference on each successful lookup. Drop the reference after updating nr_hwpoison. Link: https://lore.kernel.org/20260428085219.1316047-3-songmuchun@bytedance.com Fixes: 5033091 ("mm/hwpoison: introduce per-memory_block hwpoison counter") Signed-off-by: Muchun Song <songmuchun@bytedance.com> Reviewed-by: Miaohe Lin <linmiaohe@huawei.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: 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>
1 parent 93866f5 commit 03a2cc1

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

drivers/base/memory.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1230,17 +1230,21 @@ void memblk_nr_poison_inc(unsigned long pfn)
12301230
const unsigned long block_id = pfn_to_block_id(pfn);
12311231
struct memory_block *mem = find_memory_block_by_id(block_id);
12321232

1233-
if (mem)
1233+
if (mem) {
12341234
atomic_long_inc(&mem->nr_hwpoison);
1235+
put_device(&mem->dev);
1236+
}
12351237
}
12361238

12371239
void memblk_nr_poison_sub(unsigned long pfn, long i)
12381240
{
12391241
const unsigned long block_id = pfn_to_block_id(pfn);
12401242
struct memory_block *mem = find_memory_block_by_id(block_id);
12411243

1242-
if (mem)
1244+
if (mem) {
12431245
atomic_long_sub(i, &mem->nr_hwpoison);
1246+
put_device(&mem->dev);
1247+
}
12441248
}
12451249

12461250
static unsigned long memblk_nr_poison(struct memory_block *mem)

0 commit comments

Comments
 (0)