diff mbox series

[v2,11/16] powerpc/64: pcpu setup avoid reading mmu_linear_psize on 64e or radix

Message ID 20211021035417.2157804-12-npiggin@gmail.com (mailing list archive)
State Superseded
Headers show
Series powerpc: Make hash MMU code build configurable | expand
Related show

Commit Message

Nicholas Piggin Oct. 21, 2021, 3:54 a.m. UTC
Radix never sets mmu_linear_psize so it's always 4K, which causes pcpu
atom_size to always be PAGE_SIZE. 64e sets it to 1GB always.

Make paths for these platforms to be explicit about what value they set
atom_size to.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/kernel/setup_64.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

Comments

Christophe Leroy Oct. 21, 2021, 4:52 a.m. UTC | #1
Le 21/10/2021 à 05:54, Nicholas Piggin a écrit :
> Radix never sets mmu_linear_psize so it's always 4K, which causes pcpu
> atom_size to always be PAGE_SIZE. 64e sets it to 1GB always.
> 
> Make paths for these platforms to be explicit about what value they set
> atom_size to.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>   arch/powerpc/kernel/setup_64.c | 21 +++++++++++++++------
>   1 file changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
> index eaa79a0996d1..7d4bcbc3124e 100644
> --- a/arch/powerpc/kernel/setup_64.c
> +++ b/arch/powerpc/kernel/setup_64.c
> @@ -880,14 +880,23 @@ void __init setup_per_cpu_areas(void)
>   	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.
> +	 * BookE and BookS radix are historical values and should be revisited.
>   	 */
> -	if (mmu_linear_psize == MMU_PAGE_4K)
> -		atom_size = PAGE_SIZE;
> -	else
> +	if (IS_ENABLED(CONFIG_PPC_BOOK3E)) {
>   		atom_size = 1 << 20;
> +	} else if (radix_enabled()) {
> +		atom_size = PAGE_SIZE;
> +	} else {

You can keep a single level (and remove the brackets)

	if (IS_ENABLED(CONFIG_PPC_BOOK3E))
		atom_size = SZ_1M;
	else if (radix_enabled())
		atom_size = PAGE_SIZE;
	else if (mmu_linear_psize == MMU_PAGE_4K)
		atom_size = PAGE_SIZE;
	else
		atom_size = SZ_1M;


> +		/*
> +		 * 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;

Use SZ_1M instead of hardcoding.

> +	}
>   
>   	if (pcpu_chosen_fc != PCPU_FC_PAGE) {
>   		rc = pcpu_embed_first_chunk(0, dyn_size, atom_size, pcpu_cpu_distance,
>
Nicholas Piggin Oct. 21, 2021, 7:13 a.m. UTC | #2
Excerpts from Christophe Leroy's message of October 21, 2021 2:52 pm:
> 
> 
> Le 21/10/2021 à 05:54, Nicholas Piggin a écrit :
>> Radix never sets mmu_linear_psize so it's always 4K, which causes pcpu
>> atom_size to always be PAGE_SIZE. 64e sets it to 1GB always.
>> 
>> Make paths for these platforms to be explicit about what value they set
>> atom_size to.
>> 
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>>   arch/powerpc/kernel/setup_64.c | 21 +++++++++++++++------
>>   1 file changed, 15 insertions(+), 6 deletions(-)
>> 
>> diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
>> index eaa79a0996d1..7d4bcbc3124e 100644
>> --- a/arch/powerpc/kernel/setup_64.c
>> +++ b/arch/powerpc/kernel/setup_64.c
>> @@ -880,14 +880,23 @@ void __init setup_per_cpu_areas(void)
>>   	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.
>> +	 * BookE and BookS radix are historical values and should be revisited.
>>   	 */
>> -	if (mmu_linear_psize == MMU_PAGE_4K)
>> -		atom_size = PAGE_SIZE;
>> -	else
>> +	if (IS_ENABLED(CONFIG_PPC_BOOK3E)) {
>>   		atom_size = 1 << 20;
>> +	} else if (radix_enabled()) {
>> +		atom_size = PAGE_SIZE;
>> +	} else {
> 
> You can keep a single level (and remove the brackets)
> 
> 	if (IS_ENABLED(CONFIG_PPC_BOOK3E))
> 		atom_size = SZ_1M;
> 	else if (radix_enabled())
> 		atom_size = PAGE_SIZE;
> 	else if (mmu_linear_psize == MMU_PAGE_4K)
> 		atom_size = PAGE_SIZE;
> 	else
> 		atom_size = SZ_1M;

I could but the below comment and logic applies to BookS hash so I'm 
happier to put it in its own block. Radix later might also inherit a
comment and size from x86-64.

>> +		/*
>> +		 * 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;
> 
> Use SZ_1M instead of hardcoding.

Sure.

Thanks,
Nick
diff mbox series

Patch

diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index eaa79a0996d1..7d4bcbc3124e 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -880,14 +880,23 @@  void __init setup_per_cpu_areas(void)
 	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.
+	 * BookE and BookS radix are historical values and should be revisited.
 	 */
-	if (mmu_linear_psize == MMU_PAGE_4K)
-		atom_size = PAGE_SIZE;
-	else
+	if (IS_ENABLED(CONFIG_PPC_BOOK3E)) {
 		atom_size = 1 << 20;
+	} else if (radix_enabled()) {
+		atom_size = PAGE_SIZE;
+	} else {
+		/*
+		 * 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;
+	}
 
 	if (pcpu_chosen_fc != PCPU_FC_PAGE) {
 		rc = pcpu_embed_first_chunk(0, dyn_size, atom_size, pcpu_cpu_distance,