From: Avi Kivity <avi@redhat.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Avi Kivity <avi@qumranet.com>,
kvm@vger.kernel.org, "David S. Ahern" <daahern@cisco.com>
Subject: Re: [patch 10/10] KVM: MMU: speed up mmu_unsync_walk
Date: Fri, 19 Sep 2008 18:26:56 -0700 [thread overview]
Message-ID: <48D45160.6030208@redhat.com> (raw)
In-Reply-To: <20080918213337.235766366@localhost.localdomain>
Marcelo Tosatti wrote:
> Cache the unsynced children information in a per-page bitmap.
>
> static void nonpaging_prefetch_page(struct kvm_vcpu *vcpu,
> struct kvm_mmu_page *sp)
> {
> @@ -946,33 +978,57 @@ static void nonpaging_invlpg(struct kvm_
> static int mmu_unsync_walk(struct kvm_mmu_page *parent, mmu_unsync_fn fn,
> void *priv)
> {
> - int i, ret;
> - struct kvm_mmu_page *sp = parent;
> + int ret, level, i;
> + u64 ent;
> + struct kvm_mmu_page *sp, *child;
> + struct walk {
> + struct kvm_mmu_page *sp;
> + int pos;
> + } walk[PT64_ROOT_LEVEL];
>
> - while (parent->unsync_children) {
> - for (i = 0; i < PT64_ENT_PER_PAGE; ++i) {
> - u64 ent = sp->spt[i];
> + WARN_ON(parent->role.level == PT_PAGE_TABLE_LEVEL);
> +
> + if (!parent->unsync_children)
> + return 0;
> +
> + memset(&walk, 0, sizeof(walk));
> + level = parent->role.level;
> + walk[level-1].sp = parent;
> +
> + do {
> + sp = walk[level-1].sp;
> + i = find_next_bit(sp->unsync_child_bitmap, 512, walk[level-1].pos);
> + if (i < 512) {
> + walk[level-1].pos = i+1;
> + ent = sp->spt[i];
>
> if (is_shadow_present_pte(ent)) {
> - struct kvm_mmu_page *child;
> child = page_header(ent & PT64_BASE_ADDR_MASK);
>
> if (child->unsync_children) {
> - sp = child;
> - break;
> + --level;
> + walk[level-1].sp = child;
> + walk[level-1].pos = 0;
> + continue;
> }
> if (child->unsync) {
> ret = fn(child, priv);
> + __clear_bit(i, sp->unsync_child_bitmap);
> if (ret)
> return ret;
> }
> }
> + __clear_bit(i, sp->unsync_child_bitmap);
> + } else {
> + ++level;
> + if (find_first_bit(sp->unsync_child_bitmap, 512) == 512) {
> + sp->unsync_children = 0;
> + if (level-1 < PT64_ROOT_LEVEL)
> + walk[level-1].pos = 0;
> + }
> }
> - if (i == PT64_ENT_PER_PAGE) {
> - sp->unsync_children = 0;
> - sp = parent;
> - }
> - }
> + } while (level <= parent->role.level);
> +
> return 0;
> }
>
<weeps>
>
> --- kvm.orig/include/asm-x86/kvm_host.h
> +++ kvm/include/asm-x86/kvm_host.h
> @@ -201,6 +201,7 @@ struct kvm_mmu_page {
> u64 *parent_pte; /* !multimapped */
> struct hlist_head parent_ptes; /* multimapped, kvm_pte_chain */
> };
> + DECLARE_BITMAP(unsync_child_bitmap, 512);
> };
>
Later, we can throw this bitmap out to a separate object. Also, it may
make sense to replace it with an array of u16s.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
next prev parent reply other threads:[~2008-09-20 1:26 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-18 21:27 [patch 00/10] out of sync shadow v2 Marcelo Tosatti
2008-09-18 21:27 ` [patch 01/10] KVM: MMU: split mmu_set_spte Marcelo Tosatti
2008-09-18 21:27 ` [patch 02/10] KVM: MMU: move local TLB flush to mmu_set_spte Marcelo Tosatti
2008-09-20 0:21 ` Avi Kivity
2008-09-18 21:27 ` [patch 03/10] KVM: MMU: do not write-protect large mappings Marcelo Tosatti
2008-09-20 0:29 ` Avi Kivity
2008-09-21 0:41 ` Marcelo Tosatti
2008-09-18 21:27 ` [patch 04/10] KVM: MMU: mode specific sync_page Marcelo Tosatti
2008-09-20 0:44 ` Avi Kivity
2008-09-18 21:27 ` [patch 05/10] KVM: MMU: sync roots on mmu reload Marcelo Tosatti
2008-09-18 21:27 ` [patch 06/10] KVM: x86: trap invlpg Marcelo Tosatti
2008-09-20 0:53 ` Avi Kivity
2008-09-21 0:43 ` Marcelo Tosatti
2008-09-18 21:27 ` [patch 07/10] KVM: MMU: mmu_parent_walk Marcelo Tosatti
2008-09-20 0:56 ` Avi Kivity
2008-09-21 0:44 ` Marcelo Tosatti
2008-09-22 20:30 ` Avi Kivity
2008-09-22 22:04 ` Marcelo Tosatti
2008-09-18 21:27 ` [patch 08/10] KVM: MMU: awareness of new kvm_mmu_zap_page behaviour Marcelo Tosatti
2008-09-18 21:27 ` [patch 09/10] KVM: MMU: out of sync shadow core v2 Marcelo Tosatti
2008-09-20 1:22 ` Avi Kivity
2008-09-21 0:45 ` Marcelo Tosatti
2008-09-22 20:41 ` Avi Kivity
2008-09-22 21:55 ` Marcelo Tosatti
2008-09-22 22:51 ` Marcelo Tosatti
2008-09-23 10:46 ` Avi Kivity
2008-09-23 10:46 ` Avi Kivity
2008-09-23 13:17 ` Marcelo Tosatti
2008-09-18 21:27 ` [patch 10/10] KVM: MMU: speed up mmu_unsync_walk Marcelo Tosatti
2008-09-20 1:26 ` Avi Kivity [this message]
2008-09-21 0:45 ` Marcelo Tosatti
2008-09-22 20:43 ` Avi Kivity
2008-09-18 22:36 ` [patch 00/10] out of sync shadow v2 Marcelo Tosatti
2008-09-20 1:28 ` 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=48D45160.6030208@redhat.com \
--to=avi@redhat.com \
--cc=avi@qumranet.com \
--cc=daahern@cisco.com \
--cc=kvm@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