From: Takuya Yoshikawa <yoshikawa_takuya_b1@lab.ntt.co.jp>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: pbonzini@redhat.com, kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 05/10] KVM: x86: MMU: Use for_each_rmap_spte macro instead of pte_list_walk()
Date: Mon, 16 Nov 2015 11:51:15 +0900 [thread overview]
Message-ID: <564944A3.5080005@lab.ntt.co.jp> (raw)
In-Reply-To: <20151114092047.GA25627@amt.cnet>
On 2015/11/14 18:20, Marcelo Tosatti wrote:
> The actual issue is this: a higher level page that had, under its children,
> no out of sync pages, now, due to your addition, a child that is unsync:
>
> initial state:
> level1
>
> final state:
>
> level1 -x-> level2 -x-> level3
>
> Where -x-> are the links created by this pagefault fixing round.
>
> If _any_ page under you is unsync (not necessarily the ones this
> pagefault is accessing), you have to mark parents unsync.
I understand this, but I don't think my patch will break this.
What kvm_mmu_mark_parents_unsync() does is:
for each p_i in sp->parent_ptes rmap chain
mark_unsync(p_i);
Then, mark_unsync() finds the parent sp including that p_i to
set ->unsync_child_bitmap and increment ->unsync_children if
necessary. It may also call kvm_mmu_mark_parents_unsync()
recursively.
I understand we need to tell the parents "you have an unsync
child/descendant" until this information reaches the top level
by that recursive calls.
But since these recursive calls cannot come back to the starting sp,
the child->parent graph has no loop, each mark_unsync(p_i) will not
be affected by other parents in that sp->parent_ptes rmap chain,
from which we started the recursive calls.
As the following code shows, my patch does mark_unsync(parent_pte)
separately, and then mmu_page_add_parent_pte(vcpu, sp, parent_pte):
> - } else if (sp->unsync)
> + if (parent_pte)
> + mark_unsync(parent_pte);
> + } else if (sp->unsync) {
> kvm_mmu_mark_parents_unsync(sp);
> + if (parent_pte)
> + mark_unsync(parent_pte);
> + }
> + mmu_page_add_parent_pte(vcpu, sp, parent_pte);
So, as you worried, during each mark_unsync(p_i) is processed,
this parent_pte does not exist in that sp->parent_ptes rmap chain.
But as I explained above, this does not change anything about what
each mark_unsync(p_i) call does, so keeps the original behaviour.
By the way, I think "kvm_mmu_mark_parents_unsync" and "mark_unsync"
do not tell what they actually do well. When I first saw the names,
I thought they would just set the parents' sp->unsync.
To reflect the following meaning better, it should be
propagate_unsync(_to_parents) or something:
Tell the parents "you have an unsync child/descendant"
until this unsync information reaches the top level
Thanks,
Takuya
next prev parent reply other threads:[~2015-11-16 2:50 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-12 11:48 [PATCH 00/10 V2] KVM: x86: MMU: Clean up x86's mmu code for future work Takuya Yoshikawa
2015-11-12 11:49 ` [PATCH 01/10] KVM: x86: MMU: Remove unused parameter of __direct_map() Takuya Yoshikawa
2015-11-12 11:50 ` [PATCH 02/10] KVM: x86: MMU: Add helper function to clear a bit in unsync child bitmap Takuya Yoshikawa
2015-11-18 2:44 ` Xiao Guangrong
2015-11-19 0:59 ` Takuya Yoshikawa
2015-11-19 2:46 ` Xiao Guangrong
2015-11-19 4:02 ` Takuya Yoshikawa
2015-11-12 11:51 ` [PATCH 03/10] KVM: x86: MMU: Make mmu_set_spte() return emulate value Takuya Yoshikawa
2015-11-12 11:51 ` [PATCH 04/10] KVM: x86: MMU: Remove is_rmap_spte() and use is_shadow_present_pte() Takuya Yoshikawa
2015-11-12 11:52 ` [PATCH 05/10] KVM: x86: MMU: Use for_each_rmap_spte macro instead of pte_list_walk() Takuya Yoshikawa
2015-11-13 21:47 ` Marcelo Tosatti
2015-11-14 9:20 ` Marcelo Tosatti
2015-11-16 2:51 ` Takuya Yoshikawa [this message]
2015-11-17 17:58 ` Paolo Bonzini
2015-11-18 3:07 ` Xiao Guangrong
2015-11-12 11:53 ` [PATCH 06/10] KVM: x86: MMU: Consolidate WARN_ON/BUG_ON checks for reverse-mapped sptes Takuya Yoshikawa
2015-11-13 22:08 ` Marcelo Tosatti
2015-11-16 3:34 ` Takuya Yoshikawa
2015-11-12 11:55 ` [PATCH 07/10] KVM: x86: MMU: Encapsulate the type of rmap-chain head in a new struct Takuya Yoshikawa
2015-11-18 3:21 ` Xiao Guangrong
2015-11-18 9:09 ` Paolo Bonzini
2015-11-19 2:23 ` Takuya Yoshikawa
2015-11-12 11:55 ` [PATCH 08/10] KVM: x86: MMU: Move initialization of parent_ptes out from kvm_mmu_alloc_page() Takuya Yoshikawa
2015-11-12 11:56 ` [PATCH 09/10 RFC] KVM: x86: MMU: Move parent_pte handling from kvm_mmu_get_page() to link_shadow_page() Takuya Yoshikawa
2015-11-12 14:27 ` Paolo Bonzini
2015-11-12 17:03 ` Paolo Bonzini
2015-11-13 2:15 ` Takuya Yoshikawa
2015-11-13 10:51 ` Paolo Bonzini
2015-11-18 3:32 ` Xiao Guangrong
2015-11-12 11:57 ` [PATCH 10/10] KVM: x86: MMU: Remove unused parameter parent_pte from kvm_mmu_get_page() Takuya Yoshikawa
2015-11-12 12:08 ` [PATCH 00/10 V2] KVM: x86: MMU: Clean up x86's mmu code for future work Paolo Bonzini
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=564944A3.5080005@lab.ntt.co.jp \
--to=yoshikawa_takuya_b1@lab.ntt.co.jp \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=pbonzini@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 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.