diff options
author | Andrea Arcangeli <aarcange@redhat.com> | 2010-09-17 13:13:17 -0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-09-26 17:18:34 -0700 |
commit | 291e06417553bbca9d6cf59d5ac1040a9d71da99 (patch) | |
tree | e5325a1250e7cce7acfa46e03096db7c86dd1dd5 | |
parent | 41d2a3bcdb188e4d6d8cc799f93aed93c0639e36 (diff) |
KVM: MMU: fix mmu notifier invalidate handler for huge spte
commit 6e3e243c3b6e0bbd18c6ce0fbc12bc3fe2d77b34 upstream.
The index wasn't calculated correctly (off by one) for huge spte so KVM guest
was unstable with transparent hugepages.
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
Reviewed-by: Reviewed-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | arch/x86/kvm/mmu.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index b1ed0a1a5913..92b6ca4fb54d 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -799,8 +799,12 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva, ret = handler(kvm, &memslot->rmap[gfn_offset], data); for (j = 0; j < KVM_NR_PAGE_SIZES - 1; ++j) { - int idx = gfn_offset; - idx /= KVM_PAGES_PER_HPAGE(PT_DIRECTORY_LEVEL + j); + unsigned long idx; + int nr; + + nr = KVM_PAGES_PER_HPAGE(PT_DIRECTORY_LEVEL+j); + idx = (memslot->base_gfn+gfn_offset) / nr - + memslot->base_gfn / nr; ret |= handler(kvm, &memslot->lpage_info[j][idx].rmap_pde, data); |