From: Marcelo Tosatti <mtosatti@redhat.com>
To: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.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 10/11] KVM: MMU: collapse TLB flushes when zap all pages
Date: Mon, 27 May 2013 21:36:11 -0300 [thread overview]
Message-ID: <20130528003611.GA1958@amt.cnet> (raw)
In-Reply-To: <1369252560-11611-11-git-send-email-xiaoguangrong@linux.vnet.ibm.com>
On Thu, May 23, 2013 at 03:55:59AM +0800, Xiao Guangrong wrote:
> kvm_zap_obsolete_pages uses lock-break technique to zap pages,
> it will flush tlb every time when it does lock-break
>
> We can reload mmu on all vcpus after updating the generation
> number so that the obsolete pages are not used on any vcpus,
> after that we do not need to flush tlb when obsolete pages
> are zapped
After that point batching is also not relevant anymore?
Still concerned about a similar case mentioned earlier:
"
Note the account for pages freed step after pages are actually
freed: as discussed with Takuya, having pages freed and freed page
accounting out of sync across mmu_lock is potentially problematic:
kvm->arch.n_used_mmu_pages and friends do not reflect reality which can
cause problems for SLAB freeing and page allocation throttling.
"
This is a real problem, if you decrease n_used_mmu_pages at
kvm_mmu_prepare_zap_page, but only actually free pages later
at kvm_mmu_commit_zap_page, there is the possibility of allowing
a huge number to be retained. There should be a maximum number of pages
at invalid_list.
(even higher possibility if you schedule without freeing pages reported
as released!).
> Note: kvm_mmu_commit_zap_page is still needed before free
> the pages since other vcpus may be doing locklessly shadow
> page walking
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
> ---
> arch/x86/kvm/mmu.c | 32 ++++++++++++++++++++++----------
> 1 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index e676356..5e34056 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -4237,8 +4237,6 @@ static void kvm_zap_obsolete_pages(struct kvm *kvm)
> restart:
> list_for_each_entry_safe_reverse(sp, node,
> &kvm->arch.active_mmu_pages, link) {
> - int ret;
> -
> /*
> * No obsolete page exists before new created page since
> * active_mmu_pages is the FIFO list.
> @@ -4254,21 +4252,24 @@ restart:
> if (sp->role.invalid)
> continue;
>
> + /*
> + * Need not flush tlb since we only zap the sp with invalid
> + * generation number.
> + */
> if (batch >= BATCH_ZAP_PAGES &&
> - (need_resched() || spin_needbreak(&kvm->mmu_lock))) {
> + cond_resched_lock(&kvm->mmu_lock)) {
> batch = 0;
> - kvm_mmu_commit_zap_page(kvm, &invalid_list);
> - cond_resched_lock(&kvm->mmu_lock);
> goto restart;
> }
>
> - ret = kvm_mmu_prepare_zap_page(kvm, sp, &invalid_list);
> - batch += ret;
> -
> - if (ret)
> - goto restart;
> + batch += kvm_mmu_prepare_zap_obsolete_page(kvm, sp,
> + &invalid_list);
> }
>
> + /*
> + * Should flush tlb before free page tables since lockless-walking
> + * may use the pages.
> + */
> kvm_mmu_commit_zap_page(kvm, &invalid_list);
> }
>
> @@ -4287,6 +4288,17 @@ void kvm_mmu_invalidate_zap_all_pages(struct kvm *kvm)
> trace_kvm_mmu_invalidate_zap_all_pages(kvm);
> 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.
> + *
> + * Note: we should do this under the protection of
> + * mmu-lock, otherwise, vcpu would purge shadow page
> + * but miss tlb flush.
> + */
> + kvm_reload_remote_mmus(kvm);
> +
> kvm_zap_obsolete_pages(kvm);
> spin_unlock(&kvm->mmu_lock);
> }
> --
> 1.7.7.6
next prev parent reply other threads:[~2013-05-28 0:36 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
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 [this message]
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=20130528003611.GA1958@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi.kivity@gmail.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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 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.