aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMario Smarduch <m.smarduch@samsung.com>2015-01-15 18:59:01 -0500
committerChristoffer Dall <christoffer.dall@linaro.org>2015-01-16 08:42:49 -0500
commit7276030a082c9c33150e5900a80e26c6e3189b16 (patch)
tree79a99541f3abdc51e7546b413a52aedaef93e92a
parent9836c6b9fff8cbc43e8bb0098e901fe84ceb0810 (diff)
KVM: arm/arm64: Enable Dirty Page logging for ARMv8
This patch enables ARMv8 ditry page logging support. Plugs ARMv8 into generic layer through Kconfig symbol, and drops earlier ARM64 constraints to enable logging at architecture layer. Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
-rw-r--r--arch/arm/include/asm/kvm_host.h12
-rw-r--r--arch/arm/kvm/arm.c4
-rw-r--r--arch/arm/kvm/mmu.c19
-rw-r--r--arch/arm64/kvm/Kconfig2
4 files changed, 13 insertions, 24 deletions
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 38931d4f4ba3..7d07eb85c0b0 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -221,18 +221,6 @@ static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr,
221 kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr); 221 kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr);
222} 222}
223 223
224/**
225 * kvm_flush_remote_tlbs() - flush all VM TLB entries
226 * @kvm: pointer to kvm structure.
227 *
228 * Interface to HYP function to flush all VM TLB entries without address
229 * parameter.
230 */
231static inline void kvm_flush_remote_tlbs(struct kvm *kvm)
232{
233 kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
234}
235
236static inline int kvm_arch_dev_ioctl_check_extension(long ext) 224static inline int kvm_arch_dev_ioctl_check_extension(long ext)
237{ 225{
238 return 0; 226 return 0;
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 1434410e7f46..74603a09ee76 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -808,7 +808,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
808 */ 808 */
809int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log) 809int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
810{ 810{
811#ifdef CONFIG_ARM
812 bool is_dirty = false; 811 bool is_dirty = false;
813 int r; 812 int r;
814 813
@@ -821,9 +820,6 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log)
821 820
822 mutex_unlock(&kvm->slots_lock); 821 mutex_unlock(&kvm->slots_lock);
823 return r; 822 return r;
824#else /* arm64 */
825 return -EINVAL;
826#endif
827} 823}
828 824
829static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm, 825static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm,
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 6685c68ef4ba..eb945973b3be 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -52,11 +52,18 @@ static phys_addr_t hyp_idmap_vector;
52 52
53static bool memslot_is_logging(struct kvm_memory_slot *memslot) 53static bool memslot_is_logging(struct kvm_memory_slot *memslot)
54{ 54{
55#ifdef CONFIG_ARM
56 return memslot->dirty_bitmap && !(memslot->flags & KVM_MEM_READONLY); 55 return memslot->dirty_bitmap && !(memslot->flags & KVM_MEM_READONLY);
57#else 56}
58 return false; 57
59#endif 58/**
59 * kvm_flush_remote_tlbs() - flush all VM TLB entries for v7/8
60 * @kvm: pointer to kvm structure.
61 *
62 * Interface to HYP function to flush all VM TLB entries
63 */
64void kvm_flush_remote_tlbs(struct kvm *kvm)
65{
66 kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
60} 67}
61 68
62static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) 69static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
@@ -950,7 +957,6 @@ static bool kvm_is_device_pfn(unsigned long pfn)
950 return !pfn_valid(pfn); 957 return !pfn_valid(pfn);
951} 958}
952 959
953#ifdef CONFIG_ARM
954/** 960/**
955 * stage2_wp_ptes - write protect PMD range 961 * stage2_wp_ptes - write protect PMD range
956 * @pmd: pointer to pmd entry 962 * @pmd: pointer to pmd entry
@@ -1095,7 +1101,6 @@ void kvm_arch_mmu_write_protect_pt_masked(struct kvm *kvm,
1095 1101
1096 stage2_wp_range(kvm, start, end); 1102 stage2_wp_range(kvm, start, end);
1097} 1103}
1098#endif
1099 1104
1100static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, 1105static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
1101 struct kvm_memory_slot *memslot, unsigned long hva, 1106 struct kvm_memory_slot *memslot, unsigned long hva,
@@ -1511,7 +1516,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
1511 const struct kvm_memory_slot *old, 1516 const struct kvm_memory_slot *old,
1512 enum kvm_mr_change change) 1517 enum kvm_mr_change change)
1513{ 1518{
1514#ifdef CONFIG_ARM
1515 /* 1519 /*
1516 * At this point memslot has been committed and there is an 1520 * At this point memslot has been committed and there is an
1517 * allocated dirty_bitmap[], dirty pages will be be tracked while the 1521 * allocated dirty_bitmap[], dirty pages will be be tracked while the
@@ -1519,7 +1523,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
1519 */ 1523 */
1520 if (change != KVM_MR_DELETE && mem->flags & KVM_MEM_LOG_DIRTY_PAGES) 1524 if (change != KVM_MR_DELETE && mem->flags & KVM_MEM_LOG_DIRTY_PAGES)
1521 kvm_mmu_wp_memory_region(kvm, mem->slot); 1525 kvm_mmu_wp_memory_region(kvm, mem->slot);
1522#endif
1523} 1526}
1524 1527
1525int kvm_arch_prepare_memory_region(struct kvm *kvm, 1528int kvm_arch_prepare_memory_region(struct kvm *kvm,
diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
index 8ba85e9ea388..3ce389b3c21c 100644
--- a/arch/arm64/kvm/Kconfig
+++ b/arch/arm64/kvm/Kconfig
@@ -22,10 +22,12 @@ config KVM
22 select PREEMPT_NOTIFIERS 22 select PREEMPT_NOTIFIERS
23 select ANON_INODES 23 select ANON_INODES
24 select HAVE_KVM_CPU_RELAX_INTERCEPT 24 select HAVE_KVM_CPU_RELAX_INTERCEPT
25 select HAVE_KVM_ARCH_TLB_FLUSH_ALL
25 select KVM_MMIO 26 select KVM_MMIO
26 select KVM_ARM_HOST 27 select KVM_ARM_HOST
27 select KVM_ARM_VGIC 28 select KVM_ARM_VGIC
28 select KVM_ARM_TIMER 29 select KVM_ARM_TIMER
30 select KVM_GENERIC_DIRTYLOG_READ_PROTECT
29 ---help--- 31 ---help---
30 Support hosting virtualized guest machines. 32 Support hosting virtualized guest machines.
31 33