From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Vrabel Subject: [PATCH] x86: make the dom0_max_vcpus option more flexible Date: Fri, 4 May 2012 17:01:41 +0100 Message-ID: <1336147301-12681-1-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xensource.com Cc: David Vrabel , Jan Beulich List-Id: xen-devel@lists.xenproject.org From: David Vrabel The dom0_max_vcpus command line option only allows the exact number of VCPUs for dom0 to be set. It is not possible to say "up to N VCPUs but no more than the number physically present." Add min: and max: prefixes to the option to set a minimum number of VCPUs, and a maximum which does not exceed the number of PCPUs. For example, with "dom0_max_vcpus=min:4,max:8": PCPUs Dom0 VCPUs 2 4 4 4 6 6 8 8 10 8 The existing behaviour of "dom0_max_vcpus=N" still works as before. Signed-off-by: David Vrabel --- docs/misc/xen-command-line.markdown | 29 +++++++++++++++++++++++++++-- xen/arch/x86/domain_build.c | 23 ++++++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index a6195f2..5f0c2cd 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -272,10 +272,35 @@ Specify the bit width of the DMA heap. ### dom0\_ioports\_disable ### dom0\_max\_vcpus + +Either: + > `= ` -Specify the maximum number of vcpus to give to dom0. This defaults -to the number of pcpus on the host. +The maximum number of VCPUs to give to dom0. This number of VCPUs can +be more than the number of PCPUs on the host. The default is the +number of PCPUs. + +Or: + +> `= List of ( min: | max: )` + +With the `min:` option dom0 will have at least this minimum number of +VCPUs (default: 1). This may be more than the number of PCPUs on the +host. + +With the `max:` option dom0 will have a VCPUs for each PCPUs but no +more than this maximum number (default: unlimited). + +For example, with `dom0_max_vcpus=min:4,max:8`: + + Number of + PCPUs | Dom0 VCPUs + 2 | 4 + 4 | 4 + 6 | 6 + 8 | 8 + 10 | 8 ### dom0\_mem (ia64) > `= ` diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index b3c5d4c..5407f8d 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -83,7 +83,24 @@ static void __init parse_dom0_mem(const char *s) custom_param("dom0_mem", parse_dom0_mem); static unsigned int __initdata opt_dom0_max_vcpus; -integer_param("dom0_max_vcpus", opt_dom0_max_vcpus); +static unsigned int __initdata opt_dom0_max_vcpus_min = 1; +static unsigned int __initdata opt_dom0_max_vcpus_max = UINT_MAX; + +static void __init parse_dom0_max_vcpus(const char *s) +{ + do { + if ( !strncmp(s, "min:", 4) ) + opt_dom0_max_vcpus_min = simple_strtoul(s+4, &s, 0); + else if ( !strncmp(s, "max:", 4) ) + opt_dom0_max_vcpus_max = simple_strtoul(s+4, &s, 0); + else + opt_dom0_max_vcpus = simple_strtoul(s, &s, 0); + if ( *s != ',' ) + break; + } while ( *s++ == ',' ); + +} +custom_param("dom0_max_vcpus", parse_dom0_max_vcpus); struct vcpu *__init alloc_dom0_vcpu0(void) { @@ -91,6 +108,10 @@ struct vcpu *__init alloc_dom0_vcpu0(void) opt_dom0_max_vcpus = num_cpupool_cpus(cpupool0); if ( opt_dom0_max_vcpus > MAX_VIRT_CPUS ) opt_dom0_max_vcpus = MAX_VIRT_CPUS; + if ( opt_dom0_max_vcpus_min > opt_dom0_max_vcpus ) + opt_dom0_max_vcpus = opt_dom0_max_vcpus_min; + if ( opt_dom0_max_vcpus_max < opt_dom0_max_vcpus ) + opt_dom0_max_vcpus = opt_dom0_max_vcpus_max; dom0->vcpu = xzalloc_array(struct vcpu *, opt_dom0_max_vcpus); if ( !dom0->vcpu ) -- 1.7.2.5