Re: [PATCH V2] mm/gup.c: stricter check on THP migration entry during follow_pmd_mask

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 15 Dec 2021, at 7:47, Li Xinhai wrote:

> On 12/11/21 11:16 PM, Li Xinhai wrote:
>>
>>
>> On 12/11/21 11:10 PM, Li Xinhai wrote:
>>> When BUG_ON check for THP migration entry, the exsiting code only check
>>> thp_migration_supported case, but not for !thp_migration_supported case.
>>> To make the BUG_ON check consistent, we need catch both cases.
>>>
>>> Move the BUG_ON check one step eariler, because if the bug happen we
>>> should know it instead of depend on FOLL_MIGRATION been used by caller.
>>>
>>> Because pmdval instead of *pmd is read by the is_pmd_migration_entry()
>>> check, the existing code don't help to avoid useless locking within
>>> pmd_migration_entry_wait(), so remove that check.
>>>
>>> Signed-off-by: Li Xinhai <lixinhai.lxh@xxxxxxxxx>
>>> ---
>> V1->V2:
>> Move the BUG_ON() check before if(!(flags & FOLL_MIGRATION)); and add comments
>> for it.
>>
> Yan, Ying and Kirill have been worked on this part of code, may help to review.
>
> This change was based on my code review, no real bug has been observed.
>
>
>>>   mm/gup.c | 13 +++++++++----
>>>   1 file changed, 9 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/mm/gup.c b/mm/gup.c
>>> index 2c51e9748a6a..94d0e586ca0b 100644
>>> --- a/mm/gup.c
>>> +++ b/mm/gup.c
>>> @@ -642,12 +642,17 @@ static struct page *follow_pmd_mask(struct vm_area_struct *vma,
>>>       }
>>>   retry:
>>>       if (!pmd_present(pmdval)) {
>>> +        /*
>>> +         * Should never reach here, if thp migration is not supported;
>>> +         * Otherwise, it must be a thp miration entry.
>>> +         */
>>> +        VM_BUG_ON(!thp_migration_supported() ||
>>> +                  !is_pmd_migration_entry(pmdval));
>>> +

This means VM_BUG_ON will be triggered when pmdval is not present and THP migration
is not enabled. This can happen when it is pmd_none(). That is not a bug and should
just return no_page_table(vma, flags).

>>>           if (likely(!(flags & FOLL_MIGRATION)))
>>>               return no_page_table(vma, flags);
>>> -        VM_BUG_ON(thp_migration_supported() &&
>>> -                  !is_pmd_migration_entry(pmdval));
>>> -        if (is_pmd_migration_entry(pmdval))
>>> -            pmd_migration_entry_wait(mm, pmd);
>>> +
>>> +        pmd_migration_entry_wait(mm, pmd);
>>>           pmdval = READ_ONCE(*pmd);
>>>           /*
>>>            * MADV_DONTNEED may convert the pmd to null because
>>>

--
Best Regards,
Yan, Zi

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux