mm: thp: fix potential clearing to referenced flag in page_idle_clear_pte_refs_one()
[muen/linux.git] / mm / page_idle.c
index 0a49374e693194504e715be8e54489f3eb1db2f1..e412a63b2b74f7820298751e1cf382fe90c48005 100644 (file)
@@ -65,11 +65,15 @@ static bool page_idle_clear_pte_refs_one(struct page *page,
        while (page_vma_mapped_walk(&pvmw)) {
                addr = pvmw.address;
                if (pvmw.pte) {
-                       referenced = ptep_clear_young_notify(vma, addr,
-                                       pvmw.pte);
+                       /*
+                        * For PTE-mapped THP, one sub page is referenced,
+                        * the whole THP is referenced.
+                        */
+                       if (ptep_clear_young_notify(vma, addr, pvmw.pte))
+                               referenced = true;
                } else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
-                       referenced = pmdp_clear_young_notify(vma, addr,
-                                       pvmw.pmd);
+                       if (pmdp_clear_young_notify(vma, addr, pvmw.pmd))
+                               referenced = true;
                } else {
                        /* unexpected pmd-mapped page? */
                        WARN_ON_ONCE(1);