|
@@ -838,9 +838,15 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
|
|
|
u64 *spte;
|
|
|
int young = 0;
|
|
|
|
|
|
- /* always return old for EPT */
|
|
|
+ /*
|
|
|
+ * Emulate the accessed bit for EPT, by checking if this page has
|
|
|
+ * an EPT mapping, and clearing it if it does. On the next access,
|
|
|
+ * a new EPT mapping will be established.
|
|
|
+ * This has some overhead, but not as much as the cost of swapping
|
|
|
+ * out actively used pages or breaking up actively used hugepages.
|
|
|
+ */
|
|
|
if (!shadow_accessed_mask)
|
|
|
- return 0;
|
|
|
+ return kvm_unmap_rmapp(kvm, rmapp, data);
|
|
|
|
|
|
spte = rmap_next(kvm, rmapp, NULL);
|
|
|
while (spte) {
|