return applied * PAGE_SIZE;
 }
 
-static unsigned long damon_pa_mark_accessed(struct damon_region *r)
+static inline unsigned long damon_pa_mark_accessed_or_deactivate(
+               struct damon_region *r, bool mark_accessed)
 {
        unsigned long addr, applied = 0;
 
 
                if (!page)
                        continue;
-               mark_page_accessed(page);
+               if (mark_accessed)
+                       mark_page_accessed(page);
+               else
+                       deactivate_page(page);
                put_page(page);
                applied++;
        }
        return applied * PAGE_SIZE;
 }
 
-static unsigned long damon_pa_deactivate_pages(struct damon_region *r)
+static unsigned long damon_pa_mark_accessed(struct damon_region *r)
 {
-       unsigned long addr, applied = 0;
-
-       for (addr = r->ar.start; addr < r->ar.end; addr += PAGE_SIZE) {
-               struct page *page = damon_get_page(PHYS_PFN(addr));
+       return damon_pa_mark_accessed_or_deactivate(r, true);
+}
 
-               if (!page)
-                       continue;
-               deactivate_page(page);
-               put_page(page);
-               applied++;
-       }
-       return applied * PAGE_SIZE;
+static unsigned long damon_pa_deactivate_pages(struct damon_region *r)
+{
+       return damon_pa_mark_accessed_or_deactivate(r, false);
 }
 
 static unsigned long damon_pa_apply_scheme(struct damon_ctx *ctx,