| From mtosatti@redhat.com Tue Apr 28 21:36:00 2009 |
| From: Marcelo Tosatti <mtosatti@redhat.com> |
| Date: Mon, 23 Mar 2009 17:51:20 -0300 |
| Subject: KVM: MMU: Extend kvm_mmu_page->slot_bitmap size |
| To: stable@kernel.org |
| Cc: mtosatti@redhat.com, avi@redhat.com, Sheng Yang <sheng@linux.intel.com> |
| Message-ID: <1237841498-14100-4-git-send-email-mtosatti@redhat.com> |
| |
| |
| From: Sheng Yang <sheng@linux.intel.com> |
| |
| (cherry picked from 291f26bc0f89518ad7ee3207c09eb8a743ac8fcc) |
| |
| Otherwise set_bit() for private memory slot(above KVM_MEMORY_SLOTS) would |
| corrupted memory in 32bit host. |
| |
| Signed-off-by: Sheng Yang <sheng@linux.intel.com> |
| Signed-off-by: Avi Kivity <avi@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/x86/include/asm/kvm_host.h | 8 +++++--- |
| arch/x86/kvm/mmu.c | 6 +++--- |
| 2 files changed, 8 insertions(+), 6 deletions(-) |
| |
| --- a/arch/x86/include/asm/kvm_host.h |
| +++ b/arch/x86/include/asm/kvm_host.h |
| @@ -190,9 +190,11 @@ struct kvm_mmu_page { |
| u64 *spt; |
| /* hold the gfn of each spte inside spt */ |
| gfn_t *gfns; |
| - unsigned long slot_bitmap; /* One bit set per slot which has memory |
| - * in this shadow page. |
| - */ |
| + /* |
| + * One bit set per slot which has memory |
| + * in this shadow page. |
| + */ |
| + DECLARE_BITMAP(slot_bitmap, KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS); |
| int multimapped; /* More than one parent_pte? */ |
| int root_count; /* Currently serving as active root */ |
| bool unsync; |
| --- a/arch/x86/kvm/mmu.c |
| +++ b/arch/x86/kvm/mmu.c |
| @@ -787,7 +787,7 @@ static struct kvm_mmu_page *kvm_mmu_allo |
| set_page_private(virt_to_page(sp->spt), (unsigned long)sp); |
| list_add(&sp->link, &vcpu->kvm->arch.active_mmu_pages); |
| ASSERT(is_empty_shadow_page(sp->spt)); |
| - sp->slot_bitmap = 0; |
| + bitmap_zero(sp->slot_bitmap, KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS); |
| sp->multimapped = 0; |
| sp->parent_pte = parent_pte; |
| --vcpu->kvm->arch.n_free_mmu_pages; |
| @@ -1362,7 +1362,7 @@ static void page_header_update_slot(stru |
| int slot = memslot_id(kvm, gfn_to_memslot(kvm, gfn)); |
| struct kvm_mmu_page *sp = page_header(__pa(pte)); |
| |
| - __set_bit(slot, &sp->slot_bitmap); |
| + __set_bit(slot, sp->slot_bitmap); |
| } |
| |
| static void mmu_convert_notrap(struct kvm_mmu_page *sp) |
| @@ -2451,7 +2451,7 @@ void kvm_mmu_slot_remove_write_access(st |
| int i; |
| u64 *pt; |
| |
| - if (!test_bit(slot, &sp->slot_bitmap)) |
| + if (!test_bit(slot, sp->slot_bitmap)) |
| continue; |
| |
| pt = sp->spt; |