Messages in this thread | | | Date | Thu, 4 Feb 2010 09:42:12 +0530 | From | Balbir Singh <> | Subject | Re: [PATCH] emulate accessed bit for EPT |
| |
* Rik van Riel <riel@redhat.com> [2010-02-03 16:11:03]:
> Currently KVM pretends that pages with EPT mappings never got > accessed. This has some side effects in the VM, like swapping > out actively used guest pages and needlessly breaking up actively > used hugepages. > > We can avoid those very costly side effects by emulating the > accessed bit for EPT PTEs, which should only be slightly costly > because pages pass through page_referenced infrequently. > > TLB flushing is taken care of by kvm_mmu_notifier_clear_flush_young(). > > This seems to help prevent KVM guests from being swapped out when > they should not on my system. > > Signed-off-by: Rik van Riel <riel@redhat.com> > --- > Jeff, does this patch fix the issue you saw a few months ago, with > a 256MB KVM guest in a cgroup limited to 128GB memory? > > arch/x86/kvm/mmu.c | 10 ++++++++-- > 1 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index 89a49fb..6101615 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -856,9 +856,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); >
Quite a clever implementation, one side effect is that one would see a larger number of minor faults with EPT enabled and an increase in allocation/frees of rmap entries, but that can be easily explained.
-- Balbir
| |