Commit 96549d56 authored by SeongJae Park's avatar SeongJae Park Committed by Andrew Morton
Browse files

mm/damon/vaddr: cleanup using pmd_trans_huge_lock()

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

 [1]
Signed-off-by: default avatarSeongJae Park <sj@kernel.org>
Suggested-by: default avatarHugh 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 53298afe
Loading
Loading
Loading
Loading
+13 −35
Original line number Diff line number Diff line
@@ -307,25 +307,17 @@ 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);
	}

	pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
	if (!pte)
@@ -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_trans_huge_lock(pmd, walk->vma);
	if (ptl) {
		pmd_t pmde = pmdp_get(pmd);

		ptl = pmd_lock(walk->mm, pmd);
		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 @@ static int damon_young_pmd_entry(pmd_t *pmd, unsigned long addr,
		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)
			return 0;
		pmde = pmdp_get(pmd);
	if (ptl) {
		pmd_t pmde = pmdp_get(pmd);

		if (!pmd_present(pmde))
			goto huge_unlock;