On 08/07/20 16:00, Vitaly Kuznetsov wrote: > OVMF booted guest running on shadow pages crashes on TRIPLE FAULT after > enabling paging from SMM. The crash is triggered from mmu_check_root() and > is caused by kvm_is_visible_gfn() searching through memslots with as_id = 0 > while vCPU may be in a different context (address space). > > Introduce kvm_vcpu_is_visible_gfn() and use it from mmu_check_root(). > > Signed-off-by: Vitaly Kuznetsov <vkuzn...@redhat.com> > --- > arch/x86/kvm/mmu/mmu.c | 2 +- > include/linux/kvm_host.h | 1 + > virt/kvm/kvm_main.c | 8 ++++++++ > 3 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c > index 4fd4b5de8996..309024210a35 100644 > --- a/arch/x86/kvm/mmu/mmu.c > +++ b/arch/x86/kvm/mmu/mmu.c > @@ -3668,7 +3668,7 @@ static int mmu_check_root(struct kvm_vcpu *vcpu, gfn_t > root_gfn) > { > int ret = 0; > > - if (!kvm_is_visible_gfn(vcpu->kvm, root_gfn)) { > + if (!kvm_vcpu_is_visible_gfn(vcpu, root_gfn)) { > kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu); > ret = 1; > } > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index d564855243d8..f74d2a5afc26 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -774,6 +774,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int > offset, int len); > int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); > struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); > bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); > +bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn); > unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); > void mark_page_dirty(struct kvm *kvm, gfn_t gfn); > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index a852af5c3214..b131c7da1d12 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -1626,6 +1626,14 @@ bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) > } > EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); > > +bool kvm_vcpu_is_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn) > +{ > + struct kvm_memory_slot *memslot = kvm_vcpu_gfn_to_memslot(vcpu, gfn); > + > + return kvm_is_visible_memslot(memslot); > +} > +EXPORT_SYMBOL_GPL(kvm_vcpu_is_visible_gfn); > + > unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) > { > struct vm_area_struct *vma; >
Queued, thanks. Paolo