From: Joerg Roedel <joerg.roedel@amd.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Avi Kivity <avi@redhat.com>, Alexander Graf <agraf@suse.de>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 0/18][RFC] Nested Paging support for Nested SVM (aka NPT-Virtualization)
Date: Thu, 4 Mar 2010 16:58:20 +0100 [thread overview]
Message-ID: <20100304155820.GA6019@amd.com> (raw)
In-Reply-To: <20100304144255.GA26657@amt.cnet>
On Thu, Mar 04, 2010 at 11:42:55AM -0300, Marcelo Tosatti wrote:
> On Wed, Mar 03, 2010 at 08:12:03PM +0100, Joerg Roedel wrote:
> > Hi,
> >
> > here are the patches that implement nested paging support for nested
> > svm. They are somewhat intrusive to the soft-mmu so I post them as RFC
> > in the first round to get feedback about the general direction of the
> > changes. Nevertheless I am proud to report that with these patches the
> > famous kernel-compile benchmark runs only 4% slower in the l2 guest as
> > in the l1 guest when l2 is single-processor. With SMP guests the
> > situation is very different. The more vcpus the guest has the more is
> > the performance drop from l1 to l2.
> > Anyway, this post is to get feedback about the overall concept of these
> > patches. Please review and give feedback :-)
>
> Joerg,
>
> What perf gain does this bring ? (i'm not aware of the current
> overhead).
The benchmark was an allnoconfig kernel compile in tmpfs which took with
the same guest image:
as l1-guest with npt:
2m23s
as l2-guest with l1(nested)-l2(shadow):
around 8-9 minutes
as l2-guest with l1(nested)-l2(shadow) without the recent msrpm
optimization:
around 19 minutes
as l2-guest with l1(nested)-l2(nested) [this patchset]:
2m25s-2m30s
> Overall comments:
>
> Can't you translate l2_gpa -> l1_gpa walking the current l1 nested
> pagetable, and pass that to the kvm tdp fault path (with the correct
> context setup)?
If I understand your suggestion correctly, I think thats exactly whats
done in the patches. Some words about the design:
For nested-nested we need to shadow the l1-nested-ptable on the host.
This is done using the vcpu->arch.mmu context which holds the l1 paging
modes while the l2 is running. On a npt-fault from the l2 we just
instrument the shadow-ptable code. This is the common case. because it
happens all the time while the l2 is running.
The other thing is that vcpu->arch.mmu.gva_to_gpa is expected to still
work and translate virtual addresses of the l2 into physical addresses
of the l1 (so it can be accessed with kvm functions).
To do this we need to be aware of the L2 paging mode. It is stored in
vcpu->arch.nested_mmu context. This context is only used for gva_to_gpa
translations. It is not used to build shadow page tables or anything
else. Thats the reason only the parts necessary for gva_to_gpa
translations of the nested_mmu context are initialized.
Since we can not use mmu.gva_to_gpa to translate only between l2_gpa and
l1_gpa because this function is required to translate l2_gva to l1_gpa
by other parts of kvm, the function which does this translation is moved
to nested_mmu.gva_to_gpa. So basically the gva_to_gpa function pointers
are swapped between mmu and nested_mmu.
The nested_mmu.gva_to_gpa function is used in translate_gpa_nested which
is assigned to the newly introduced translate_gpa callback of nested_mmu
context.
This callback is used in the walk_addr function to translate every
l2_gpa address we read from cr3 or the guest ptes into l1_gpa to read
the next step from the guest memory.
In the old unnested case the translate_gpa callback would point to a
function which just returns the gpa it is passed to it unmodified. The
walk_addr function is generalized and now there are basically two
versions of it:
* walk_addr which translates using vcpu->arch.mmu context
* walk_addr_nested which translates using vcpu->arch.nested_mmu
context
Thats pretty much how these patches work.
> You probably need to include a flag in base_role to differentiate
> between l1 / l2 shadow tables (say if they use the same cr3 value).
Not sure if this is necessary. It may be necessary when large pages come
into play. Otherwise the host npt pages are distinguished by the shadow
npt pages by the direct-flag.
Joerg
next prev parent reply other threads:[~2010-03-04 15:59 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-03 19:12 [PATCH 0/18][RFC] Nested Paging support for Nested SVM (aka NPT-Virtualization) Joerg Roedel
2010-03-03 19:12 ` [PATCH 01/18] KVM: MMU: Check for root_level instead of long mode Joerg Roedel
2010-03-03 19:12 ` [PATCH 02/18] KVM: MMU: Make tdp_enabled a mmu-context parameter Joerg Roedel
2010-03-08 9:17 ` Avi Kivity
2010-03-10 14:44 ` Joerg Roedel
2010-03-10 14:53 ` Avi Kivity
2010-03-10 15:26 ` Joerg Roedel
2010-03-11 6:47 ` Avi Kivity
2010-03-11 10:33 ` Joerg Roedel
2010-03-03 19:12 ` [PATCH 03/18] KVM: MMU: Make set_cr3 a function pointer in kvm_mmu Joerg Roedel
2010-03-03 19:12 ` [PATCH 04/18] KVM: X86: Introduce a tdp_set_cr3 function Joerg Roedel
2010-03-03 19:12 ` [PATCH 05/18] KVM: MMU: Introduce get_cr3 function pointer Joerg Roedel
2010-03-03 19:12 ` [PATCH 06/18] KVM: MMU: Introduce inject_page_fault " Joerg Roedel
2010-03-03 19:12 ` [PATCH 07/18] KVM: SVM: Implement MMU helper functions for Nested Nested Paging Joerg Roedel
2010-03-03 19:12 ` [PATCH 08/18] KVM: MMU: Change init_kvm_softmmu to take a context as parameter Joerg Roedel
2010-03-03 19:12 ` [PATCH 09/18] KVM: MMU: Let is_rsvd_bits_set take mmu context instead of vcpu Joerg Roedel
2010-03-03 19:12 ` [PATCH 10/18] KVM: MMU: Introduce generic walk_addr function Joerg Roedel
2010-03-03 19:12 ` [PATCH 11/18] KVM: MMU: Add infrastructure for two-level page walker Joerg Roedel
2010-03-08 9:37 ` Avi Kivity
2010-03-10 14:46 ` Joerg Roedel
2010-03-03 19:12 ` [PATCH 12/18] KVM: MMU: Implement nested gva_to_gpa functions Joerg Roedel
2010-03-03 19:12 ` [PATCH 13/18] KVM: MMU: Introduce Nested MMU context Joerg Roedel
2010-03-03 19:12 ` [PATCH 14/18] KVM: SVM: Initialize Nested Nested MMU context on VMRUN Joerg Roedel
2010-03-03 19:12 ` [PATCH 15/18] KVM: MMU: Propagate the right fault back to the guest after gva_to_gpa Joerg Roedel
2010-03-15 4:30 ` Daniel K.
2010-03-15 12:52 ` Joerg Roedel
2010-03-15 7:36 ` Avi Kivity
2010-03-15 9:06 ` Joerg Roedel
2010-03-15 9:23 ` Avi Kivity
2010-03-15 9:41 ` Joerg Roedel
2010-03-03 19:12 ` [PATCH 16/18] KVM: X86: Add callback to let modules decide over some supported cpuid bits Joerg Roedel
2010-03-03 19:12 ` [PATCH 17/18] KVM: SVM: Report Nested Paging support to userspace Joerg Roedel
2010-03-03 23:37 ` Alexander Graf
2010-03-04 11:27 ` Joerg Roedel
2010-03-03 19:12 ` [PATCH 18/18] KVM: X86: Add KVM_CAP_SVM_CPUID_FIXED Joerg Roedel
2010-03-08 9:39 ` Avi Kivity
2010-03-10 14:46 ` Joerg Roedel
2010-03-03 23:10 ` [PATCH 0/18][RFC] Nested Paging support for Nested SVM (aka NPT-Virtualization) Jan Kiszka
2010-03-03 23:44 ` Alexander Graf
2010-03-04 11:29 ` Joerg Roedel
2010-03-04 0:35 ` Anthony Liguori
2010-03-04 14:42 ` Marcelo Tosatti
2010-03-04 15:58 ` Joerg Roedel [this message]
2010-03-11 20:58 ` Marcelo Tosatti
2010-03-12 7:36 ` Avi Kivity
2010-03-15 6:27 ` Marcelo Tosatti
2010-03-15 7:34 ` Avi Kivity
2010-03-12 7:41 ` Avi Kivity
2010-03-08 9:41 ` Avi Kivity
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=20100304155820.GA6019@amd.com \
--to=joerg.roedel@amd.com \
--cc=agraf@suse.de \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox