diff mbox series

riscv: mm: Enable PMD split page table lock for RV64

Message ID 20210730131146.184208-1-wangkefeng.wang@huawei.com (mailing list archive)
State New, archived
Headers show
Series riscv: mm: Enable PMD split page table lock for RV64 | expand

Commit Message

Kefeng Wang July 30, 2021, 1:11 p.m. UTC
After commit 1355c31eeb7e ("asm-generic: pgalloc: provide generic
pmd_alloc_one() and pmd_free_one()"), it is easy to enable
ARCH_ENABLE_SPLIT_PMD_PTLOCK for RV64.

Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
 arch/riscv/Kconfig   | 1 +
 arch/riscv/mm/init.c | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

Comments

Alexandre Ghiti Aug. 5, 2021, 11:51 a.m. UTC | #1
Hi Kefeng,

On 30/07/2021 15:11, Kefeng Wang wrote:
> After commit 1355c31eeb7e ("asm-generic: pgalloc: provide generic
> pmd_alloc_one() and pmd_free_one()"), it is easy to enable
> ARCH_ENABLE_SPLIT_PMD_PTLOCK for RV64.
> 
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
>   arch/riscv/Kconfig   | 1 +
>   arch/riscv/mm/init.c | 3 ++-
>   2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 8fcceb8eda07..c3e456fc7108 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -12,6 +12,7 @@ config 32BIT
>   
>   config RISCV
>   	def_bool y
> +	select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
>   	select ARCH_CLOCKSOURCE_INIT
>   	select ARCH_SUPPORTS_ATOMIC_RMW
>   	select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index e547e53cddd2..ce12905a0224 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -361,7 +361,8 @@ static phys_addr_t __init alloc_pmd_late(uintptr_t va)
>   	unsigned long vaddr;
>   
>   	vaddr = __get_free_page(GFP_KERNEL);
> -	BUG_ON(!vaddr);
> +	BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
> +
>   	return __pa(vaddr);
>   }
>   
> 

I took the time to check how the page table lock works, and indeed, the 
commit you mention makes it easy to enable this feature since the 
initialization of the lock for the general case is done there and your 
patch seems correct as this is the only place we allocate a PMD page, 
and the PTE page allocation already calls pgtable_pte_page_ctor.

Maybe your commit message would need some of the explanation I gave 
above, or something similar, but this is up to you.

You can add:

Reviewed-by: Alexandre Ghiti <alex@ghiti.fr>

Thanks,

Alex
Kefeng Wang Aug. 5, 2021, 4:24 p.m. UTC | #2
On 2021/8/5 19:51, Alex Ghiti wrote:
> Hi Kefeng,
>
> On 30/07/2021 15:11, Kefeng Wang wrote:
>> After commit 1355c31eeb7e ("asm-generic: pgalloc: provide generic
>> pmd_alloc_one() and pmd_free_one()"), it is easy to enable
>> ARCH_ENABLE_SPLIT_PMD_PTLOCK for RV64.
>>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
>> ---
>>   arch/riscv/Kconfig   | 1 +
>>   arch/riscv/mm/init.c | 3 ++-
>>   2 files changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
>> index 8fcceb8eda07..c3e456fc7108 100644
>> --- a/arch/riscv/Kconfig
>> +++ b/arch/riscv/Kconfig
>> @@ -12,6 +12,7 @@ config 32BIT
>>     config RISCV
>>       def_bool y
>> +    select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
>>       select ARCH_CLOCKSOURCE_INIT
>>       select ARCH_SUPPORTS_ATOMIC_RMW
>>       select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU
>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
>> index e547e53cddd2..ce12905a0224 100644
>> --- a/arch/riscv/mm/init.c
>> +++ b/arch/riscv/mm/init.c
>> @@ -361,7 +361,8 @@ static phys_addr_t __init 
>> alloc_pmd_late(uintptr_t va)
>>       unsigned long vaddr;
>>         vaddr = __get_free_page(GFP_KERNEL);
>> -    BUG_ON(!vaddr);
>> +    BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
>> +
>>       return __pa(vaddr);
>>   }
>>
>
> I took the time to check how the page table lock works, and indeed, 
> the commit you mention makes it easy to enable this feature since the 
> initialization of the lock for the general case is done there and your 
> patch seems correct as this is the only place we allocate a PMD page, 
> and the PTE page allocation already calls pgtable_pte_page_ctor.
>
> Maybe your commit message would need some of the explanation I gave 
> above, or something similar, but this is up to you.
There is a  Documentation/vm/split_page_table_lock.rst doc about this 
feature, we could learn more from changelog with the feature introduced.
>
> You can add:
>
> Reviewed-by: Alexandre Ghiti <alex@ghiti.fr>
Thanks, Alex ;)
>
> Thanks,
>
> Alex
> .
>
Kefeng Wang Aug. 27, 2021, 3:18 p.m. UTC | #3
Hi Palmer, ping ...

On 2021/7/30 21:11, Kefeng Wang wrote:
> After commit 1355c31eeb7e ("asm-generic: pgalloc: provide generic
> pmd_alloc_one() and pmd_free_one()"), it is easy to enable
> ARCH_ENABLE_SPLIT_PMD_PTLOCK for RV64.
>
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
>   arch/riscv/Kconfig   | 1 +
>   arch/riscv/mm/init.c | 3 ++-
>   2 files changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 8fcceb8eda07..c3e456fc7108 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -12,6 +12,7 @@ config 32BIT
>   
>   config RISCV
>   	def_bool y
> +	select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
>   	select ARCH_CLOCKSOURCE_INIT
>   	select ARCH_SUPPORTS_ATOMIC_RMW
>   	select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index e547e53cddd2..ce12905a0224 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -361,7 +361,8 @@ static phys_addr_t __init alloc_pmd_late(uintptr_t va)
>   	unsigned long vaddr;
>   
>   	vaddr = __get_free_page(GFP_KERNEL);
> -	BUG_ON(!vaddr);
> +	BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
> +
>   	return __pa(vaddr);
>   }
>
diff mbox series

Patch

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 8fcceb8eda07..c3e456fc7108 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -12,6 +12,7 @@  config 32BIT
 
 config RISCV
 	def_bool y
+	select ARCH_ENABLE_SPLIT_PMD_PTLOCK if PGTABLE_LEVELS > 2
 	select ARCH_CLOCKSOURCE_INIT
 	select ARCH_SUPPORTS_ATOMIC_RMW
 	select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index e547e53cddd2..ce12905a0224 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -361,7 +361,8 @@  static phys_addr_t __init alloc_pmd_late(uintptr_t va)
 	unsigned long vaddr;
 
 	vaddr = __get_free_page(GFP_KERNEL);
-	BUG_ON(!vaddr);
+	BUG_ON(!vaddr || !pgtable_pmd_page_ctor(virt_to_page(vaddr)));
+
 	return __pa(vaddr);
 }