On Fri, Dec 02, 2016 at 05:24:55PM +0200, Mika Penttilä wrote: > > > > > > --- a/arch/x86/kvm/x86.c > > > > > > +++ b/arch/x86/kvm/x86.c > > > > > > @@ -8402,7 +8402,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, > > > > > > bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) > > > > > > { > > > > > > if (!(vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED)) > > > > > > - return true; > > > > > > + return false; > > > > > > > > > > > > > > > > > Why do you make this change? > > > > > > > Because the code does the opposite of what it's meant to do. > > > > > > It could have a better name but returning "true" is right. See below. > > > > > > > > I think kvm_arch_async_page_present() is not > > > > > ever called now and neither kvm_del_async_pf_gfn(vcpu, work->arch.gfn); > > > > I wonder how you came to such a conclusion? I certainly see them called > > > > on my test machine (you need to have the guest memory swapped out for > > > > that, that can be forced e.g. using a memory cgroup). > > > if !KVM_ASYNC_PF_ENABLED then kvm_check_async_pf_completion(), it's only call site, never calls it. > > > How's that? I don't see any check for it in > > kvm_check_async_pf_completion(). Moreover, that's exactly where it does > > that check. > > void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu) > { > struct kvm_async_pf *work; > > while (!list_empty_careful(&vcpu->async_pf.done) && > kvm_arch_can_inject_async_page_present(vcpu)) { > spin_lock(&vcpu->async_pf.lock); > > > and you made kvm_arch_can_inject_async_page_present(vcpu) return false if !KVM_ASYNC_PF_ENABLED (i.e. not enabled) > > > > > Maybe you had KVM_ASYNC_PF_ENABLED? > > > Of course I did. Not sure I get what you mean... > > I mean if the guest support for async pf is not enabled you maybe broke that? Ah I finally see the light, thank you. Apparently disabling async_pf by the guest should result in draining all accumulated async pagefaults but without injecting #PF in the guest. The latter is taken care of by another check for the msr value in kvm_arch_async_page_present(). My patch is wrong indeed; I was misled by the "self-explanatory" function name which was bogus. I'll cook up another patch renaming the function and putting a comment there, too. Thanks, Roman. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html