FAILED: patch "[PATCH] x86/kvm/lapic: preserve gfn_to_hva_cache len on cache reinit" failed to apply to 4.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.14-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
a7c42bb6da6b1b54b2e7bd567636d72d87b10a79Mon Sep 17 00:00:00 2001
From: Vitaly Kuznetsov <[email protected]>
Date: Tue, 16 Oct 2018 18:50:06 +0200
Subject: [PATCH] x86/kvm/lapic: preserve gfn_to_hva_cache len on cache reinit
vcpu->arch.pv_eoi is accessible through both HV_X64_MSR_VP_ASSIST_PAGE and MSR_KVM_PV_EOI_EN so on migration userspace may try to restore them in any order. Values match, however, kvm_lapic_enable_pv_eoi() uses different
length: for Hyper-V case it's the whole struct hv_vp_assist_page, for KVM native case it is 8. In case we restore KVM-native MSR last cache will be reinitialized with len=8 so trying to access VP assist page beyond 8 bytes with kvm_read_guest_cached() will fail.
Check if we re-initializing cache for the same address and preserve length in case it was greater.
arch/x86/kvm/lapic.c +10 -2
@@ -2647,14 +2647,22 @@ int kvm_hv_vapic_msr_read(struct kvm_vcpu *vcpu, u32 reg, u64 *data)int kvm_lapic_enable_pv_eoi (struct kvm_vcpu *vcpu,u64 data,unsigned long len) {u64 addr = data & ~KVM_MSR_ENABLED ; +struct gfn_to_hva_cache *ghc = &vcpu->arch.pv_eoi.data; +unsigned long new_len; +if (!IS_ALIGNED (addr,4 ))return 1 ; vcpu->arch.pv_eoi.msr_val = data;if (!pv_eoi_enabled (vcpu))return 0 ; -return kvm_gfn_to_hva_cache_init (vcpu->kvm, &vcpu->arch.pv_eoi.data, - addr, len); + +if (addr == ghc->gpa && len <= ghc->len) + new_len = ghc->len; +else + new_len = len; + +return kvm_gfn_to_hva_cache_init (vcpu->kvm, ghc, addr, new_len); }void kvm_apic_accept_events (struct kvm_vcpu *vcpu)