diff options
| -rw-r--r-- | arch/x86/include/asm/kvm_host.h | 3 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 14 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 8 | 
3 files changed, 25 insertions, 0 deletions
| diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 62527e053ee4..516798431328 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1448,4 +1448,7 @@ static inline int kvm_cpu_get_apicid(int mps_cpu)  #define put_smstate(type, buf, offset, val)                      \  	*(type *)((buf) + (offset) - 0x7e00) = val +void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, +		unsigned long start, unsigned long end); +  #endif /* _ASM_X86_KVM_HOST_H */ diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 6ca747abfa2f..faf843c9b916 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6764,6 +6764,20 @@ static void kvm_vcpu_flush_tlb(struct kvm_vcpu *vcpu)  	kvm_x86_ops->tlb_flush(vcpu);  } +void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, +		unsigned long start, unsigned long end) +{ +	unsigned long apic_address; + +	/* +	 * The physical address of apic access page is stored in the VMCS. +	 * Update it when it becomes invalid. +	 */ +	apic_address = gfn_to_hva(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT); +	if (start <= apic_address && apic_address < end) +		kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD); +} +  void kvm_vcpu_reload_apic_access_page(struct kvm_vcpu *vcpu)  {  	struct page *page = NULL; diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c422c10cd1dd..210bf820385a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -135,6 +135,11 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm);  static unsigned long long kvm_createvm_count;  static unsigned long long kvm_active_vms; +__weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, +		unsigned long start, unsigned long end) +{ +} +  bool kvm_is_reserved_pfn(kvm_pfn_t pfn)  {  	if (pfn_valid(pfn)) @@ -360,6 +365,9 @@ static void kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn,  		kvm_flush_remote_tlbs(kvm);  	spin_unlock(&kvm->mmu_lock); + +	kvm_arch_mmu_notifier_invalidate_range(kvm, start, end); +  	srcu_read_unlock(&kvm->srcu, idx);  } |