]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/damon: validate if the pmd entry is present before accessing
authorBaolin Wang <baolin.wang@linux.alibaba.com>
Wed, 17 Aug 2022 06:21:12 +0000 (14:21 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 17 Aug 2022 20:58:40 +0000 (13:58 -0700)
The pmd_huge() is used to validate if the pmd entry is mapped by a huge
page, also including the case of non-present (migration or hwpoisoned) pmd
entry on arm64 or x86 architectures.  Thus we should validate if it is
present before making the pmd entry old or getting young state, otherwise
we can not get the correct corresponding page.

Link: https://lkml.kernel.org/r/2838b6737bc259cf575ff11fd1c4b7fdb340fa73.1660717122.git.baolin.wang@linux.alibaba.com
Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/damon/vaddr.c

index 3c7b9d6dca95d30dfce3e0a41fc63febeb9e0dce..1d16c6c796386b1df94fa9d3b99e0d1f10c6cc50 100644 (file)
@@ -304,6 +304,11 @@ static int damon_mkold_pmd_entry(pmd_t *pmd, unsigned long addr,
 
        if (pmd_huge(*pmd)) {
                ptl = pmd_lock(walk->mm, pmd);
+               if (!pmd_present(*pmd)) {
+                       spin_unlock(ptl);
+                       return 0;
+               }
+
                if (pmd_huge(*pmd)) {
                        damon_pmdp_mkold(pmd, walk->mm, addr);
                        spin_unlock(ptl);
@@ -431,6 +436,11 @@ static int damon_young_pmd_entry(pmd_t *pmd, unsigned long addr,
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
        if (pmd_huge(*pmd)) {
                ptl = pmd_lock(walk->mm, pmd);
+               if (!pmd_present(*pmd)) {
+                       spin_unlock(ptl);
+                       return 0;
+               }
+
                if (!pmd_huge(*pmd)) {
                        spin_unlock(ptl);
                        goto regular_page;