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 >>> --- >> 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