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

Re: [Xen-devel] [PATCH] x86: make the dom0_max_vcpus option more flexible



>>> On 04.05.12 at 18:01, David Vrabel <david.vrabel@xxxxxxxxxx> wrote:
> From: David Vrabel <david.vrabel@xxxxxxxxxx>
> 
> 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":

Both "...max...=min:..." and "...max...=max:" look pretty odd to me;
how about simply allowing a range along with a simple number (since
negative values make no sense, omitting either side of the range would
be supportable if necessary.

>     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 <david.vrabel@xxxxxxxxxx>
> ---
>  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:
> +
>  > `= <integer>`
>  
> -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:<integer> | max:<integer> )`
> +
> +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)
>  > `= <size>`
> 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;

Enlarging the value after the MAX_VIRT_CPUS range check must
not be done. You probably simply want to move your addition up
two lines.

> +    if ( opt_dom0_max_vcpus_max < opt_dom0_max_vcpus )
> +        opt_dom0_max_vcpus = opt_dom0_max_vcpus_max;

But please avoid ...=max: (number lost for some reason) rendering
the box unbootable (I'd say a maximum of zero should be interpreted
as 1).

Jan

>  
>      dom0->vcpu = xzalloc_array(struct vcpu *, opt_dom0_max_vcpus);
>      if ( !dom0->vcpu )
> -- 
> 1.7.2.5



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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