diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2012-07-02 04:54:30 -0400 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2012-07-18 15:55:04 -0400 |
commit | d19a748b1c42b133e9263e9023c1d162efa6f4ad (patch) | |
tree | ab8885d5e02b4a25adb9a8b72d16fc0620c9323c | |
parent | 9594a4986192f99c01a7c0a1779b5ac0eff8e208 (diff) |
KVM: Introduce hva_to_gfn_memslot() for kvm_handle_hva()
This restricts hva handling in mmu code and makes it easier to extend
kvm_handle_hva() so that it can treat a range of addresses later in this
patch series.
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Cc: Alexander Graf <agraf@suse.de>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_hv.c | 6 | ||||
-rw-r--r-- | arch/x86/kvm/mmu.c | 3 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 8 |
3 files changed, 12 insertions, 5 deletions
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index d03eb6f7b058..37037553fe60 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | |||
@@ -772,10 +772,10 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva, | |||
772 | 772 | ||
773 | end = start + (memslot->npages << PAGE_SHIFT); | 773 | end = start + (memslot->npages << PAGE_SHIFT); |
774 | if (hva >= start && hva < end) { | 774 | if (hva >= start && hva < end) { |
775 | gfn_t gfn_offset = (hva - start) >> PAGE_SHIFT; | 775 | gfn_t gfn = hva_to_gfn_memslot(hva, memslot); |
776 | gfn_t gfn_offset = gfn - memslot->base_gfn; | ||
776 | 777 | ||
777 | ret = handler(kvm, &memslot->rmap[gfn_offset], | 778 | ret = handler(kvm, &memslot->rmap[gfn_offset], gfn); |
778 | memslot->base_gfn + gfn_offset); | ||
779 | retval |= ret; | 779 | retval |= ret; |
780 | } | 780 | } |
781 | } | 781 | } |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 2beb95b57cbe..170a632d9d34 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -1278,8 +1278,7 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva, | |||
1278 | 1278 | ||
1279 | end = start + (memslot->npages << PAGE_SHIFT); | 1279 | end = start + (memslot->npages << PAGE_SHIFT); |
1280 | if (hva >= start && hva < end) { | 1280 | if (hva >= start && hva < end) { |
1281 | gfn_t gfn_offset = (hva - start) >> PAGE_SHIFT; | 1281 | gfn_t gfn = hva_to_gfn_memslot(hva, memslot); |
1282 | gfn_t gfn = memslot->base_gfn + gfn_offset; | ||
1283 | 1282 | ||
1284 | ret = 0; | 1283 | ret = 0; |
1285 | 1284 | ||
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index e3c86f8c86c9..6f6c18a03c50 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -740,6 +740,14 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) | |||
740 | (base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); | 740 | (base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); |
741 | } | 741 | } |
742 | 742 | ||
743 | static inline gfn_t | ||
744 | hva_to_gfn_memslot(unsigned long hva, struct kvm_memory_slot *slot) | ||
745 | { | ||
746 | gfn_t gfn_offset = (hva - slot->userspace_addr) >> PAGE_SHIFT; | ||
747 | |||
748 | return slot->base_gfn + gfn_offset; | ||
749 | } | ||
750 | |||
743 | static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, | 751 | static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot, |
744 | gfn_t gfn) | 752 | gfn_t gfn) |
745 | { | 753 | { |