|
@@ -399,13 +399,20 @@ int pmdp_test_and_clear_young(struct vm_area_struct *vma,
|
|
|
int ptep_clear_flush_young(struct vm_area_struct *vma,
|
|
|
unsigned long address, pte_t *ptep)
|
|
|
{
|
|
|
- int young;
|
|
|
-
|
|
|
- young = ptep_test_and_clear_young(vma, address, ptep);
|
|
|
- if (young)
|
|
|
- flush_tlb_page(vma, address);
|
|
|
-
|
|
|
- return young;
|
|
|
+ /*
|
|
|
+ * On x86 CPUs, clearing the accessed bit without a TLB flush
|
|
|
+ * doesn't cause data corruption. [ It could cause incorrect
|
|
|
+ * page aging and the (mistaken) reclaim of hot pages, but the
|
|
|
+ * chance of that should be relatively low. ]
|
|
|
+ *
|
|
|
+ * So as a performance optimization don't flush the TLB when
|
|
|
+ * clearing the accessed bit, it will eventually be flushed by
|
|
|
+ * a context switch or a VM operation anyway. [ In the rare
|
|
|
+ * event of it not getting flushed for a long time the delay
|
|
|
+ * shouldn't really matter because there's no real memory
|
|
|
+ * pressure for swapout to react to. ]
|
|
|
+ */
|
|
|
+ return ptep_test_and_clear_young(vma, address, ptep);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|