From: Gleb Natapov <gleb@redhat.com>
To: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Avi Kivity <avi@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
LKML <linux-kernel@vger.kernel.org>, KVM <kvm@vger.kernel.org>
Subject: Re: [PATCH 2/3] KVM: MMU: don not retry #PF for nonpaging guest
Date: Fri, 5 Nov 2010 09:45:33 +0200 [thread overview]
Message-ID: <20101105074533.GC14910@redhat.com> (raw)
In-Reply-To: <4CD39886.4050909@cn.fujitsu.com>
On Fri, Nov 05, 2010 at 01:39:18PM +0800, Xiao Guangrong wrote:
> On 11/04/2010 06:35 PM, Gleb Natapov wrote:
> > On Thu, Nov 04, 2010 at 06:32:42PM +0800, Xiao Guangrong wrote:
> >> nonpaing guest's 'direct_map' is also true, retry #PF for those
> >> guests is useless, so use 'tdp_enabled' instead
> >>
> > nonpaging guest will not attempt async pf.
>
> Ah, my mistake, but why we can not attempt async pf for nonpaging guest?
>
We can, but we do not expect to run many nonpaging guests I guess :)
> > And by checking tdp_enabled
> > here instead of direct_map we will screw nested ntp.
> >
>
> It looks like something broken: apfs can generated in L2 guest (nested ntp guest)
> and be retried in L1 guest.
>
Why is this a problem? apf will be generate on direct map even when L2
guest is running so it should be OK to prefault it into direct map on
completion.
> Below patch fix it and let nonpaging guest support async pf. I'll post it properly
> if you like. :-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 7f20f2c..606978e 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -600,6 +600,7 @@ struct kvm_x86_ops {
> struct kvm_arch_async_pf {
> u32 token;
> gfn_t gfn;
> + bool softmmu;
> };
>
> extern struct kvm_x86_ops *kvm_x86_ops;
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index f3fad4f..48ca312 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -2286,7 +2286,10 @@ static int kvm_handle_bad_page(struct kvm *kvm, gfn_t gfn, pfn_t pfn)
> return 1;
> }
>
> -static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn)
> +static bool try_async_pf(struct kvm_vcpu *vcpu, bool no_apf, gfn_t gfn,
> + gva_t gva, pfn_t *pfn, bool write, bool *writable);
> +
> +static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn, bool no_apf)
> {
> int r;
> int level;
> @@ -2307,7 +2310,9 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn)
>
> mmu_seq = vcpu->kvm->mmu_notifier_seq;
> smp_rmb();
> - pfn = gfn_to_pfn_prot(vcpu->kvm, gfn, write, &map_writable);
> +
> + if (try_async_pf(vcpu, no_apf, gfn, v, &pfn, write, &map_writable))
> + return 0;
>
> /* mmio */
> if (is_error_pfn(pfn))
> @@ -2594,7 +2599,7 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva,
> gfn = gva >> PAGE_SHIFT;
>
> return nonpaging_map(vcpu, gva & PAGE_MASK,
> - error_code & PFERR_WRITE_MASK, gfn);
> + error_code & PFERR_WRITE_MASK, gfn, no_apf);
> }
>
> static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
> @@ -2602,6 +2607,7 @@ static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn)
> struct kvm_arch_async_pf arch;
> arch.token = (vcpu->arch.apf.id++ << 12) | vcpu->vcpu_id;
> arch.gfn = gfn;
> + arch.softmmu = mmu_is_softmmu(vcpu);
>
> return kvm_setup_async_pf(vcpu, gva, gfn, &arch);
> }
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 2044302..d826d78 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -6172,9 +6172,10 @@ EXPORT_SYMBOL_GPL(kvm_set_rflags);
>
> void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, struct kvm_async_pf *work)
> {
> + bool softmmu = mmu_is_softmmu(vcpu);
> int r;
>
> - if (!vcpu->arch.mmu.direct_map || is_error_page(work->page))
> + if (softmmu || work->arch.softmmu || is_error_page(work->page))
> return;
>
> r = kvm_mmu_reload(vcpu);
> diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
> index 2cea414..48796c7 100644
> --- a/arch/x86/kvm/x86.h
> +++ b/arch/x86/kvm/x86.h
> @@ -55,6 +55,11 @@ static inline bool mmu_is_nested(struct kvm_vcpu *vcpu)
> return vcpu->arch.walk_mmu == &vcpu->arch.nested_mmu;
> }
>
> +static inline bool mmu_is_softmmu(struct kvm_vcpu *vcpu)
> +{
> + return !tdp_enabled || mmu_is_nested(vcpu);
> +}
> +
> static inline int is_pae(struct kvm_vcpu *vcpu)
> {
> return kvm_read_cr4_bits(vcpu, X86_CR4_PAE);
--
Gleb.
next prev parent reply other threads:[~2010-11-05 7:45 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-04 10:30 [PATCH 1/3] KVM: MMU: fix missing post sync audit Xiao Guangrong
2010-11-04 10:32 ` [PATCH 2/3] KVM: MMU: don not retry #PF for nonpaging guest Xiao Guangrong
2010-11-04 10:35 ` Gleb Natapov
2010-11-05 5:39 ` Xiao Guangrong
2010-11-05 7:45 ` Gleb Natapov [this message]
2010-11-05 8:03 ` Xiao Guangrong
2010-11-05 10:31 ` Gleb Natapov
2010-11-08 2:14 ` Xiao Guangrong
2010-11-08 13:52 ` Gleb Natapov
2010-11-08 16:58 ` Xiao Guangrong
2010-11-08 16:58 ` Xiao Guangrong
2010-11-08 17:01 ` Gleb Natapov
2010-11-09 8:03 ` Gleb Natapov
2010-11-09 8:48 ` Xiao Guangrong
2010-11-09 9:26 ` Gleb Natapov
2010-11-09 9:52 ` Xiao Guangrong
2010-11-09 10:51 ` Gleb Natapov
2010-11-10 2:08 ` Xiao Guangrong
2010-11-04 10:36 ` [PATCH 3/3] KVM: MMU: retry #PF for softmmu Xiao Guangrong
2010-11-09 8:06 ` Gleb Natapov
2010-11-09 9:16 ` Xiao Guangrong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101105074533.GC14910@redhat.com \
--to=gleb@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=xiaoguangrong@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.