[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: Allow setting the number of CPUs to activate at runtime
Hi Julien, On 23.05.2022 12:05, Julien Grall wrote: > Hi, > > On 23/05/2022 10:13, Michal Orzel wrote: >> Introduce a command line parameter "maxcpus" on Arm to allow adjusting >> the number of CPUs to activate. > > The current definition "maxcpus" is not really suitable for big.LITTLE > systems as you have no flexibility to say how many types of each cores you > want to boot. > > Instead, Xen will pick-up the first CPUs it parsed from the firmware tables. > > > So what's your use-case/target? > - use cases where we have no big little (although even on big.LITTLE limiting this number makes sense if we do not care about the types) - debug cases where we want to set maxcpus=1 >> Currently the limit is defined by the >> config option CONFIG_NR_CPUS. Such parameter already exists on x86. >> >> Define a parameter "maxcpus" and a corresponding static variable >> max_cpus in Arm smpboot.c. Modify function smp_get_max_cpus to take >> max_cpus as a limit and to return proper unsigned int instead of int. >> >> Take the opportunity to remove redundant variable cpus from start_xen >> function and to directly assign the return value from smp_get_max_cpus >> to nr_cpu_ids (global variable in Xen used to store the number of CPUs >> actually activated). >> >> Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx> >> --- >> max_cpus is also defined in x86 setup.c. It would be possible to join >> these definitions in xen/common/cpu.c. However in that case, max_cpus >> would become global which is not really what we want. > > If we move the global variable, then I would also expect to move the parsing > parsing (i.e. smp_get_max_cpus()). So why would max_cpus end up to be global? > Is it because the x86 would continue to use it? > Yes, that would involve more x86 modifications that actual Arm coding. That is why I wanted to avoid it. >> There is already >> global nr_cpu_ids used everywhere and max_cpus being used only in x86 >> start_xen and Arm smp_get_max_cpus should be kept local. Also there are >> already lots of places in Xen using max_cpus (local versions) and that >> would start to be hard to read (variable shadowing). > > We should avoid variable shadowing. > >> --- >> docs/misc/xen-command-line.pandoc | 2 +- >> xen/arch/arm/include/asm/smp.h | 2 +- >> xen/arch/arm/setup.c | 10 ++++------ >> xen/arch/arm/smpboot.c | 18 ++++++++++++------ >> 4 files changed, 18 insertions(+), 14 deletions(-) > > The patch looks ok to me (see one coding style comment below). I haven't > acked it because I am waiting to get more input on your use-cases. > > > [...] > >> diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c >> index 9bb32a301a..22fede6600 100644 >> --- a/xen/arch/arm/smpboot.c >> +++ b/xen/arch/arm/smpboot.c >> @@ -43,6 +43,10 @@ cpumask_t cpu_possible_map; >> struct cpuinfo_arm cpu_data[NR_CPUS]; >> +/* maxcpus: maximum number of CPUs to activate. */ >> +static unsigned int __initdata max_cpus; >> +integer_param("maxcpus", max_cpus); >> + >> /* CPU logical map: map xen cpuid to an MPIDR */ >> register_t __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = >> MPIDR_INVALID }; >> @@ -277,16 +281,18 @@ void __init smp_init_cpus(void) >> "unless the cpu affinity of all domains is >> specified.\n"); >> } >> -int __init >> -smp_get_max_cpus (void) >> +unsigned int __init smp_get_max_cpus(void) >> { >> - int i, max_cpus = 0; >> + unsigned int i, cpus = 0; >> + >> + if ( ( !max_cpus ) || ( max_cpus > nr_cpu_ids ) ) > > Coding style: We don't add space in the inner parentheses. I.e: Noted, thanks. > > if ( (!max_cpus) || (max_cpus > nr_cpu_ids) ) > >> + max_cpus = nr_cpu_ids; >> - for ( i = 0; i < nr_cpu_ids; i++ ) >> + for ( i = 0; i < max_cpus; i++ ) >> if ( cpu_possible(i) ) >> - max_cpus++; >> + cpus++; >> - return max_cpus; >> + return cpus; >> } >> void __init > Cheers, Michal
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |