mm/page_alloc.c: check return value of memblock_alloc_node_nopanic()
authorMike Rapoport <rppt@linux.ibm.com>
Thu, 7 Feb 2019 00:57:05 +0000 (11:57 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 7 Feb 2019 00:57:05 +0000 (11:57 +1100)
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: Mike Rapoport <rppt@linux.ibm.com>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
mm/page_alloc.c

index dab917d..c8617f8 100644 (file)
@@ -6419,10 +6419,14 @@ static void __ref setup_usemap(struct pglist_data *pgdat,
 {
        unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
        zone->pageblock_flags = NULL;
-       if (usemapsize)
+       if (usemapsize) {
                zone->pageblock_flags =
                        memblock_alloc_node_nopanic(usemapsize,
                                                         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
 static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
@@ -6652,6 +6656,9 @@ static void __ref alloc_node_mem_map(struct pglist_data *pgdat)
                end = ALIGN(end, MAX_ORDER_NR_PAGES);
                size =  (end - start) * sizeof(struct page);
                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;
        }
        pr_debug("%s: node %d, pgdat %08lx, node_mem_map %08lx\n",