Commit 23a7052a authored by Mike Rapoport's avatar Mike Rapoport Committed by Linus Torvalds
Browse files

mm/page_alloc.c: check return value of memblock_alloc_node_nopanic()

There are two early memory allocations that use
memblock_alloc_node_nopanic() and do not check its return value.

While this happens very early during boot and chances that the
allocation will fail are diminishing, it is still worth to have proper
checks for the allocation errors.

Link: http://lkml.kernel.org/r/1547734941-944-1-git-send-email-rppt@linux.ibm.com


Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Reviewed-by: default avatarWilliam Kucharski <william.kucharski@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8ef5cbde
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -6431,10 +6431,14 @@ static void __ref setup_usemap(struct pglist_data *pgdat,
{
{
	unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
	unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
	zone->pageblock_flags = NULL;
	zone->pageblock_flags = NULL;
	if (usemapsize)
	if (usemapsize) {
		zone->pageblock_flags =
		zone->pageblock_flags =
			memblock_alloc_node_nopanic(usemapsize,
			memblock_alloc_node_nopanic(usemapsize,
							 pgdat->node_id);
							 pgdat->node_id);
		if (!zone->pageblock_flags)
			panic("Failed to allocate %ld bytes for zone %s pageblock flags on node %d\n",
			      usemapsize, zone->name, pgdat->node_id);
	}
}
}
#else
#else
static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
@@ -6664,6 +6668,9 @@ static void __ref alloc_node_mem_map(struct pglist_data *pgdat)
		end = ALIGN(end, MAX_ORDER_NR_PAGES);
		end = ALIGN(end, MAX_ORDER_NR_PAGES);
		size =  (end - start) * sizeof(struct page);
		size =  (end - start) * sizeof(struct page);
		map = memblock_alloc_node_nopanic(size, pgdat->node_id);
		map = memblock_alloc_node_nopanic(size, pgdat->node_id);
		if (!map)
			panic("Failed to allocate %ld bytes for node %d memory map\n",
			      size, pgdat->node_id);
		pgdat->node_mem_map = map + offset;
		pgdat->node_mem_map = map + offset;
	}
	}
	pr_debug("%s: node %d, pgdat %08lx, node_mem_map %08lx\n",
	pr_debug("%s: node %d, pgdat %08lx, node_mem_map %08lx\n",