memblock: memblock_phys_alloc(): don't panic
authorMike Rapoport <rppt@linux.ibm.com>
Tue, 12 Mar 2019 06:29:26 +0000 (23:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Mar 2019 17:04:01 +0000 (10:04 -0700)
Make the memblock_phys_alloc() function an inline wrapper for
memblock_phys_alloc_range() and update the memblock_phys_alloc() callers
to check the returned value and panic in case of error.

Link: http://lkml.kernel.org/r/1548057848-15136-8-git-send-email-rppt@linux.ibm.com
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christophe Leroy <christophe.leroy@c-s.fr>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Dennis Zhou <dennis@kernel.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Greentime Hu <green.hu@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Guan Xuetao <gxt@pku.edu.cn>
Cc: Guo Ren <guoren@kernel.org>
Cc: Guo Ren <ren_guo@c-sky.com> [c-sky]
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Juergen Gross <jgross@suse.com> [Xen]
Cc: Mark Salter <msalter@redhat.com>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Paul Burton <paul.burton@mips.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Rich Felker <dalias@libc.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Rob Herring <robh@kernel.org>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Stafford Horne <shorne@gmail.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
13 files changed:
arch/arm/mm/init.c
arch/arm64/mm/mmu.c
arch/powerpc/sysdev/dart_iommu.c
arch/s390/kernel/crash_dump.c
arch/s390/kernel/setup.c
arch/sh/boards/mach-ap325rxa/setup.c
arch/sh/boards/mach-ecovec24/setup.c
arch/sh/boards/mach-kfr2r09/setup.c
arch/sh/boards/mach-migor/setup.c
arch/sh/boards/mach-se/7724/setup.c
arch/xtensa/mm/kasan_init.c
include/linux/memblock.h
mm/memblock.c

index b76b90eb935680b3fe71843701797037f762d16d..15dddfe43319547d2e3c81a80a33f0315a3e2c55 100644 (file)
@@ -206,6 +206,10 @@ phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align)
        BUG_ON(!arm_memblock_steal_permitted);
 
        phys = memblock_phys_alloc(size, align);
+       if (!phys)
+               panic("Failed to steal %pa bytes at %pS\n",
+                     &size, (void *)_RET_IP_);
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
 
index 402b6495ff5815644e60d65679acd40a17ee8fbe..e97f018ff740f8a1cea437aa88a652882412928b 100644 (file)
@@ -103,6 +103,8 @@ static phys_addr_t __init early_pgtable_alloc(void)
        void *ptr;
 
        phys = memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate page table page\n");
 
        /*
         * The FIX_{PGD,PUD,PMD} slots may be in active use, but the FIX_PTE
index fc5c5c23303edde535e8aa3d75f4dfcf55d88445..2a751795ec1eb2dcdfbcd40c9ff4a1bd6624deb7 100644 (file)
@@ -265,6 +265,9 @@ static void allocate_dart(void)
         * prefetching into invalid pages and corrupting data
         */
        tmp = memblock_phys_alloc(DART_PAGE_SIZE, DART_PAGE_SIZE);
+       if (!tmp)
+               panic("DART: table allocation failed\n");
+
        dart_emptyval = DARTMAP_VALID | ((tmp >> DART_PAGE_SHIFT) &
                                         DARTMAP_RPNMASK);
 
index 97eae387186875ea834c635d0608e49658bf355a..f96a5857bbfde04d4ed7fe59b0d0900c7a916a1c 100644 (file)
@@ -61,6 +61,9 @@ struct save_area * __init save_area_alloc(bool is_boot_cpu)
        struct save_area *sa;
 
        sa = (void *) memblock_phys_alloc(sizeof(*sa), 8);
+       if (!sa)
+               panic("Failed to allocate save area\n");
+
        if (is_boot_cpu)
                list_add(&sa->list, &dump_save_areas);
        else
index 12934e8fbb9194ca51c6b775e8339088c281a3c4..d7920f3e76c6c02ddd27f366c257e7a3736e2ab6 100644 (file)
@@ -966,6 +966,9 @@ static void __init setup_randomness(void)
 
        vmms = (struct sysinfo_3_2_2 *) memblock_phys_alloc(PAGE_SIZE,
                                                            PAGE_SIZE);
+       if (!vmms)
+               panic("Failed to allocate memory for sysinfo structure\n");
+
        if (stsi(vmms, 3, 2, 2) == 0 && vmms->count)
                add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
        memblock_free((unsigned long) vmms, PAGE_SIZE);
index 97774424fbee64fb544208ba7e1c7adb909e5eb7..8301a4378f502cdcf8ce87da797013708dab32ce 100644 (file)
@@ -557,6 +557,9 @@ static void __init ap325rxa_mv_mem_reserve(void)
        phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
 
index d329bf3be487b5c651a04f7f2fba7649bb49b708..34e5414c556391469ed7a72119a653109f570e6b 100644 (file)
@@ -1477,11 +1477,17 @@ static void __init ecovec_mv_mem_reserve(void)
        phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU0 memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
        ceu0_dma_membase = phys;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU1 memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
        ceu1_dma_membase = phys;
index 5c258ae9c43af9230c94e2cc887f7172f05337f3..1cf9a47ac90ed7fcb1580e5cb4526d980d3d918f 100644 (file)
@@ -631,6 +631,9 @@ static void __init kfr2r09_mv_mem_reserve(void)
        phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
 
index 193d91bb84bf19fb6386cda18b52000130d75394..90702740f207c783f1a50b2c90ea22ab728da0a1 100644 (file)
@@ -631,6 +631,9 @@ static void __init migor_mv_mem_reserve(void)
        phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
 
index 5c7aa37bfd86ff8ae03e83dd1aeaf59ff3df5386..3674064816c73c7e6ee371f607d1b5b5f88bfbc9 100644 (file)
@@ -964,11 +964,17 @@ static void __init ms7724se_mv_mem_reserve(void)
        phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU0 memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
        ceu0_dma_membase = phys;
 
        phys = memblock_phys_alloc(size, PAGE_SIZE);
+       if (!phys)
+               panic("Failed to allocate CEU1 memory\n");
+
        memblock_free(phys, size);
        memblock_remove(phys, size);
        ceu1_dma_membase = phys;
index 48dbb03f4f6f5eb6bc5ff7d0373dc9078e0f94e3..4852848a0c287e57c0c58260c0d8957e180fae86 100644 (file)
@@ -54,6 +54,9 @@ static void __init populate(void *start, void *end)
                        phys_addr_t phys =
                                memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
 
+                       if (!phys)
+                               panic("Failed to allocate page table page\n");
+
                        set_pte(pte + j, pfn_pte(PHYS_PFN(phys), PAGE_KERNEL));
                }
        }
index 251cd66b151b8d1f8f7c6563823d9c4cef2d843c..7caecb42bfea46e9cf7897bb8f29e5ed094456ef 100644 (file)
@@ -330,7 +330,12 @@ phys_addr_t memblock_phys_alloc_range(phys_addr_t size, phys_addr_t align,
 phys_addr_t memblock_phys_alloc_nid(phys_addr_t size, phys_addr_t align, int nid);
 phys_addr_t memblock_phys_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid);
 
-phys_addr_t memblock_phys_alloc(phys_addr_t size, phys_addr_t align);
+static inline phys_addr_t memblock_phys_alloc(phys_addr_t size,
+                                             phys_addr_t align)
+{
+       return memblock_phys_alloc_range(size, align, 0,
+                                        MEMBLOCK_ALLOC_ACCESSIBLE);
+}
 
 void *memblock_alloc_try_nid_raw(phys_addr_t size, phys_addr_t align,
                                 phys_addr_t min_addr, phys_addr_t max_addr,
index ac57bd3082bb122af3feff8c8821a491e6f7790d..d0b76bb7340d6622dbc8df5f75c9f0912d0b7f69 100644 (file)
@@ -1325,11 +1325,6 @@ phys_addr_t __init memblock_alloc_base(phys_addr_t size, phys_addr_t align, phys
        return alloc;
 }
 
-phys_addr_t __init memblock_phys_alloc(phys_addr_t size, phys_addr_t align)
-{
-       return memblock_alloc_base(size, align, MEMBLOCK_ALLOC_ACCESSIBLE);
-}
-
 phys_addr_t __init memblock_phys_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid)
 {
        phys_addr_t res = memblock_phys_alloc_nid(size, align, nid);