From: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: gleb@redhat.com, avi.kivity@gmail.com, pbonzini@redhat.com,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH v7 09/11] KVM: MMU: introduce kvm_mmu_prepare_zap_obsolete_page
Date: Wed, 29 May 2013 21:43:24 +0800 [thread overview]
Message-ID: <51A605FC.8060802@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130529122552.GB5931@amt.cnet>
On 05/29/2013 08:25 PM, Marcelo Tosatti wrote:
> On Tue, May 28, 2013 at 10:51:38PM +0800, Xiao Guangrong wrote:
>> On 05/28/2013 08:13 AM, Marcelo Tosatti wrote:
>>> On Thu, May 23, 2013 at 03:55:58AM +0800, Xiao Guangrong wrote:
>>>> It is only used to zap the obsolete page. Since the obsolete page
>>>> will not be used, we need not spend time to find its unsync children
>>>> out. Also, we delete the page from shadow page cache so that the page
>>>> is completely isolated after call this function.
>>>>
>>>> The later patch will use it to collapse tlb flushes
>>>>
>>>> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
>>>> ---
>>>> arch/x86/kvm/mmu.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
>>>> 1 files changed, 41 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
>>>> index 9b57faa..e676356 100644
>>>> --- a/arch/x86/kvm/mmu.c
>>>> +++ b/arch/x86/kvm/mmu.c
>>>> @@ -1466,7 +1466,7 @@ static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, int nr)
>>>> static void kvm_mmu_free_page(struct kvm_mmu_page *sp)
>>>> {
>>>> ASSERT(is_empty_shadow_page(sp->spt));
>>>> - hlist_del(&sp->hash_link);
>>>> + hlist_del_init(&sp->hash_link);
>>>> list_del(&sp->link);
>>>> free_page((unsigned long)sp->spt);
>>>> if (!sp->role.direct)
>>>> @@ -2069,14 +2069,19 @@ static int mmu_zap_unsync_children(struct kvm *kvm,
>>>> return zapped;
>>>> }
>>>>
>>>> -static int kvm_mmu_prepare_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp,
>>>> - struct list_head *invalid_list)
>>>> +static int
>>>> +__kvm_mmu_prepare_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp,
>>>> + bool zap_unsync_children,
>>>> + struct list_head *invalid_list)
>>>> {
>>>> - int ret;
>>>> + int ret = 0;
>>>>
>>>> trace_kvm_mmu_prepare_zap_page(sp);
>>>> ++kvm->stat.mmu_shadow_zapped;
>>>> - ret = mmu_zap_unsync_children(kvm, sp, invalid_list);
>>>> +
>>>> + if (likely(zap_unsync_children))
>>>> + ret = mmu_zap_unsync_children(kvm, sp, invalid_list);
>>>> +
>>>
>>> Why is this an important case to be optimized?
>>>
>>> 1) shadow is the uncommon, obsolete case.
>>> 2) mmu_zap_unsync_children has
>>>
>>> if (parent->role.level == PT_PAGE_TABLE_LEVEL)
>>> return 0;
>>>
>>> So the large majority of pages are already optimized.
>>
>> Hmm, if we zap the high level page (e.g level = 4), it should walk its
>> children and its children's children. It is high overload.
>> (IMHO, trivial optimization is still necessary, especially, the change
>> is really slight.)
>>
>> And, there is another point me mentioned in the changelog:
>> "Also, we delete the page from shadow page cache so that the page
>> is completely isolated after call this function."
>> Skipping zapping unsync-children can ensure that only one page is
>> zapped so that we can use "hlist_del_init(&sp->hash_link)" to completely
>> remove the page from mmu-cache.
>>
>> Now, Gleb and i got a agreement that skipping obsolete page when
>> walking hash list is a better way.
>>
>> BTW, zapping unsync-children is unnecessary, is it?
>
> It is necessary that if an unsync page exists, that
> invlpg emulation is able to reach it, or that at kvm_mmu_get_page
> time they are synchronized.
Hmmm? It is not always better.
If unsync pages is zapped, mmu will map a new alloced-page which all
of its entries are nonpresent. It can cause more #PF than the case
we sync the page.
Especially, for the invlpg case, in that case you zap the page which
still have been being mapped on other vcpu's page table which currently
being used.
And, It does the further-possible work at once - spend time to walk/zap all
the unsync children but they may not be used at all. So delaying this work
until they are used is better.
>
> You transfer the synchronization work to pagefault time, which directly
> affects guest performance, while it could have been done by the host
> (this was the reason for zapping unsync children).
It seem no, most case doing zap_page is in the vcpu context, not host.
next prev parent reply other threads:[~2013-05-29 13:43 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-22 19:55 [PATCH v7 00/11] KVM: MMU: fast zap all shadow pages Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 01/11] KVM: x86: drop calling kvm_mmu_zap_all in emulator_fix_hypercall Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 02/11] KVM: MMU: drop unnecessary kvm_reload_remote_mmus Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 03/11] KVM: MMU: fast invalidate all pages Xiao Guangrong
2013-05-24 20:23 ` Marcelo Tosatti
2013-05-26 8:26 ` Gleb Natapov
2013-05-26 20:37 ` Marcelo Tosatti
2013-05-27 22:59 ` Xiao Guangrong
2013-05-27 2:02 ` Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 04/11] KVM: MMU: zap pages in batch Xiao Guangrong
2013-05-24 20:34 ` Marcelo Tosatti
2013-05-27 2:20 ` Xiao Guangrong
2013-05-28 0:18 ` Marcelo Tosatti
2013-05-28 15:02 ` Xiao Guangrong
2013-05-29 11:11 ` Marcelo Tosatti
2013-05-29 13:09 ` Xiao Guangrong
2013-05-29 13:21 ` Marcelo Tosatti
2013-05-29 14:00 ` Xiao Guangrong
2013-05-29 13:32 ` Marcelo Tosatti
2013-05-29 14:02 ` Xiao Guangrong
2013-05-29 16:03 ` Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 05/11] KVM: x86: use the fast way to invalidate all pages Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 06/11] KVM: MMU: show mmu_valid_gen in shadow page related tracepoints Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 07/11] KVM: MMU: add tracepoint for kvm_mmu_invalidate_all_pages Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 08/11] KVM: MMU: do not reuse the obsolete page Xiao Guangrong
2013-05-22 19:55 ` [PATCH v7 09/11] KVM: MMU: introduce kvm_mmu_prepare_zap_obsolete_page Xiao Guangrong
2013-05-23 5:57 ` Gleb Natapov
2013-05-23 6:13 ` Xiao Guangrong
2013-05-23 6:18 ` Gleb Natapov
2013-05-23 6:31 ` Xiao Guangrong
2013-05-23 7:37 ` Gleb Natapov
2013-05-23 7:50 ` Xiao Guangrong
2013-05-23 8:09 ` Gleb Natapov
2013-05-23 8:33 ` Xiao Guangrong
2013-05-23 11:13 ` Xiao Guangrong
2013-05-23 12:39 ` Gleb Natapov
2013-05-23 13:03 ` Xiao Guangrong
2013-05-23 15:57 ` Gleb Natapov
2013-05-24 5:39 ` Xiao Guangrong
2013-05-24 5:53 ` Xiao Guangrong
2013-05-28 0:13 ` Marcelo Tosatti
2013-05-28 14:51 ` Xiao Guangrong
2013-05-29 12:25 ` Marcelo Tosatti
2013-05-29 13:43 ` Xiao Guangrong [this message]
2013-05-22 19:55 ` [PATCH v7 10/11] KVM: MMU: collapse TLB flushes when zap all pages Xiao Guangrong
2013-05-23 6:12 ` Gleb Natapov
2013-05-23 6:26 ` Xiao Guangrong
2013-05-23 7:24 ` Gleb Natapov
2013-05-23 7:37 ` Xiao Guangrong
2013-05-23 7:38 ` Xiao Guangrong
2013-05-23 7:56 ` Gleb Natapov
2013-05-28 0:36 ` Marcelo Tosatti
2013-05-28 15:19 ` Xiao Guangrong
2013-05-29 3:03 ` Xiao Guangrong
2013-05-29 12:39 ` Marcelo Tosatti
2013-05-29 13:19 ` Xiao Guangrong
2013-05-30 0:53 ` Gleb Natapov
2013-05-30 16:24 ` Takuya Yoshikawa
2013-05-30 17:10 ` Takuya Yoshikawa
2013-05-22 19:56 ` [PATCH v7 11/11] KVM: MMU: reduce KVM_REQ_MMU_RELOAD when root page is zapped 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=51A605FC.8060802@linux.vnet.ibm.com \
--to=xiaoguangrong@linux.vnet.ibm.com \
--cc=avi.kivity@gmail.com \
--cc=gleb@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).