powerpc: Fix bug arising from having multiple memory_limit variables
We had a static memory_limit in prom.c, and then another one defined in setup_64.c and used in numa.c, which resulted in the kernel crashing when mem=xxx was given on the command line. This puts the declaration in system.h and the definition in mem.c. This also moves the definition of tce_alloc_start/end out of setup_64.c. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
5f6b5b973a
commit
cf00a8d18b
|
@ -78,15 +78,13 @@ extern struct rtas_t rtas;
|
|||
extern struct lmb lmb;
|
||||
extern unsigned long klimit;
|
||||
|
||||
static unsigned long memory_limit;
|
||||
|
||||
static int __initdata dt_root_addr_cells;
|
||||
static int __initdata dt_root_size_cells;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
static int __initdata iommu_is_off;
|
||||
int __initdata iommu_force_on;
|
||||
extern unsigned long tce_alloc_start, tce_alloc_end;
|
||||
unsigned long tce_alloc_start, tce_alloc_end;
|
||||
#endif
|
||||
|
||||
typedef u32 cell_t;
|
||||
|
|
|
@ -631,15 +631,6 @@ static int ppc64_panic_event(struct notifier_block *this,
|
|||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* These three variables are used to save values passed to us by prom_init()
|
||||
* via the device tree. The TCE variables are needed because with a memory_limit
|
||||
* in force we may need to explicitly map the TCE are at the top of RAM.
|
||||
*/
|
||||
unsigned long memory_limit;
|
||||
unsigned long tce_alloc_start;
|
||||
unsigned long tce_alloc_end;
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
/*
|
||||
* On iSeries we just parse the mem=X option from the command line.
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
|
||||
int init_bootmem_done;
|
||||
int mem_init_done;
|
||||
unsigned long memory_limit;
|
||||
|
||||
/*
|
||||
* This is called by /dev/mem to know if a given address has to
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <asm/lmb.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
static int numa_enabled = 1;
|
||||
|
||||
|
@ -300,7 +301,6 @@ static unsigned long __init numa_enforce_memory_limit(unsigned long start, unsig
|
|||
* we've already adjusted it for the limit and it takes care of
|
||||
* having memory holes below the limit.
|
||||
*/
|
||||
extern unsigned long memory_limit;
|
||||
|
||||
if (! memory_limit)
|
||||
return size;
|
||||
|
|
|
@ -302,8 +302,6 @@ static void __init iSeries_get_cmdline(void)
|
|||
|
||||
static void __init iSeries_init_early(void)
|
||||
{
|
||||
extern unsigned long memory_limit;
|
||||
|
||||
DBG(" -> iSeries_init_early()\n");
|
||||
|
||||
ppc64_firmware_features = FW_FEATURE_ISERIES;
|
||||
|
|
|
@ -83,6 +83,8 @@ static int __initdata dt_root_addr_cells;
|
|||
static int __initdata dt_root_size_cells;
|
||||
static int __initdata iommu_is_off;
|
||||
int __initdata iommu_force_on;
|
||||
unsigned long tce_alloc_start, tce_alloc_end;
|
||||
|
||||
typedef u32 cell_t;
|
||||
|
||||
#if 0
|
||||
|
@ -1063,7 +1065,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
|
|||
{
|
||||
u32 *prop;
|
||||
u64 *prop64;
|
||||
extern unsigned long tce_alloc_start, tce_alloc_end;
|
||||
|
||||
DBG("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
|
||||
|
||||
|
|
|
@ -179,6 +179,7 @@ extern struct task_struct *_switch(struct thread_struct *prev,
|
|||
|
||||
extern unsigned int rtas_data;
|
||||
extern int mem_init_done; /* set on boot once kmalloc can be called */
|
||||
extern unsigned long memory_limit;
|
||||
|
||||
extern int powersave_nap; /* set if nap mode can be used in idle loop */
|
||||
|
||||
|
|
|
@ -136,6 +136,7 @@ static inline void flush_spe_to_thread(struct task_struct *t)
|
|||
}
|
||||
|
||||
extern int mem_init_done; /* set on boot once kmalloc can be called */
|
||||
extern unsigned long memory_limit;
|
||||
|
||||
/* EBCDIC -> ASCII conversion for [0-9A-Z] on iSeries */
|
||||
extern unsigned char e2a(unsigned char);
|
||||
|
|
Loading…
Reference in New Issue