[POWERPC] pseries/phyp dump: Reserve a variable amount of space at boot
authorManish Ahuja <ahuja@austin.ibm.com>
Fri, 11 Apr 2008 23:31:52 +0000 (09:31 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 16 Apr 2008 21:46:14 +0000 (07:46 +1000)
This changes the way we calculate how much space to reserve for the
pHyp dump.  Currently we reserve 256MB only.  With this change, the
code first checks to see if an amount has been specified on the boot
command line with the "phyp_dump_reserve_size" option, and if so, uses
that much.

Otherwise it computes 5% of total ram and rounds it down to a multiple
of 256MB, and uses the larger of that or 256MB.

This is for large systems with a lot of memory (10GB or more).  The
aim is to have more space available for the kernel on reboot on
machines with more resources.  Although the dump will be collected
pretty fast and the memory released really early on allowing the
machine to have the full memory available, this alleviates any issues
that can be caused by having way too little memory on very very large
systems during those few minutes.

Signed-off-by: Manish Ahuja <mahuja@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/prom.c
arch/powerpc/platforms/pseries/phyp_dump.c
include/asm-powerpc/phyp_dump.h

index 31d5b22c59a2016acafe1f62ab8d11ed240e0225..8a9359ae471853688e509d42bd2999b78d1a87ca 100644 (file)
@@ -1042,6 +1042,33 @@ static void __init early_reserve_mem(void)
 }
 
 #ifdef CONFIG_PHYP_DUMP
+/**
+ * phyp_dump_calculate_reserve_size() - reserve variable boot area 5% or arg
+ *
+ * Function to find the largest size we need to reserve
+ * during early boot process.
+ *
+ * It either looks for boot param and returns that OR
+ * returns larger of 256 or 5% rounded down to multiples of 256MB.
+ *
+ */
+static inline unsigned long phyp_dump_calculate_reserve_size(void)
+{
+       unsigned long tmp;
+
+       if (phyp_dump_info->reserve_bootvar)
+               return phyp_dump_info->reserve_bootvar;
+
+       /* divide by 20 to get 5% of value */
+       tmp = lmb_end_of_DRAM();
+       do_div(tmp, 20);
+
+       /* round it down in multiples of 256 */
+       tmp = tmp & ~0x0FFFFFFFUL;
+
+       return (tmp > PHYP_DUMP_RMR_END ? tmp : PHYP_DUMP_RMR_END);
+}
+
 /**
  * phyp_dump_reserve_mem() - reserve all not-yet-dumped mmemory
  *
@@ -1055,6 +1082,8 @@ static void __init early_reserve_mem(void)
 static void __init phyp_dump_reserve_mem(void)
 {
        unsigned long base, size;
+       unsigned long variable_reserve_size;
+
        if (!phyp_dump_info->phyp_dump_configured) {
                printk(KERN_ERR "Phyp-dump not supported on this hardware\n");
                return;
@@ -1065,9 +1094,11 @@ static void __init phyp_dump_reserve_mem(void)
                return;
        }
 
+       variable_reserve_size = phyp_dump_calculate_reserve_size();
+
        if (phyp_dump_info->phyp_dump_is_active) {
                /* Reserve *everything* above RMR.Area freed by userland tools*/
-               base = PHYP_DUMP_RMR_END;
+               base = variable_reserve_size;
                size = lmb_end_of_DRAM() - base;
 
                /* XXX crashed_ram_end is wrong, since it may be beyond
@@ -1079,7 +1110,7 @@ static void __init phyp_dump_reserve_mem(void)
        } else {
                size = phyp_dump_info->cpu_state_size +
                        phyp_dump_info->hpte_region_size +
-                       PHYP_DUMP_RMR_END;
+                       variable_reserve_size;
                base = lmb_end_of_DRAM() - size;
                lmb_reserve(base, size);
                phyp_dump_info->init_reserve_start = base;
index 7ddd10526ceaf868d793ca905a11a4a5413d1066..edbc012c2ebca1cff90c13d713d2e442e3ac52a1 100644 (file)
@@ -496,3 +496,12 @@ static int __init early_phyp_dump_enabled(char *p)
 }
 early_param("phyp_dump", early_phyp_dump_enabled);
 
+/* Look for phyp_dump_reserve_size= cmdline option */
+static int __init early_phyp_dump_reserve_size(char *p)
+{
+        if (p)
+               phyp_dump_info->reserve_bootvar = memparse(p, &p);
+
+        return 0;
+}
+early_param("phyp_dump_reserve_size", early_phyp_dump_reserve_size);
index 209a98913d9db061743a559354eb7e0c75e0b4f7..fa74c6c3e10601a1b9de9115eef10a25f46a3bd0 100644 (file)
@@ -24,8 +24,10 @@ struct phyp_dump {
        /* Memory that is reserved during very early boot. */
        unsigned long init_reserve_start;
        unsigned long init_reserve_size;
-       /* Check status during boot if dump supported, active & present*/
+       /* cmd line options during boot */
+       unsigned long reserve_bootvar;
        unsigned long phyp_dump_at_boot;
+       /* Check status during boot if dump supported, active & present*/
        unsigned long phyp_dump_configured;
        unsigned long phyp_dump_is_active;
        /* store cpu & hpte size */