[RFC PATCH v0 1/1] powerpc/percpu: Use 2MB atom_size in percpu allocator on radix

Nicholas Piggin npiggin at gmail.com
Mon Jul 12 13:00:10 AEST 2021


Excerpts from Bharata B Rao's message of July 8, 2021 3:29 pm:
> The atom_size used by percpu allocator on powerpc is currently
> determined by mmu_linear_psize which is initialized to 4K and
> mmu_linear_psize is modified only by hash. Till now for radix
> the atom_size was defaulting to PAGE_SIZE(64K).

Looks like it was 1MB to me?

> Go for 2MB
> atom_size on radix if support for 2MB pages exist.
> 
> 2MB atom_size on radix will allow using PMD mappings in the
> vmalloc area if and when support for higher sized vmalloc
> mappings is enabled for the pecpu allocator. However right now

That would be nice.

> this change will result in more number of units to be allocated
> within one allocation due to increased upa(units per allocation).

In that case is there any reason to do it until then?

> 
> Signed-off-by: Bharata B Rao <bharata at linux.ibm.com>
> ---
>  arch/powerpc/kernel/setup_64.c | 34 +++++++++++++++++++++++++---------
>  1 file changed, 25 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
> index 1ff258f6c76c..45ce2d6e8112 100644
> --- a/arch/powerpc/kernel/setup_64.c
> +++ b/arch/powerpc/kernel/setup_64.c
> @@ -871,6 +871,30 @@ static void __init pcpu_populate_pte(unsigned long addr)
>  	      __func__, PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
>  }
>  
> +static size_t pcpu_atom_size(void)
> +{
> +	size_t atom_size = PAGE_SIZE;
> +
> +	/*
> +	 * Radix: Use PAGE_SIZE by default or 2M if available.
> +	 */
> +	if (radix_enabled()) {
> +		if (mmu_psize_defs[MMU_PAGE_2M].shift)
> +			atom_size = 1 << mmu_psize_defs[MMU_PAGE_2M].shift;

Looks like this changes behaviour for radix.

Also mmu_psize_defs is a pretty horrible interface you only need it in 
some low level instruction encodings. You already explicitly know it's
2MB there, so you can just PMD_SHIFT.

If you want to know whether huge PMD is supported and enabled in vmalloc
memory, you would have to add some check which also accounts for
vmap_allow_huge, so that would be another patch.

Thanks,
Nick

> +		goto out;
> +	}
> +
> +	/*
> +	 * Hash: Linear mapping is one of 4K, 1M and 16M.  For 4K, no need
> +	 * to group units.  For larger mappings, use 1M atom which
> +	 * should be large enough to contain a number of units.
> +	 */
> +	if (mmu_linear_psize != MMU_PAGE_4K)
> +		atom_size = 1 << 20;
> +
> +out:
> +	return atom_size;
> +}
>  
>  void __init setup_per_cpu_areas(void)
>  {
> @@ -880,15 +904,7 @@ void __init setup_per_cpu_areas(void)
>  	unsigned int cpu;
>  	int rc = -EINVAL;
>  
> -	/*
> -	 * Linear mapping is one of 4K, 1M and 16M.  For 4K, no need
> -	 * to group units.  For larger mappings, use 1M atom which
> -	 * should be large enough to contain a number of units.
> -	 */
> -	if (mmu_linear_psize == MMU_PAGE_4K)
> -		atom_size = PAGE_SIZE;
> -	else
> -		atom_size = 1 << 20;
> +	atom_size = pcpu_atom_size();
>  
>  	if (pcpu_chosen_fc != PCPU_FC_PAGE) {
>  		rc = pcpu_embed_first_chunk(0, dyn_size, atom_size, pcpu_cpu_distance,
> -- 
> 2.31.1
> 
> 


More information about the Linuxppc-dev mailing list