[PATCH] powerpc: Always panic if lmb_alloc() fails
authorMichael Ellerman <michael@ellerman.id.au>
Wed, 25 Jan 2006 08:31:28 +0000 (21:31 +1300)
committerPaul Mackerras <paulus@samba.org>
Tue, 7 Feb 2006 11:38:34 +0000 (22:38 +1100)
Currently most callers of lmb_alloc() don't check if it worked or not, if it
ever does weird bad things will probably happen. The few callers who do check
just panic or BUG_ON.

So make lmb_alloc() panic internally, to catch bugs at the source. The few
callers who did check the result no longer need to.

The only caller that did anything interesting with the return result was
careful_allocation(). For it we create __lmb_alloc_base() which _doesn't_ panic
automatically, a little messy, but passable.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/prom.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/lmb.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/numa.c
arch/powerpc/mm/stab.c
arch/powerpc/sysdev/dart_iommu.c
include/asm-powerpc/lmb.h

index 294832a7e0a6598c7eb92093ff60216941f2203f..82d117c60d7f52f84a32a74a410d49e7ccbb9074 100644 (file)
@@ -831,10 +831,6 @@ void __init unflatten_device_tree(void)
 
        /* Allocate memory for the expanded device tree */
        mem = lmb_alloc(size + 4, __alignof__(struct device_node));
-       if (!mem) {
-               DBG("Couldn't allocate memory with lmb_alloc()!\n");
-               panic("Couldn't allocate memory with lmb_alloc()!\n");
-       }
        mem = (unsigned long) __va(mem);
 
        ((u32 *)mem)[size / 4] = 0xdeadbeef;
index 149351a84b941cf5bed4970d15d209dcc79ae3f4..95b4cd6b65e02a0a6886522da5aa8573c3c9a464 100644 (file)
@@ -430,7 +430,6 @@ void __init htab_initialize(void)
                 * the absolute address space.
                 */
                table = lmb_alloc(htab_size_bytes, htab_size_bytes);
-               BUG_ON(table == 0);
 
                DBG("Hash table allocated at %lx, size: %lx\n", table,
                    htab_size_bytes);
index bbe3eac918e8001338aa84ba2ede420ec2478b20..d9c76ce5fa8f6a4510a2e9b4813ccb66ddfed87a 100644 (file)
@@ -225,6 +225,20 @@ unsigned long __init lmb_alloc(unsigned long size, unsigned long align)
 
 unsigned long __init lmb_alloc_base(unsigned long size, unsigned long align,
                                    unsigned long max_addr)
+{
+       unsigned long alloc;
+
+       alloc = __lmb_alloc_base(size, align, max_addr);
+
+       if (alloc < 0)
+               panic("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
+                               size, max_addr);
+
+       return alloc;
+}
+
+unsigned long __init __lmb_alloc_base(unsigned long size, unsigned long align,
+                                   unsigned long max_addr)
 {
        long i, j;
        unsigned long base = 0;
index 550517c2dd42babc88c7064763556b5851467dd4..6809cdba6e9482d8a5a72c63224357c325eca9b9 100644 (file)
@@ -249,7 +249,6 @@ void __init do_init_bootmem(void)
        bootmap_pages = bootmem_bootmap_pages(total_pages);
 
        start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE);
-       BUG_ON(!start);
 
        boot_mapsize = init_bootmem(start >> PAGE_SHIFT, total_pages);
 
index 2863a912bcd0950d3841d62c035110aa0f5b8d3a..da5280f8cf42e7805ef542dfb7495e31d6aa5658 100644 (file)
@@ -570,11 +570,11 @@ static void __init *careful_allocation(int nid, unsigned long size,
                                       unsigned long end_pfn)
 {
        int new_nid;
-       unsigned long ret = lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
+       unsigned long ret = __lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
 
        /* retry over all memory */
        if (!ret)
-               ret = lmb_alloc_base(size, align, lmb_end_of_DRAM());
+               ret = __lmb_alloc_base(size, align, lmb_end_of_DRAM());
 
        if (!ret)
                panic("numa.c: cannot allocate %lu bytes on node %d",
index 82e4951826bc7985869687a449a9a818e56d9803..91d25fb27f8940973fe15d67ff6f76a3c28acaa2 100644 (file)
@@ -247,10 +247,6 @@ void stabs_alloc(void)
 
                newstab = lmb_alloc_base(HW_PAGE_SIZE, HW_PAGE_SIZE,
                                         1<<SID_SHIFT);
-               if (! newstab)
-                       panic("Unable to allocate segment table for CPU %d.\n",
-                             cpu);
-
                newstab = (unsigned long)__va(newstab);
 
                memset((void *)newstab, 0, HW_PAGE_SIZE);
index 977de9db87547635f61dffff982684c674a0b531..929ad2333aab1b9ff6c298485b6b4cfc0566f840 100644 (file)
@@ -194,8 +194,6 @@ static int dart_init(struct device_node *dart_node)
         * prefetching into invalid pages and corrupting data
         */
        tmp = lmb_alloc(DART_PAGE_SIZE, DART_PAGE_SIZE);
-       if (!tmp)
-               panic("DART: Cannot allocate spare page!");
        dart_emptyval = DARTMAP_VALID | ((tmp >> DART_PAGE_SHIFT) &
                                         DARTMAP_RPNMASK);
 
index d3546c4c9f46070e2c4ca3036fa96eb6a88abb0d..4fda8eaaeaf4e86054487af65522717b02d1bd7f 100644 (file)
@@ -48,6 +48,8 @@ extern long __init lmb_reserve(unsigned long, unsigned long);
 extern unsigned long __init lmb_alloc(unsigned long, unsigned long);
 extern unsigned long __init lmb_alloc_base(unsigned long, unsigned long,
                                           unsigned long);
+extern unsigned long __init __lmb_alloc_base(unsigned long, unsigned long,
+                                          unsigned long);
 extern unsigned long __init lmb_phys_mem_size(void);
 extern unsigned long __init lmb_end_of_DRAM(void);
 extern unsigned long __init lmb_abs_to_phys(unsigned long);