[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [XEN] Extend dom0_mem syntax to support min/max clamps.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 444496ecb14e79f69fac012b4dc19613ad5f7c06
# Parent  9b553a9787cf109d9aaeb8857f7608f4472b5b86
[XEN] Extend dom0_mem syntax to support min/max clamps.

dom0_mem=[min:<min_amt>,][max:<max_amt>,][<amt>]

<min_amt>: The minimum amount of memory which should be allocated for dom0.
<max_amt>: The maximum amount of memory which should be allocated for dom0.
<amt>:     The precise amount of memory to allocate for dom0.

Notes:
 1. <amt> is clamped from below by <min_amt> and from above by available
    memory and <max_amt>
 2. <min_amt> is clamped from above by available memory and <max_amt>
 3. <min_amt> is ignored if it is greater than <max_amt>
 4. If <amt> is not specified, it is calculated as follows:
    "All of memory is allocated to domain 0, minus 1/16th which is reserved
     for uses such as DMA buffers (the reservation is clamped to 128MB)."

Each value can be specified as positive or negative:
 If +ve: The specified amount is an absolute value.
 If -ve: The specified amount is subtracted from total available memory.

Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 docs/src/user.tex               |   17 +++++-
 xen/arch/ia64/xen/domain.c      |    2 
 xen/arch/powerpc/domain_build.c |    2 
 xen/arch/x86/domain_build.c     |  100 +++++++++++++++++++++++++---------------
 xen/arch/x86/e820.c             |    2 
 xen/common/lib.c                |   17 ++++--
 xen/common/page_alloc.c         |    2 
 xen/include/xen/lib.h           |    2 
 8 files changed, 94 insertions(+), 50 deletions(-)

diff -r 9b553a9787cf -r 444496ecb14e docs/src/user.tex
--- a/docs/src/user.tex Wed Nov 01 10:41:44 2006 +0000
+++ b/docs/src/user.tex Wed Nov 01 11:18:29 2006 +0000
@@ -3202,12 +3202,21 @@ editing \path{grub.conf}.
   ignored. This parameter may be specified with a B, K, M or G suffix,
   representing bytes, kilobytes, megabytes and gigabytes respectively.
   The default unit, if no suffix is specified, is kilobytes.
-\item [ dom0\_mem=xxx ] Set the amount of memory to be allocated to
-  domain0. In Xen 3.x the parameter may be specified with a B, K, M or
+\item [ dom0\_mem=$<$specifier list$>$ ] Set the amount of memory to
+  be allocated to domain 0. This is a comma-separated list containing
+  the following optional components:
+  \begin{description}
+  \item[ min:$<$min\_amt$>$ ] Minimum amount to allocate to domain 0
+  \item[ max:$<$min\_amt$>$ ] Maximum amount to allocate to domain 0
+  \item[ $<$amt$>$ ] Precise amount to allocate to domain 0
+  \end{description}
+  Each numeric parameter may be specified with a B, K, M or
   G suffix, representing bytes, kilobytes, megabytes and gigabytes
   respectively; if no suffix is specified, the parameter defaults to
-  kilobytes. In previous versions of Xen, suffixes were not supported
-  and the value is always interpreted as kilobytes.
+  kilobytes. Negative values are subtracted from total available
+  memory. If $<$amt$>$ is not specified, it defaults to all available
+  memory less a small amount (clamped to 128MB) for uses such as DMA
+  buffers.
 \item [ dom0\_vcpus\_pin ] Pins domain 0 VCPUs on their respective
   physical CPUS (default=false).
 \item [ tbuf\_size=xxx ] Set the size of the per-cpu trace buffers, in
diff -r 9b553a9787cf -r 444496ecb14e xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/arch/ia64/xen/domain.c        Wed Nov 01 11:18:29 2006 +0000
@@ -1177,6 +1177,6 @@ void sync_vcpu_execstate(struct vcpu *v)
 
 static void parse_dom0_mem(char *s)
 {
-       dom0_size = parse_size_and_unit(s);
+       dom0_size = parse_size_and_unit(s, NULL);
 }
 custom_param("dom0_mem", parse_dom0_mem);
diff -r 9b553a9787cf -r 444496ecb14e xen/arch/powerpc/domain_build.c
--- a/xen/arch/powerpc/domain_build.c   Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/arch/powerpc/domain_build.c   Wed Nov 01 11:18:29 2006 +0000
@@ -40,7 +40,7 @@ static void parse_dom0_mem(char *s)
 {
     unsigned long long bytes;
 
-    bytes = parse_size_and_unit(s);
+    bytes = parse_size_and_unit(s, NULL);
     dom0_nrpages = bytes >> PAGE_SHIFT;
 }
 custom_param("dom0_mem", parse_dom0_mem);
diff -r 9b553a9787cf -r 444496ecb14e xen/arch/x86/domain_build.c
--- a/xen/arch/x86/domain_build.c       Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/arch/x86/domain_build.c       Wed Nov 01 11:18:29 2006 +0000
@@ -33,28 +33,45 @@ extern unsigned long initial_images_nrpa
 extern unsigned long initial_images_nrpages(void);
 extern void discard_initial_images(void);
 
-static long dom0_nrpages;
+static long dom0_nrpages, dom0_min_nrpages, dom0_max_nrpages = LONG_MAX;
 
 /*
- * dom0_mem:
- *  If +ve:
- *   * The specified amount of memory is allocated to domain 0.
- *  If -ve:
- *   * All of memory is allocated to domain 0, minus the specified amount.
- *  If not specified: 
- *   * All of memory is allocated to domain 0, minus 1/16th which is reserved
- *     for uses such as DMA buffers (the reservation is clamped to 128MB).
+ * dom0_mem=[min:<min_amt>,][max:<max_amt>,][<amt>]
+ * 
+ * <min_amt>: The minimum amount of memory which should be allocated for dom0.
+ * <max_amt>: The maximum amount of memory which should be allocated for dom0.
+ * <amt>:     The precise amount of memory to allocate for dom0.
+ * 
+ * Notes:
+ *  1. <amt> is clamped from below by <min_amt> and from above by available
+ *     memory and <max_amt>
+ *  2. <min_amt> is clamped from above by available memory and <max_amt>
+ *  3. <min_amt> is ignored if it is greater than <max_amt>
+ *  4. If <amt> is not specified, it is calculated as follows:
+ *     "All of memory is allocated to domain 0, minus 1/16th which is reserved
+ *      for uses such as DMA buffers (the reservation is clamped to 128MB)."
+ * 
+ * Each value can be specified as positive or negative:
+ *  If +ve: The specified amount is an absolute value.
+ *  If -ve: The specified amount is subtracted from total available memory.
  */
+static long parse_amt(char *s, char **ps)
+{
+    long pages = parse_size_and_unit((*s == '-') ? s+1 : s, ps) >> PAGE_SHIFT;
+    return (*s == '-') ? -pages : pages;
+}
 static void parse_dom0_mem(char *s)
 {
-    unsigned long long bytes;
-    char *t = s;
-    if ( *s == '-' )
-        t++;
-    bytes = parse_size_and_unit(t);
-    dom0_nrpages = bytes >> PAGE_SHIFT;
-    if ( *s == '-' )
-        dom0_nrpages = -dom0_nrpages;
+    do {
+        if ( !strncmp(s, "min:", 4) )
+            dom0_min_nrpages = parse_amt(s+4, &s);
+        else if ( !strncmp(s, "max:", 4) )
+            dom0_max_nrpages = parse_amt(s+4, &s);
+        else
+            dom0_nrpages = parse_amt(s, &s);
+        if ( *s != ',' )
+            break;
+    } while ( *s++ == ',' );
 }
 custom_param("dom0_mem", parse_dom0_mem);
 
@@ -101,6 +118,35 @@ static struct page_info *alloc_chunk(str
         if ( order-- == 0 )
             break;
     return page;
+}
+
+static unsigned long compute_dom0_nr_pages(void)
+{
+    unsigned long avail = avail_domheap_pages() + initial_images_nrpages();
+
+    /*
+     * If domain 0 allocation isn't specified, reserve 1/16th of available
+     * memory for things like DMA buffers. This reservation is clamped to 
+     * a maximum of 128MB.
+     */
+    if ( dom0_nrpages == 0 )
+    {
+        dom0_nrpages = avail;
+        dom0_nrpages = min(dom0_nrpages / 16, 128L << (20 - PAGE_SHIFT));
+        dom0_nrpages = -dom0_nrpages;
+    }
+
+    /* Negative memory specification means "all memory - specified amount". */
+    if ( dom0_nrpages     < 0 ) dom0_nrpages     += avail;
+    if ( dom0_min_nrpages < 0 ) dom0_min_nrpages += avail;
+    if ( dom0_max_nrpages < 0 ) dom0_max_nrpages += avail;
+
+    /* Clamp dom0 memory according to min/max limits and available memory. */
+    dom0_nrpages = max(dom0_nrpages, dom0_min_nrpages);
+    dom0_nrpages = min(dom0_nrpages, dom0_max_nrpages);
+    dom0_nrpages = min(dom0_nrpages, (long)avail);
+
+    return dom0_nrpages;
 }
 
 static void process_dom0_ioports_disable(void)
@@ -269,25 +315,7 @@ int construct_dom0(struct domain *d,
 
     d->max_pages = ~0U;
 
-    /*
-     * If domain 0 allocation isn't specified, reserve 1/16th of available
-     * memory for things like DMA buffers. This reservation is clamped to 
-     * a maximum of 128MB.
-     */
-    if ( dom0_nrpages == 0 )
-    {
-        dom0_nrpages = avail_domheap_pages() + initial_images_nrpages();
-        dom0_nrpages = min(dom0_nrpages / 16, 128L << (20 - PAGE_SHIFT));
-        dom0_nrpages = -dom0_nrpages;
-    }
-
-    /* Negative memory specification means "all memory - specified amount". */
-    if ( dom0_nrpages < 0 )
-        nr_pages = avail_domheap_pages() + initial_images_nrpages() +
-            dom0_nrpages;
-    else
-        nr_pages = min(avail_domheap_pages() + initial_images_nrpages(),
-                       (unsigned long)dom0_nrpages);
+    nr_pages = compute_dom0_nr_pages();
 
     if ( (rc = parseelfimage(&dsi)) != 0 )
         return rc;
diff -r 9b553a9787cf -r 444496ecb14e xen/arch/x86/e820.c
--- a/xen/arch/x86/e820.c       Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/arch/x86/e820.c       Wed Nov 01 11:18:29 2006 +0000
@@ -6,7 +6,7 @@
 
 /* opt_mem: Limit of physical RAM. Any RAM beyond this point is ignored. */
 unsigned long long opt_mem;
-static void parse_mem(char *s) { opt_mem = parse_size_and_unit(s); }
+static void parse_mem(char *s) { opt_mem = parse_size_and_unit(s, NULL); }
 custom_param("mem", parse_mem);
 
 struct e820map e820;
diff -r 9b553a9787cf -r 444496ecb14e xen/common/lib.c
--- a/xen/common/lib.c  Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/common/lib.c  Wed Nov 01 11:18:29 2006 +0000
@@ -439,20 +439,27 @@ s64 __moddi3(s64 a, s64 b)
 
 #endif /* BITS_PER_LONG == 32 */
 
-unsigned long long parse_size_and_unit(char *s)
-{
-       unsigned long long ret = simple_strtoull(s, &s, 0);
+unsigned long long parse_size_and_unit(const char *s, char **ps)
+{
+       unsigned long long ret = simple_strtoull(s, (char **)&s, 0);
 
        switch (*s) {
        case 'G': case 'g':
                ret <<= 10;
        case 'M': case 'm':
                ret <<= 10;
-       case 'K': case 'k': default:
+       case 'K': case 'k':
                ret <<= 10;
        case 'B': case 'b':
+               s++;
                break;
-       }
+       default:
+               ret <<= 10; /* default to kB */
+               break;
+       }
+
+       if (ps != NULL)
+               *ps = (char *)s;
 
        return ret;
 }
diff -r 9b553a9787cf -r 444496ecb14e xen/common/page_alloc.c
--- a/xen/common/page_alloc.c   Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/common/page_alloc.c   Wed Nov 01 11:18:29 2006 +0000
@@ -54,7 +54,7 @@ static void parse_lowmem_emergency_pool(
 static void parse_lowmem_emergency_pool(char *s)
 {
     unsigned long long bytes;
-    bytes = parse_size_and_unit(s);
+    bytes = parse_size_and_unit(s, NULL);
     lowmem_emergency_pool_pages = bytes >> PAGE_SHIFT;
 }
 custom_param("lowmem_emergency_pool", parse_lowmem_emergency_pool);
diff -r 9b553a9787cf -r 444496ecb14e xen/include/xen/lib.h
--- a/xen/include/xen/lib.h     Wed Nov 01 10:41:44 2006 +0000
+++ b/xen/include/xen/lib.h     Wed Nov 01 11:18:29 2006 +0000
@@ -86,7 +86,7 @@ unsigned long long simple_strtoull(
 unsigned long long simple_strtoull(
     const char *cp,char **endp, unsigned int base);
 
-unsigned long long parse_size_and_unit(char *s);
+unsigned long long parse_size_and_unit(const char *s, char **ps);
 
 #define TAINT_UNSAFE_SMP                (1<<0)
 #define TAINT_MACHINE_CHECK             (1<<1)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.