live migration support for initial write protect of VM
Subsystems (2)
PATCH v4 2/5 live migration support for initial write protect of VM
Patch adds support for live migration initial split up of huge pages in memory slot and write protection of all pages in memory slot.
Signed-off-by Mario Smarduch <[email protected]>
--- arch/arm/include/asm/kvm_host.h | 8 ++ arch/arm/include/asm/kvm_mmu.h | 11 ++ arch/arm/kvm/arm.c | 3 + arch/arm/kvm/mmu.c | 215 +++++++++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 5 +- 5 files changed, 241 insertions(+), 1 deletion(-)
arch/arm/include/asm/kvm_host.h +8 -0
@@ -67,6 +67,12 @@ struct kvm_arch {/* Interrupt controller */ struct vgic_dist vgic; + +/* Marks start of migration, used to handle 2nd stage page faults +* during migration, prevent installing huge pages and split huge pages +* to small pages. +*/ +int migration_in_progress; };#define KVM_NR_MEM_OBJS 40
@@ -230,4 +236,6 @@ int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);void kvm_tlb_flush_vmid (struct kvm *kvm); +int kvm_mmu_slot_remove_write_access (struct kvm *kvm,int slot); +#endif /* __ARM_KVM_HOST_H__ */
arch/arm/include/asm/kvm_mmu.h +11 -0
@@ -111,6 +111,17 @@ static inline void kvm_set_s2pte_writable(pte_t *pte)pte_val (*pte) |=L_PTE_S2_RDWR ; } +static inline void kvm_set_s2pte_readonly (pte_t *pte) +{ +pte_val (*pte) &= ~(L_PTE_S2_RDONLY ^L_PTE_S2_RDWR ); +} + +static inline bool kvm_s2pte_readonly (pte_t *pte) +{ +return (pte_val (*pte) &L_PTE_S2_RDWR ) ==L_PTE_S2_RDONLY ; +} + +static inline void kvm_set_s2pmd_writable (pmd_t *pmd) {pmd_val (*pmd) |=L_PMD_S2_RDWR ;
arch/arm/kvm/arm.c +3 -0
@@ -233,6 +233,9 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, struct kvm_userspace_memory_region *mem, enum kvm_mr_change change) { +/* Request for migration issued by user, write protect memory slot */ +if ((change !=KVM_MR_DELETE ) && (mem->flags &KVM_MEM_LOG_DIRTY_PAGES )) +return kvm_mmu_slot_remove_write_access (kvm, mem->slot);return 0 ; }
arch/arm/kvm/mmu.c +215 -0
227 lines not on this page · raw message
virt/kvm/kvm_main.c +4 -1
@@ -184,7 +184,10 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)return called; } -void kvm_flush_remote_tlbs (struct kvm *kvm) +/* Architectures like >= ARMv7 hardware broadcast TLB invalidations and don't +* use IPIs. +*/ +void __weak kvm_flush_remote_tlbs (struct kvm *kvm) {long dirty_count = kvm->tlbs_dirty;
Signature · 1 line
1.7.9.5