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