|
@@ -54,27 +54,27 @@ static int page_idle_clear_pte_refs_one(struct page *page,
|
|
struct vm_area_struct *vma,
|
|
struct vm_area_struct *vma,
|
|
unsigned long addr, void *arg)
|
|
unsigned long addr, void *arg)
|
|
{
|
|
{
|
|
- struct mm_struct *mm = vma->vm_mm;
|
|
|
|
- pmd_t *pmd;
|
|
|
|
- pte_t *pte;
|
|
|
|
- spinlock_t *ptl;
|
|
|
|
|
|
+ struct page_vma_mapped_walk pvmw = {
|
|
|
|
+ .page = page,
|
|
|
|
+ .vma = vma,
|
|
|
|
+ .address = addr,
|
|
|
|
+ };
|
|
bool referenced = false;
|
|
bool referenced = false;
|
|
|
|
|
|
- if (!page_check_address_transhuge(page, mm, addr, &pmd, &pte, &ptl))
|
|
|
|
- return SWAP_AGAIN;
|
|
|
|
-
|
|
|
|
- if (pte) {
|
|
|
|
- referenced = ptep_clear_young_notify(vma, addr, pte);
|
|
|
|
- pte_unmap(pte);
|
|
|
|
- } else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
|
|
|
|
- referenced = pmdp_clear_young_notify(vma, addr, pmd);
|
|
|
|
- } else {
|
|
|
|
- /* unexpected pmd-mapped page? */
|
|
|
|
- WARN_ON_ONCE(1);
|
|
|
|
|
|
+ while (page_vma_mapped_walk(&pvmw)) {
|
|
|
|
+ addr = pvmw.address;
|
|
|
|
+ if (pvmw.pte) {
|
|
|
|
+ referenced = ptep_clear_young_notify(vma, addr,
|
|
|
|
+ pvmw.pte);
|
|
|
|
+ } else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
|
|
|
|
+ referenced = pmdp_clear_young_notify(vma, addr,
|
|
|
|
+ pvmw.pmd);
|
|
|
|
+ } else {
|
|
|
|
+ /* unexpected pmd-mapped page? */
|
|
|
|
+ WARN_ON_ONCE(1);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- spin_unlock(ptl);
|
|
|
|
-
|
|
|
|
if (referenced) {
|
|
if (referenced) {
|
|
clear_page_idle(page);
|
|
clear_page_idle(page);
|
|
/*
|
|
/*
|