On 01/11/18 19:07 +0800, Haozhong Zhang wrote: > 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 ^ sorry, I meant "not caused" > 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 > > >