]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm/damon/vaddr: cleanup using pmd_trans_huge_lock()
authorSeongJae Park <sj@kernel.org>
Wed, 12 Nov 2025 15:41:06 +0000 (07:41 -0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 20 Nov 2025 21:44:01 +0000 (13:44 -0800)
Three pmd walk functions in vaddr.c are using pmd_trans_huge() and
pmd_lock() to handle THPs.  Simplify the code by replacing the two
function calls with a single pmd_trans_huge_lock() call.

Note that this cleanup is not only reducing the lines of code, but also
simplifies code execution flows for migration entries case, as kindly
explained [1] by Hugh, who suggested this cleanup.

[sj@kernel.org: provide lvalue to pmd_present()]
Link: https://lkml.kernel.org/r/20251117154415.11041-1-sj@kernel.org
Link: https://lkml.kernel.org/r/20251112154114.66053-4-sj@kernel.org
Link: https://lore.kernel.org/296c2b3f-6748-158f-b85d-2952165c0588@google.com
Signed-off-by: SeongJae Park <sj@kernel.org>
Suggested-by: Hugh Dickins <hughd@google.com>
Cc: Bill Wendling <morbo@google.com>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: David Gow <davidgow@google.com>
Cc: David Hildenbrand <david@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Justin Stitt <justinstitt@google.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: kernel test robot <lkp@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/vaddr.c

index 7e834467b2d8121ab9fae3f66185defd82747e54..83d9b09c86a86eae2ad226680af99d180e588751 100644 (file)
@@ -307,24 +307,16 @@ static int damon_mkold_pmd_entry(pmd_t *pmd, unsigned long addr,
                unsigned long next, struct mm_walk *walk)
 {
        pte_t *pte;
-       pmd_t pmde;
        spinlock_t *ptl;
 
-       if (pmd_trans_huge(pmdp_get(pmd))) {
-               ptl = pmd_lock(walk->mm, pmd);
-               pmde = pmdp_get(pmd);
-
-               if (!pmd_present(pmde)) {
-                       spin_unlock(ptl);
-                       return 0;
-               }
+       ptl = pmd_trans_huge_lock(pmd, walk->vma);
+       if (ptl) {
+               pmd_t pmde = pmdp_get(pmd);
 
-               if (pmd_trans_huge(pmde)) {
+               if (pmd_present(pmde))
                        damon_pmdp_mkold(pmd, walk->vma, addr);
-                       spin_unlock(ptl);
-                       return 0;
-               }
                spin_unlock(ptl);
+               return 0;
        }
 
        pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
@@ -446,21 +438,12 @@ static int damon_young_pmd_entry(pmd_t *pmd, unsigned long addr,
        struct damon_young_walk_private *priv = walk->private;
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-       if (pmd_trans_huge(pmdp_get(pmd))) {
-               pmd_t pmde;
-
-               ptl = pmd_lock(walk->mm, pmd);
-               pmde = pmdp_get(pmd);
+       ptl = pmd_trans_huge_lock(pmd, walk->vma);
+       if (ptl) {
+               pmd_t pmde = pmdp_get(pmd);
 
-               if (!pmd_present(pmde)) {
-                       spin_unlock(ptl);
-                       return 0;
-               }
-
-               if (!pmd_trans_huge(pmde)) {
-                       spin_unlock(ptl);
-                       goto regular_page;
-               }
+               if (!pmd_present(pmde))
+                       goto huge_out;
                folio = damon_get_folio(pmd_pfn(pmde));
                if (!folio)
                        goto huge_out;
@@ -474,8 +457,6 @@ huge_out:
                spin_unlock(ptl);
                return 0;
        }
-
-regular_page:
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
 
        pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
@@ -910,13 +891,10 @@ static int damos_va_stat_pmd_entry(pmd_t *pmd, unsigned long addr,
        int nr;
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-       if (pmd_trans_huge(*pmd)) {
-               pmd_t pmde;
+       ptl = pmd_trans_huge_lock(pmd, vma);
+       if (ptl) {
+               pmd_t pmde = pmdp_get(pmd);
 
-               ptl = pmd_trans_huge_lock(pmd, vma);
-               if (!ptl)
-                       return 0;
-               pmde = pmdp_get(pmd);
                if (!pmd_present(pmde))
                        goto huge_unlock;