Re: [PATCH] KVM MMU: check pending exception before injecting APF

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/11/18 18:48 +0800, Wanpeng Li wrote:
> 2018-01-10 21:44 GMT+08:00 Haozhong Zhang <haozhong.zhang@xxxxxxxxx>:
> > When a guest expection is already pending, injecting APF may result in
> > guest #DF.
> >
> > For example, when two APF's for page ready happen after an exit, the
> > first APF will be pending. If injecting the second one regardless of
> > the pending one, the second APF injection will be converted an
> > injection of #DF.
> 
> Thanks for the fix, I think the codes look good, but the patch
> description maybe not. Inject two async pfs after one vmexit will not
> happen after this commit
> https://git.kernel.org/pub/scm/virt/kvm/kvm.git/commit/?h=queue&id=9a6e7c39810e4a8bc7fc95056cefb40583fe07ef

That patch does not exclude the case that the exit is caused by EPT
violation, i.e., no APF for page not present happened before the
injections of consequent APF's for page ready.

Perhaps my commit message should say
"For example, when two APF's for page ready happen after one exit and
 the first one gets pending, injecting the second one regardless of
 the pending one will result in an injection of #DF."

Haozhong

> 
> Regards,
> Wanpeng Li
> 
> >
> > Reported-by: Ross Zwisler <zwisler@xxxxxxxxx>
> > Message-ID: <CAOxpaSUBf8QoOZQ1p4KfUp0jq76OKfGY4Uxs-Gg8ngReD99xww@xxxxxxxxxxxxxx>
> > Reported-by: Alec Blayne <ab@xxxxxxxxx>
> > Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
> > ---
> >  arch/x86/kvm/mmu.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> > index 89da688784fa..a8d0230ea40d 100644
> > --- a/arch/x86/kvm/mmu.c
> > +++ b/arch/x86/kvm/mmu.c
> > @@ -3781,7 +3781,8 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
> >  bool kvm_can_do_async_pf(struct kvm_vcpu *vcpu)
> >  {
> >         if (unlikely(!lapic_in_kernel(vcpu) ||
> > -                    kvm_event_needs_reinjection(vcpu)))
> > +                    kvm_event_needs_reinjection(vcpu) ||
> > +                    vcpu->arch.exception.pending))
> >                 return false;
> >
> >         if (!vcpu->arch.apf.delivery_as_pf_vmexit && is_guest_mode(vcpu))
> > --
> > 2.14.1
> >



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux