|
@@ -360,8 +360,17 @@ static int page_referenced_one(struct page *page,
|
|
goto out_unmap;
|
|
goto out_unmap;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ptep_clear_flush_young_notify(vma, address, pte))
|
|
|
|
- referenced++;
|
|
|
|
|
|
+ if (ptep_clear_flush_young_notify(vma, address, pte)) {
|
|
|
|
+ /*
|
|
|
|
+ * Don't treat a reference through a sequentially read
|
|
|
|
+ * mapping as such. If the page has been used in
|
|
|
|
+ * another mapping, we will catch it; if this other
|
|
|
|
+ * mapping is already gone, the unmap path will have
|
|
|
|
+ * set PG_referenced or activated the page.
|
|
|
|
+ */
|
|
|
|
+ if (likely(!VM_SequentialReadHint(vma)))
|
|
|
|
+ referenced++;
|
|
|
|
+ }
|
|
|
|
|
|
/* Pretend the page is referenced if the task has the
|
|
/* Pretend the page is referenced if the task has the
|
|
swap token and is in the middle of a page fault. */
|
|
swap token and is in the middle of a page fault. */
|