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 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));
+
          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






[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