From: David Hildenbrand Date: Tue, 22 Mar 2022 21:47:09 +0000 (-0700) Subject: drivers/base/memory: add memory block to memory group after registration succeeded X-Git-Tag: v5.18-rc1~168^2~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7ea0d2d79da09d1f7d71c96a9c9bc1b5229360b5;p=thirdparty%2Fkernel%2Flinux.git drivers/base/memory: add memory block to memory group after registration succeeded If register_memory() fails, we freed the memory block but already added the memory block to the group list, not good. Let's defer adding the block to the memory group to after registering the memory block device. We do handle it properly during unregister_memory(), but that's not called when the registration fails. Link: https://lkml.kernel.org/r/20220128144540.153902-1-david@redhat.com Fixes: 028fc57a1c36 ("drivers/base/memory: introduce "memory groups" to logically group memory blocks") Signed-off-by: David Hildenbrand Reviewed-by: Oscar Salvador Acked-by: Michal Hocko Cc: Greg Kroah-Hartman Cc: "Rafael J. Wysocki" Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/base/memory.c b/drivers/base/memory.c index abf407e45467f..6ee2181adc3fe 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -665,14 +665,16 @@ static int init_memory_block(unsigned long block_id, unsigned long state, mem->nr_vmemmap_pages = nr_vmemmap_pages; INIT_LIST_HEAD(&mem->group_next); + ret = register_memory(mem); + if (ret) + return ret; + if (group) { mem->group = group; list_add(&mem->group_next, &group->memory_blocks); } - ret = register_memory(mem); - - return ret; + return 0; } static int add_memory_block(unsigned long base_section_nr)