[PATCH v5 3/9] mm/mremap: Use pmd/pud_poplulate to update page table entries

Nathan Chancellor nathan at kernel.org
Thu May 20 04:02:37 AEST 2021


On 5/18/2021 9:46 PM, Aneesh Kumar K.V wrote:
> Nathan Chancellor <nathan at kernel.org> writes:
> 
>> Hi Aneesh,
>>
>> On Thu, Apr 22, 2021 at 11:13:17AM +0530, Aneesh Kumar K.V wrote:
>>> pmd/pud_populate is the right interface to be used to set the respective
>>> page table entries. Some architectures like ppc64 do assume that set_pmd/pud_at
>>> can only be used to set a hugepage PTE. Since we are not setting up a hugepage
>>> PTE here, use the pmd/pud_populate interface.
>>>
>>> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar at linux.ibm.com>
>>> ---
>>>   mm/mremap.c | 7 +++----
>>>   1 file changed, 3 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/mm/mremap.c b/mm/mremap.c
>>> index ec8f840399ed..574287f9bb39 100644
>>> --- a/mm/mremap.c
>>> +++ b/mm/mremap.c
>>> @@ -26,6 +26,7 @@
>>>   
>>>   #include <asm/cacheflush.h>
>>>   #include <asm/tlbflush.h>
>>> +#include <asm/pgalloc.h>
>>>   
>>>   #include "internal.h"
>>>   
>>> @@ -257,9 +258,8 @@ static bool move_normal_pmd(struct vm_area_struct *vma, unsigned long old_addr,
>>>   	pmd_clear(old_pmd);
>>>   
>>>   	VM_BUG_ON(!pmd_none(*new_pmd));
>>> +	pmd_populate(mm, new_pmd, (pgtable_t)pmd_page_vaddr(pmd));
>>>   
>>> -	/* Set the new pmd */
>>> -	set_pmd_at(mm, new_addr, new_pmd, pmd);
>>>   	flush_tlb_range(vma, old_addr, old_addr + PMD_SIZE);
>>>   	if (new_ptl != old_ptl)
>>>   		spin_unlock(new_ptl);
>>> @@ -306,8 +306,7 @@ static bool move_normal_pud(struct vm_area_struct *vma, unsigned long old_addr,
>>>   
>>>   	VM_BUG_ON(!pud_none(*new_pud));
>>>   
>>> -	/* Set the new pud */
>>> -	set_pud_at(mm, new_addr, new_pud, pud);
>>> +	pud_populate(mm, new_pud, (pmd_t *)pud_page_vaddr(pud));
>>>   	flush_tlb_range(vma, old_addr, old_addr + PUD_SIZE);
>>>   	if (new_ptl != old_ptl)
>>>   		spin_unlock(new_ptl);
>>> -- 
>>> 2.30.2
>>>
>>>
>>
>> This commit causes my WSL2 VM to close when compiling something memory
>> intensive, such as an x86_64_defconfig + CONFIG_LTO_CLANG_FULL=y kernel
>> or LLVM/Clang. Unfortunately, I do not have much further information to
>> provide since I do not see any sort of splat in dmesg right before it
>> closes and I have found zero information about getting the previous
>> kernel message in WSL2 (custom init so no systemd or anything).
>>
>> The config file is the stock one from Microsoft:
>>
>> https://github.com/microsoft/WSL2-Linux-Kernel/blob/a571dc8cedc8e0e56487c0dc93243e0b5db8960a/Microsoft/config-wsl
>>
>> I have attached my .config anyways, which includes CONFIG_DEBUG_VM,
>> which does not appear to show anything out of the ordinary. I have also
>> attached a dmesg just in case anything sticks out. I am happy to provide
>> any additional information or perform additional debugging steps as
>> needed.
>>
> 
> Can you try this change?

Thank you for the quick diff! This resolves my issue.

Tested-by: Nathan Chancellor <nathan at kernel.org>

> modified   mm/mremap.c
> @@ -279,7 +279,7 @@ static bool move_normal_pmd(struct vm_area_struct *vma, unsigned long old_addr,
>   	pmd_clear(old_pmd);
>   
>   	VM_BUG_ON(!pmd_none(*new_pmd));
> -	pmd_populate(mm, new_pmd, (pgtable_t)pmd_page_vaddr(pmd));
> +	pmd_populate(mm, new_pmd, pmd_pgtable(pmd));
>   
>   	if (new_ptl != old_ptl)
>   		spin_unlock(new_ptl);
> 



More information about the Linuxppc-dev mailing list