FAILED: patch "[PATCH] KVM: x86: fix APIC page invalidation" failed to apply to 4.4-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
b1394e745b9453dcb5b0671c205b770e87dedb87Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= <[email protected]>
Date: Thu, 30 Nov 2017 19:05:45 +0100
Subject: [PATCH] KVM: x86: fix APIC page invalidation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Implementation of the unpinned APIC page didn't update the VMCS address cache when invalidation was done through range mmu notifiers. This became a problem when the page notifier was removed.
Re-introduce the arch-specific helper and call it from ...range_start.
arch/x86/include/asm/kvm_host.h +3 -0
@@ -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 */
arch/x86/kvm/x86.c +14 -0
@@ -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 ;
virt/kvm/kvm_main.c +8 -0
@@ -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); }