mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
[PATCH] powerpc: Always panic if lmb_alloc() fails
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>
This commit is contained in:
parent
2fb07d776b
commit
d7a5b2ffa1
8 changed files with 18 additions and 14 deletions
|
@ -831,10 +831,6 @@ void __init unflatten_device_tree(void)
|
||||||
|
|
||||||
/* Allocate memory for the expanded device tree */
|
/* Allocate memory for the expanded device tree */
|
||||||
mem = lmb_alloc(size + 4, __alignof__(struct device_node));
|
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);
|
mem = (unsigned long) __va(mem);
|
||||||
|
|
||||||
((u32 *)mem)[size / 4] = 0xdeadbeef;
|
((u32 *)mem)[size / 4] = 0xdeadbeef;
|
||||||
|
|
|
@ -430,7 +430,6 @@ void __init htab_initialize(void)
|
||||||
* the absolute address space.
|
* the absolute address space.
|
||||||
*/
|
*/
|
||||||
table = lmb_alloc(htab_size_bytes, htab_size_bytes);
|
table = lmb_alloc(htab_size_bytes, htab_size_bytes);
|
||||||
BUG_ON(table == 0);
|
|
||||||
|
|
||||||
DBG("Hash table allocated at %lx, size: %lx\n", table,
|
DBG("Hash table allocated at %lx, size: %lx\n", table,
|
||||||
htab_size_bytes);
|
htab_size_bytes);
|
||||||
|
|
|
@ -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 __init lmb_alloc_base(unsigned long size, unsigned long align,
|
||||||
unsigned long max_addr)
|
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;
|
long i, j;
|
||||||
unsigned long base = 0;
|
unsigned long base = 0;
|
||||||
|
|
|
@ -249,7 +249,6 @@ void __init do_init_bootmem(void)
|
||||||
bootmap_pages = bootmem_bootmap_pages(total_pages);
|
bootmap_pages = bootmem_bootmap_pages(total_pages);
|
||||||
|
|
||||||
start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE);
|
start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE);
|
||||||
BUG_ON(!start);
|
|
||||||
|
|
||||||
boot_mapsize = init_bootmem(start >> PAGE_SHIFT, total_pages);
|
boot_mapsize = init_bootmem(start >> PAGE_SHIFT, total_pages);
|
||||||
|
|
||||||
|
|
|
@ -570,11 +570,11 @@ static void __init *careful_allocation(int nid, unsigned long size,
|
||||||
unsigned long end_pfn)
|
unsigned long end_pfn)
|
||||||
{
|
{
|
||||||
int new_nid;
|
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 */
|
/* retry over all memory */
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = lmb_alloc_base(size, align, lmb_end_of_DRAM());
|
ret = __lmb_alloc_base(size, align, lmb_end_of_DRAM());
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
panic("numa.c: cannot allocate %lu bytes on node %d",
|
panic("numa.c: cannot allocate %lu bytes on node %d",
|
||||||
|
|
|
@ -247,10 +247,6 @@ void stabs_alloc(void)
|
||||||
|
|
||||||
newstab = lmb_alloc_base(HW_PAGE_SIZE, HW_PAGE_SIZE,
|
newstab = lmb_alloc_base(HW_PAGE_SIZE, HW_PAGE_SIZE,
|
||||||
1<<SID_SHIFT);
|
1<<SID_SHIFT);
|
||||||
if (! newstab)
|
|
||||||
panic("Unable to allocate segment table for CPU %d.\n",
|
|
||||||
cpu);
|
|
||||||
|
|
||||||
newstab = (unsigned long)__va(newstab);
|
newstab = (unsigned long)__va(newstab);
|
||||||
|
|
||||||
memset((void *)newstab, 0, HW_PAGE_SIZE);
|
memset((void *)newstab, 0, HW_PAGE_SIZE);
|
||||||
|
|
|
@ -194,8 +194,6 @@ static int dart_init(struct device_node *dart_node)
|
||||||
* prefetching into invalid pages and corrupting data
|
* prefetching into invalid pages and corrupting data
|
||||||
*/
|
*/
|
||||||
tmp = lmb_alloc(DART_PAGE_SIZE, DART_PAGE_SIZE);
|
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) &
|
dart_emptyval = DARTMAP_VALID | ((tmp >> DART_PAGE_SHIFT) &
|
||||||
DARTMAP_RPNMASK);
|
DARTMAP_RPNMASK);
|
||||||
|
|
||||||
|
|
|
@ -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(unsigned long, unsigned long);
|
||||||
extern unsigned long __init lmb_alloc_base(unsigned long, unsigned long,
|
extern unsigned long __init lmb_alloc_base(unsigned long, 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_phys_mem_size(void);
|
||||||
extern unsigned long __init lmb_end_of_DRAM(void);
|
extern unsigned long __init lmb_end_of_DRAM(void);
|
||||||
extern unsigned long __init lmb_abs_to_phys(unsigned long);
|
extern unsigned long __init lmb_abs_to_phys(unsigned long);
|
||||||
|
|
Loading…
Reference in a new issue