xen/x86: support setting dom0_mem depending on host size
v3 cover xen/x86: support setting dom0_mem depending on host size
Setting the memory size of dom0 on a server for the non autoballooning case requires always specification of a boot parameter today. The value to set will depend mostly on the host memory size.
In order to support that scenario add the possibility to set dom0_mem depending on the amount of physical memory by allowing to specify a percentage of host memory (e.g. 10%) with an offset (like 1G+10%).
To make it easy for a distributor to use such a setting as the default make the standard setting for dom0_mem configurable via Kconfig.
Changes since V2:
- patch 1: let parse_size_and_unit() accept '%' instead of adding a new parsing function for that (Jan Beulich)
- patch 2: make dom0mem parsing function more robust against parameter format errors (Jan Beulich)
Changes since V1:
- replaced old patch 1 by new one
- rewritten patch 2 according to remarks by Jan Beulich
- changed patch 3 to allow config item on arm, too
Juergen Gross (3):
xen: modify parse_size_and_unit() to support percentage xen/x86: add dom0 memory sizing variants
xen: add CONFIG item for default dom0 memory size
docs/misc/xen-command-line.markdown | 19 ++++-- xen/arch/arm/domain_build.c | 7 +++ xen/arch/x86/dom0_build.c | 118 ++++++++++++++++++++++++++++-------- xen/common/Kconfig | 13 ++++ xen/common/lib.c | 4 ++ 5 files changed, 129 insertions(+), 32 deletions(-)
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
PATCH v3 1/3 xen: modify parse_size_and_unit() to support percentage
Modify parse_size_and_unit() to support a value followed by a '%' character. In this case ps is required to be non-NULL to ensure the caller can detect that case. The returned value will be the integer value s was pointing to and *ps will point to the '%' character.
--- xen/common/lib.c | 4 ++++ 1 file changed, 4 insertions(+)
xen/common/lib.c +4 -0
@@ -476,6 +476,10 @@ unsigned long long parse_size_and_unit(const char *s, const char **ps)case 'B' :case 'b' : s1++;break ; +case '%' : +if ( ps ) +break ; +/* fallthrough */ default : ret <<=10 ;/* default to kB */ break ;
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 1/3] xen: modify parse_size_and_unit() to support percentage
Quoted 7 lines
Quoted 1 line
Quoted 1 line · On 10.12.18 at 12:44, <[email protected]> wrote:
Modify
parse_size_and_unit()to support a value followed by a '%' character. In this case ps is required to be non-NULL to ensure the caller can detect that case. The returned value will be the integer value s was pointing to and *ps will point to the '%' character.Signed-off-by Juergen Gross <[email protected]>
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
PATCH v3 2/3 xen/x86: add dom0 memory sizing variants
In reply to Juergen GrossToday the memory size of dom0 can be specified only in terms of bytes (either an absolute value or "host-mem - value"). When dom0 shouldn't be auto-ballooned this requires nearly always a manual adaption of the Xen boot parameters to reflect the actual host memory size.
Add more possibilities to specify memory sizes. Today we have:
dom0_mem= List of ( min:<size> | max:<size> | <size> )
with <size> being a positive or negative size value (e.g. 1G).
Modify that to:
dom0_mem= List of ( min:<sz> | max:<sz> | <sz> )
<sz>: <size> | [<size>+]<frac>%
<frac>: integer value < 100
With the following semantics:
<frac>% specifies a fraction of host memory size in percent. <sz> is a percentage of host memory plus an offset.
So <sz> being 1G+25% on a 256G host would result in 65G.
--- docs/misc/xen-command-line.markdown | 19 ++++-- xen/arch/x86/dom0_build.c | 112 +++++++++++++++++++++++++++--------- 2 files changed, 99 insertions(+), 32 deletions(-)
docs/misc/xen-command-line.markdown +13 -6
@@ -725,17 +725,17 @@ Set the amount of memory for the initial domain (dom0). It must be greater than zero. This parameter is required. ### dom0\_mem (x86) -> `= List of ( min:<size> | max:<size> | <size> )` +> `= List of ( min:<sz> | max:<sz> | <sz> )` Set the amount of memory for the initial domain (dom0). If a size is positive, it represents an absolute value. If a size is negative, it is subtracted from the total available memory. -* `<size>` specifies the exact amount of memory. -* `min:<size>` specifies the minimum amount of memory. -* `max:<size>` specifies the maximum amount of memory. +* `<sz>` specifies the exact amount of memory. +* `min:<sz>` specifies the minimum amount of memory. +* `max:<sz>` specifies the maximum amount of memory. -If `<size>` is not specified, the default is all the available memory +If `<sz>` is not specified, the default is all the available memory minus some reserve. The reserve is 1/16 of the available memory or 128 MB (whichever is smaller).
@@ -743,13 +743,20 @@ The amount of memory will be at least the minimum but never more than the maximum (i.e., `max` overrides the `min` option). If there isn't enough memory then as much as possible is allocated. -`max:<size>` also sets the maximum reservation (the maximum amount of +`max:<sz>` also sets the maximum reservation (the maximum amount of memory dom0 can balloon up to). If this is omitted then the maximum reservation is unlimited. For example, to set dom0's initial memory allocation to 512MB but allow it to balloon up as far as 1GB use `dom0_mem=512M,max:1G` +> `<sz>` is: `<size> | [<size>+]<frac>%` +> `<frac>` is an integer < 100 + +* `<frac>` specifies a fraction of host memory size in percent. + +So `<sz>` being `1G+25%` on a 256 GB host would result in 65 GB. + If you use this option then it is highly recommended that you disable any dom0 autoballooning feature present in your toolstack. See the _xl.conf(5)_ man page or [Xen Best
xen/arch/x86/dom0_build.c +86 -26
174 lines not on this page · raw message
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 2/3] xen/x86: add dom0 memory sizing variants
Quoted 18 lines
Quoted 1 line
Quoted 1 line · On 10.12.18 at 12:44, <[email protected]> wrote:
Today the memory size of dom0 can be specified only in terms of bytes (either an absolute value or "host-mem - value"). When dom0 shouldn't be auto-ballooned this requires nearly always a manual adaption of the Xen boot parameters to reflect the actual host memory size.
Add more possibilities to specify memory sizes. Today we have:
dom0_mem= List of ( min:<size> | max:<size> | <size> )
with <size> being a positive or negative size value (e.g. 1G).
Modify that to:
dom0_mem= List of ( min:<sz> | max:<sz> | <sz> )
<sz>: <size> | [<size>+]<frac>%
<frac>: integer value < 100
Quoted 8 lines
With the following semantics:
<frac>% specifies a fraction of host memory size in percent. <sz> is a percentage of host memory plus an offset.
So <sz> being 1G+25% on a 256G host would result in 65G.
Signed-off-by Juergen Gross <[email protected]>
Once again
yet once again with a remark:
Quoted 17 lines
xen/arch/x86/dom0_build.c +13
-3-static long __init parse_amt (const char *s,const char **ps) +static int __init parse_amt (const char *s,const char **ps,struct memsize *sz) { -long pages =parse_size_and_unit ((*s =='-' ) ? s+1 : s, ps) >>PAGE_SHIFT ; -return (*s =='-' ) ? -pages : pages; +unsigned long val; +struct memsize tmp = { }; +unsigned int items =0 ; + + tmp.minus = (*s =='-' ); +if ( tmp.minus ) + s++; + + do + { + if ( !isdigit(*s) ) + return -EINVAL;
xen/arch/x86/dom0_build.c static long __initdata dom0_max_nrpages = LONG_MAX; · line 95
Quoted 10 lines
xen/arch/x86/dom0_build.c +10
-0+ + val =parse_size_and_unit (s, ps); + s = *ps; +if ( *s =='%' ) + { +if ( val >=100 ) +return -EINVAL ; + tmp.percent = val; + s++; + items++;/* No other item allowed. */
Isn't this unnecessary with ...
xen/arch/x86/dom0_build.c static long __initdata dom0_max_nrpages = LONG_MAX; · line 104
Quoted 9 lines
xen/arch/x86/dom0_build.c +9
-0+ } +else + { +/* <size> item must be first one. */ +if ( items ) +return -EINVAL ; + tmp.nr_pages = val >>PAGE_SHIFT ; + } + items++;
... this? However, allowing <frac>%+<size> would apparently have been easy (and add further flexibility).
Jan
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v3 2/3] xen/x86: add dom0 memory sizing variants
Quoted 71 lines · Jan Beulich
Quoted 18 lines
Quoted 1 line
Quoted 1 line · On 10.12.18 at 12:44, <[email protected]> wrote:
Today the memory size of dom0 can be specified only in terms of bytes (either an absolute value or "host-mem - value"). When dom0 shouldn't be auto-ballooned this requires nearly always a manual adaption of the Xen boot parameters to reflect the actual host memory size.
Add more possibilities to specify memory sizes. Today we have:
dom0_mem= List of ( min:<size> | max:<size> | <size> )
with <size> being a positive or negative size value (e.g. 1G).
Modify that to:
dom0_mem= List of ( min:<sz> | max:<sz> | <sz> )
<sz>: <size> | [<size>+]<frac>%
<frac>: integer value < 100Quoted 8 lines
With the following semantics:
<frac>% specifies a fraction of host memory size in percent. <sz> is a percentage of host memory plus an offset.
So <sz> being 1G+25% on a 256G host would result in 65G.
Signed-off-by Juergen Gross <[email protected]>Once again
Reviewed-by Jan Beulich <[email protected]>yet once again with a remark:
Quoted 17 lines
xen/arch/x86/dom0_build.c +13
-3-static long __init parse_amt (const char *s,const char **ps) +static int __init parse_amt (const char *s,const char **ps,struct memsize *sz) { -long pages =parse_size_and_unit ((*s =='-' ) ? s+1 : s, ps) >>PAGE_SHIFT ; -return (*s =='-' ) ? -pages : pages; +unsigned long val; +struct memsize tmp = { }; +unsigned int items =0 ; + + tmp.minus = (*s =='-' ); +if ( tmp.minus ) + s++; + + do + { + if ( !isdigit(*s) ) + return -EINVAL;xen/arch/x86/dom0_build.c static long __initdata dom0_max_nrpages = LONG_MAX; · line 95
Quoted 10 lines
xen/arch/x86/dom0_build.c +10
-0+ + val =parse_size_and_unit (s, ps); + s = *ps; +if ( *s =='%' ) + { +if ( val >=100 ) +return -EINVAL ; + tmp.percent = val; + s++; + items++;/* No other item allowed. */ Isn't this unnecessary with ...
xen/arch/x86/dom0_build.c static long __initdata dom0_max_nrpages = LONG_MAX; · line 104
Quoted 9 lines
xen/arch/x86/dom0_build.c +9
-0+ } +else + { +/* <size> item must be first one. */ +if ( items ) +return -EINVAL ; + tmp.nr_pages = val >>PAGE_SHIFT ; + } + items++;
Quoted 2 lines
... this? However, allowing <frac>%+<size> would apparently have been easy (and add further flexibility).
That would require two booleans instead. Otherwise <frac>%+<frac>% wouldn't be rejected. In case anyone else thinks this would be better I can change it, of course.
Juergen
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
PATCH v3 3/3 xen: add CONFIG item for default dom0 memory size
In reply to Juergen GrossWith being able to specify a dom0_mem value depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding a CONFIG_DOM0_MEM item which presets the dom0_mem boot parameter value.
It will be used only if no dom0_mem parameter was specified in the boot parameters.
--- xen/arch/arm/domain_build.c | 7 +++++++ xen/arch/x86/dom0_build.c | 6 ++++++ xen/common/Kconfig | 13 +++++++++++++ 3 files changed, 26 insertions(+)
xen/arch/arm/domain_build.c +7 -0
@@ -32,9 +32,12 @@ static unsigned int __initdata opt_dom0_max_vcpus;integer_param ("dom0_max_vcpus" , opt_dom0_max_vcpus);static u64 __initdata dom0_mem; +static bool __initdata dom0_mem_set;static int __init parse_dom0_mem (const char *s) { + dom0_mem_set = true; + dom0_mem =parse_size_and_unit (s, &s);return *s ? -EINVAL :0 ;
@@ -2114,6 +2117,10 @@ int __init construct_dom0(struct domain *d)BUG_ON (d->domain_id !=0 );printk ("*** LOADING DOMAIN 0 ***\n" ); + +if ( !dom0_mem_set &&CONFIG_DOM0_MEM [0 ] ) +parse_dom0_mem (CONFIG_DOM0_MEM ); +if ( dom0_mem <=0 ) {warning_add ("PLEASE SPECIFY dom0_mem PARAMETER - USING 512M FOR NOW\n" );
xen/arch/x86/dom0_build.c +6 -0
@@ -29,6 +29,7 @@ struct memsize {static struct memsize __initdata dom0_size;static struct memsize __initdata dom0_min_size;static struct memsize __initdata dom0_max_size = { .nr_pages =LONG_MAX }; +static bool __initdata dom0_mem_set;static bool __init memsize_gt_zero (const struct memsize *sz) {
@@ -117,6 +118,8 @@ static int __init parse_dom0_mem(const char *s) {int ret; + dom0_mem_set = true; +/* xen-shim uses shim_mem parameter instead of dom0_mem */ if ( pv_shim ) {
@@ -339,6 +342,9 @@ unsigned long __init dom0_compute_nr_pages(unsigned long avail =0 , nr_pages, min_pages, max_pages;bool need_paging; +if ( !dom0_mem_set &&CONFIG_DOM0_MEM [0 ] ) +parse_dom0_mem (CONFIG_DOM0_MEM ); +for_each_node_mask ( node, dom0_nodes ) avail += avail_domheap_pages_region(node, 0, 0) +initial_images_nrpages (node);
xen/common/Kconfig +13 -0
@@ -323,4 +323,17 @@ config CMDLINE_OVERRIDE This is used to work around broken bootloaders. This should be set to 'N' under normal conditions. + +config DOM0_MEM + string "Default value for dom0_mem boot parameter" + default "" + ---help--- + Sets a default value for dom0_mem, e.g. "512M". + The specified string will be used for the dom0_mem parameter in + case it was not specified on the command line. + + See docs/misc/xen-command-line.markdown for the supported syntax. + + Leave empty if you are not sure what to specify. + endmenu
Signature · 7 lines
2.16.4 _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 3/3] xen: add CONFIG item for default dom0 memory size
Hi Juergen,
Quoted 10 lines · Juergen Gross
With being able to specify a
dom0_memvalue depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding aCONFIG_DOM0_MEMitem which presets thedom0_memboot parameter value.It will be used only if no
dom0_memparameter was specified in the boot parameters.Signed-off-by Juergen Gross <[email protected]>Reviewed-by Jan Beulich <[email protected]>
It looks like the rest of the series has been merged. So I will commit that one as all the tags required should be there.
Cheers,
Signature · 6 lines
Julien Grall _______________________________________________ Xen-devel mailing list [email protected] https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 3/3] xen: add CONFIG item for default dom0 memory size
In reply to Juergen GrossQuoted 10 lines · Juergen Gross
With being able to specify a
dom0_memvalue depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding aCONFIG_DOM0_MEMitem which presets thedom0_memboot parameter value.It will be used only if no
dom0_memparameter was specified in the boot parameters.Signed-off-by Juergen Gross <[email protected]>Reviewed-by Jan Beulich <[email protected]>
Why was this patch accepted? We've already got a suitable Kconfig option for this, CONFIG_CMDLINE.
~Andrew
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 3/3] xen: add CONFIG item for default dom0 memory size
Quoted 6 lines · Andrew Cooper
Quoted 5 lines · Juergen Gross
With being able to specify a
dom0_memvalue depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding aCONFIG_DOM0_MEMitem which presets thedom0_memboot parameter value.
Quoted 8 lines
Quoted 5 lines
It will be used only if no
dom0_memparameter was specified in the boot parameters.Signed-off-by Juergen Gross <[email protected]>Reviewed-by Jan Beulich <[email protected]>Why was this patch accepted? We've already got a suitable
Kconfigoption for this,CONFIG_CMDLINE.
Why do we have a config option for the default scheduler?
And something like:
dom0_mem=max:8G dom0_mem=10%
is different from
CONFIG_DOM0_MEM="max:8G" plus dom0_mem=10%
on a host with say 100G of memory: In the first case this would be 8G, in the second case 10G.
Juergen
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 3/3] xen: add CONFIG item for default dom0 memory size
Quoted 7 lines · Juergen Gross
Quoted 6 lines · Andrew Cooper
Quoted 5 lines · Juergen Gross
With being able to specify a
dom0_memvalue depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding aCONFIG_DOM0_MEMitem which presets thedom0_memboot parameter value.
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines
It will be used only if no
dom0_memparameter was specified in the boot parameters.Signed-off-by Juergen Gross <[email protected]>Reviewed-by Jan Beulich <[email protected]>Why was this patch accepted? We've already got a suitable
Kconfigoption for this,CONFIG_CMDLINE.Why do we have a config option for the default scheduler?
That pre-dates CONFIG_CMDLINE, but is of dubious use.
Quoted 11 lines
And something like:
dom0_mem=max:8G dom0_mem=10%
is different from
CONFIG_DOM0_MEM="max:8G" plus dom0_mem=10%on a host with say 100G of memory: In the first case this would be 8G, in the second case 10G.
And? There is no way of preventing that.
A user can really put two dom0_mem= on the real command line, and could put a dom0_mem in CONFIG_CMDLINE.
The only solution to this problem is for the final dom0_mem= to be a full specification, and I still see no use for CONFIG_DOM0_MEM
~Andrew
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Re: [PATCH v3 3/3] xen: add CONFIG item for default dom0 memory size
Quoted 11 lines · Andrew Cooper
Quoted 10 lines · Juergen Gross
Quoted 9 lines · Andrew Cooper
Quoted 8 lines · Juergen Gross
With being able to specify a
dom0_memvalue depending on host memory size on x86 make it easy for distros to specify a default dom0 size by adding aCONFIG_DOM0_MEMitem which presets thedom0_memboot parameter value.It will be used only if no
dom0_memparameter was specified in the boot parameters.
Quoted 7 lines
Quoted 5 lines
Quoted 4 lines
Quoted 2 lines
Signed-off-by Juergen Gross <[email protected]>Reviewed-by Jan Beulich <[email protected]>Why was this patch accepted? We've already got a suitable
Kconfigoption for this,CONFIG_CMDLINE.Why do we have a config option for the default scheduler?
That pre-dates
CONFIG_CMDLINE, but is of dubious use.
I don't agree with you here. I think this is a very sensible choice.
Quoted 6 lines
Quoted 6 lines
And something like:
dom0_mem=max:8G dom0_mem=10%
Quoted 8 lines
Quoted 6 lines
is different from
CONFIG_DOM0_MEM="max:8G" plus dom0_mem=10%on a host with say 100G of memory: In the first case this would be 8G, in the second case 10G.
And? There is no way of preventing that.
I wanted to say: using CONFIG_DOM0_MEM and CONFIG_CMDLINE are different. The former is evaluated only if the user doesn't specify dom0_mem as a parameter, while the latter _is_ cumulative.
The advantage of CONFIG_DOM0_MEM is that is really only the default, not an additional setting the user has to take into acount.
Quoted 2 lines
A user can really put two dom0_mem= on the real command line, and could put a
dom0_meminCONFIG_CMDLINE.
Right, and then he'd have three cumulative settings.
Quoted 2 lines
The only solution to this problem is for the final dom0_mem= to be a full specification, and I still see no use for
CONFIG_DOM0_MEM
So a user specifying dom0_mem in a 4.11 setup would eventually need to modify his setting. With CONFIG_DOM0_MEM he doesn't have to do that.
Additionally CONFIG_CMDLINE is available in expert mode only, while CONFIG_DOM0_MEM can be set more easily.
Juergen
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel