]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drivers/base/memory: add memory block to memory group after registration succeeded
authorDavid Hildenbrand <david@redhat.com>
Tue, 22 Mar 2022 21:47:09 +0000 (14:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Mar 2022 22:57:10 +0000 (15:57 -0700)
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: c7f55f08510a ("drivers/base/memory: introduce "memory groups" to logically group memory blocks")
Signed-off-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Oscar Salvador <osalvador@suse.de>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/base/memory.c

index abf407e45467fab45595e0d4d4a7d871ec4954ce..6ee2181adc3feb7df73db767f6c85ea198bc3c5e 100644 (file)
@@ -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)