OSDN Git Service

mm/page_alloc.c: check return value of memblock_alloc_node_nopanic()
authorMike Rapoport <rppt@linux.ibm.com>
Tue, 5 Mar 2019 23:46:43 +0000 (15:46 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Mar 2019 05:07:18 +0000 (21:07 -0800)
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: Linus Torvalds <torvalds@linux-foundation.org>
mm/page_alloc.c

index ec25045..11a5f50 100644 (file)
@@ -6431,10 +6431,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,
@@ -6664,6 +6668,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",