[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |