From: Gleb Natapov <gleb@redhat.com>
To: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
avi.kivity@gmail.com, pbonzini@redhat.com,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH v6 3/7] KVM: MMU: fast invalidate all pages
Date: Tue, 21 May 2013 11:45:51 +0300 [thread overview]
Message-ID: <20130521084551.GX4725@redhat.com> (raw)
In-Reply-To: <519AEBD9.9040909@linux.vnet.ibm.com>
On Tue, May 21, 2013 at 11:36:57AM +0800, Xiao Guangrong wrote:
> > So its better to just
> >
> > if (need_resched()) {
> > kvm_mmu_complete_zap_page(&list);
>
> is kvm_mmu_commit_zap_page()?
>
Also we need to check that someone waits on mmu_lock before entering
here.
> > cond_resched_lock(&kvm->mmu_lock);
> > }
> >
>
> Isn't it what Gleb said?
>
It is.
> > If you want to collapse TLB flushes, please do it in a later patch.
>
> Good to me.
>
> >
> >>>> + if (kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list))
> >>>> + goto restart;
> >>>> + }
> >>>> +
> >>>> + /*
> >>>> + * Should flush tlb before free page tables since lockless-walking
> >>>> + * may use the pages.
> >>>> + */
> >>>> + kvm_mmu_commit_zap_page(kvm, &invalid_list);
> >>>> +}
> >>>> +
> >>>> +/*
> >>>> + * Fast invalidate all shadow pages.
> >>>> + *
> >>>> + * @zap_obsolete_pages indicates whether all the obsolete pages should
> >>>> + * be zapped. This is required when memslot is being deleted or VM is
> >>>> + * being destroyed, in these cases, we should ensure that KVM MMU does
> >>>> + * not use any resource of the being-deleted slot or all slots after
> >>>> + * calling the function.
> >>>> + *
> >>>> + * @zap_obsolete_pages == false means the caller just wants to flush all
> >>>> + * shadow page tables.
> >>>> + */
> >>>> +void kvm_mmu_invalidate_all_pages(struct kvm *kvm, bool zap_obsolete_pages)
> >>>> +{
> >>>> + spin_lock(&kvm->mmu_lock);
> >>>> + kvm->arch.mmu_valid_gen++;
> >>>> +
> >>>> + /*
> >>>> + * Notify all vcpus to reload its shadow page table
> >>>> + * and flush TLB. Then all vcpus will switch to new
> >>>> + * shadow page table with the new mmu_valid_gen.
> >>>
> >>> Only if you zap the roots, which we agreed would be a second step, after
> >>> being understood its necessary.
> >>>
> >> I've lost you here. The patch implement what was agreed upon.
> >
> > "
> > + /*
> > + * Notify all vcpus to reload its shadow page table
> > + * and flush TLB. Then all vcpus will switch to new
> > + * shadow page table with the new mmu_valid_gen.
> > "
> >
> > What was suggested was... go to phrase which starts with "The only purpose
> > of the generation number should be to".
> >
> > The comment quoted here does not match that description.
>
> So, is this your want?
>
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index 2c512e8..2fd4c04 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -4275,10 +4275,19 @@ restart:
> */
> void kvm_mmu_invalidate_all_pages(struct kvm *kvm, bool zap_obsolete_pages)
> {
> + bool zap_root = fase;
> + struct kvm_mmu_page *sp;
> +
> spin_lock(&kvm->mmu_lock);
> trace_kvm_mmu_invalidate_all_pages(kvm, zap_obsolete_pages);
> kvm->arch.mmu_valid_gen++;
>
> + list_for_each_entry(sp, kvm->arch.active_mmu_pages, link)
> + if (sp->root_count && !sp->role.invalid) {
> + zap_root = true;
> + break;
> + }
> +
That's the part I do not understand from what Marcelo suggest: why would zap_root
be ever false after this loop?
> /*
> * Notify all vcpus to reload its shadow page table
> * and flush TLB. Then all vcpus will switch to new
> @@ -4288,7 +4297,8 @@ void kvm_mmu_invalidate_all_pages(struct kvm *kvm, bool zap_obsolete_pages)
> * mmu-lock, otherwise, vcpu would purge shadow page
> * but miss tlb flush.
> */
> - kvm_reload_remote_mmus(kvm);
> + if (zap_root)
> + kvm_reload_remote_mmus(kvm);
>
> if (zap_obsolete_pages)
> kvm_zap_obsolete_pages(kvm);
>
--
Gleb.
next prev parent reply other threads:[~2013-05-21 8:45 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-16 21:12 [PATCH v6 0/7] KVM: MMU: fast zap all shadow pages Xiao Guangrong
2013-05-16 21:12 ` [PATCH v6 1/7] KVM: MMU: drop unnecessary kvm_reload_remote_mmus Xiao Guangrong
2013-05-16 21:12 ` [PATCH v6 2/7] KVM: MMU: delete shadow page from hash list in kvm_mmu_prepare_zap_page Xiao Guangrong
2013-05-19 10:47 ` Gleb Natapov
2013-05-20 9:19 ` Xiao Guangrong
2013-05-20 9:42 ` Gleb Natapov
2013-05-16 21:12 ` [PATCH v6 3/7] KVM: MMU: fast invalidate all pages Xiao Guangrong
2013-05-19 10:04 ` Gleb Natapov
2013-05-20 9:12 ` Xiao Guangrong
2013-05-20 19:46 ` Marcelo Tosatti
2013-05-20 20:15 ` Gleb Natapov
2013-05-20 20:40 ` Marcelo Tosatti
2013-05-21 3:36 ` Xiao Guangrong
2013-05-21 8:45 ` Gleb Natapov [this message]
2013-05-22 1:41 ` Marcelo Tosatti
2013-05-21 8:39 ` Gleb Natapov
2013-05-22 1:33 ` Marcelo Tosatti
2013-05-22 6:34 ` Gleb Natapov
2013-05-22 8:46 ` Xiao Guangrong
2013-05-22 8:54 ` Gleb Natapov
2013-05-22 9:41 ` Xiao Guangrong
2013-05-22 13:17 ` Gleb Natapov
2013-05-22 15:25 ` Xiao Guangrong
2013-05-22 15:42 ` Gleb Natapov
2013-05-22 15:06 ` Marcelo Tosatti
2013-05-16 21:12 ` [PATCH v6 4/7] KVM: MMU: zap pages in batch Xiao Guangrong
2013-05-16 21:13 ` [PATCH v6 5/7] KVM: x86: use the fast way to invalidate all pages Xiao Guangrong
2013-05-16 21:13 ` [PATCH v6 6/7] KVM: MMU: show mmu_valid_gen in shadow page related tracepoints Xiao Guangrong
2013-05-16 21:13 ` [PATCH v6 7/7] KVM: MMU: add tracepoint for kvm_mmu_invalidate_all_pages Xiao Guangrong
2013-05-19 10:49 ` [PATCH v6 0/7] KVM: MMU: fast zap all shadow pages Gleb Natapov
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=20130521084551.GX4725@redhat.com \
--to=gleb@redhat.com \
--cc=avi.kivity@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=xiaoguangrong@linux.vnet.ibm.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