powerpc: Fix bug arising from having multiple memory_limit variables
authorPaul Mackerras <paulus@samba.org>
Mon, 31 Oct 2005 02:07:02 +0000 (13:07 +1100)
committerPaul Mackerras <paulus@samba.org>
Mon, 31 Oct 2005 02:07:02 +0000 (13:07 +1100)
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>
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/numa.c
arch/powerpc/platforms/iseries/setup.c
arch/ppc64/kernel/prom.c
include/asm-powerpc/system.h
include/asm-ppc64/system.h

index 6309a1a17c4a5a9027ead4286481f524ccef007c..2eccd0e159e36f9d477210760a40fdae691f6eb0 100644 (file)
@@ -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;
index 681537f8ea105afe35e3c3faaa837f03317633ca..40c48100bf1b433c00b4d41b390bae763d1ab69d 100644 (file)
@@ -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.
index 3ca331728d212d3541e8c21940a7ebf9cb8b4f14..e43e8ef7008812f817ba29fb81a1bf1ba30202f4 100644 (file)
@@ -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
index cb864b8f27505abee687702fca4833dbf9d6016b..4035cad8d7f19b84482d11f48ce067bb23e53133 100644 (file)
@@ -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;
index b279014817824601e171cd3d9df9a7a152e0e625..1544c6f10a384a27ce4c02d4b5f4fb8cb22cee12 100644 (file)
@@ -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;
index cd41a47dd43f9ab4568b135d0d8cbf1a93fb3819..97bfceb5353b7a842231e9176ccd67c4aedaaa43 100644 (file)
@@ -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);
 
index e926e43c4ae66a7efd40643f4b3f2b2dff13c672..5b2ecbc4790770bbe4fc036dc5e9c1a90df2b35c 100644 (file)
@@ -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 */
 
index fd7c1f890c458b0e73681d93cd7cb035e315e255..99b8ca52f101ab7fea76b0c7420d4eb9ebdfd33f 100644 (file)
@@ -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);