On Fri 28-01-22 15:45:40, David Hildenbrand wrote: > 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. > > Fixes: 028fc57a1c36 ("drivers/base/memory: introduce "memory groups" to logically group memory blocks") > Cc: stable@xxxxxxxxxxxxxxx # v5.15+ > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: "Rafael J. Wysocki" <rafael@xxxxxxxxxx> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Cc: Michal Hocko <mhocko@xxxxxxxx> > Cc: Oscar Salvador <osalvador@xxxxxxx> > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> Thanks! > --- > drivers/base/memory.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/base/memory.c b/drivers/base/memory.c > index 365cd4a7f239..60c38f9cf1a7 100644 > --- a/drivers/base/memory.c > +++ b/drivers/base/memory.c > @@ -663,14 +663,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) > -- > 2.34.1 -- Michal Hocko SUSE Labs