From: Marcelo Tosatti <mtosatti@redhat.com>
To: Avi Kivity <avi@redhat.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>, kvm@vger.kernel.org
Subject: Re: [PATCH v2] KVM: MMU: Don't use RCU for lockless shadow walking
Date: Thu, 26 Apr 2012 19:00:00 -0300 [thread overview]
Message-ID: <20120426220000.GA30343@amt.cnet> (raw)
In-Reply-To: <1335260845-16271-1-git-send-email-avi@redhat.com>
On Tue, Apr 24, 2012 at 12:47:25PM +0300, Avi Kivity wrote:
> Using RCU for lockless shadow walking can increase the amount of memory
> in use by the system, since RCU grace periods are unpredictable. We also
> have an unconditional write to a shared variable (reader_counter), which
> isn't good for scaling.
>
> Replace that with a scheme similar to x86's get_user_pages_fast(): disable
> interrupts during lockless shadow walk to force the freer
> (kvm_mmu_commit_zap_page()) to wait for the TLB flush IPI to find the
> processor with interrupts enabled.
>
> We also add a new vcpu->mode, READING_SHADOW_PAGE_TABLES, to prevent
> kvm_flush_remote_tlbs() from avoiding the IPI.
>
> Signed-off-by: Avi Kivity <avi@redhat.com>
> ---
> arch/x86/include/asm/kvm_host.h | 4 ---
> arch/x86/kvm/mmu.c | 72 +++++++++++++++------------------------
> include/linux/kvm_host.h | 3 +-
> 3 files changed, 30 insertions(+), 49 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index f624ca7..67e66e6 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -237,8 +237,6 @@ struct kvm_mmu_page {
> #endif
>
> int write_flooding_count;
> -
> - struct rcu_head rcu;
> };
>
> struct kvm_pio_request {
> @@ -536,8 +534,6 @@ struct kvm_arch {
> u64 hv_guest_os_id;
> u64 hv_hypercall;
>
> - atomic_t reader_counter;
> -
> #ifdef CONFIG_KVM_MMU_AUDIT
> int audit_point;
> #endif
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index 07424cf..ef88034 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -551,19 +551,28 @@ static u64 mmu_spte_get_lockless(u64 *sptep)
>
> static void walk_shadow_page_lockless_begin(struct kvm_vcpu *vcpu)
> {
> - rcu_read_lock();
> - atomic_inc(&vcpu->kvm->arch.reader_counter);
> -
> - /* Increase the counter before walking shadow page table */
> - smp_mb__after_atomic_inc();
> + /*
> + * Prevent page table teardown by making any free-er wait during
> + * kvm_flush_remote_tlbs() IPI to all active vcpus.
> + */
> + local_irq_disable();
> + vcpu->mode = READING_SHADOW_PAGE_TABLES;
> + /*
> + * wmb: advertise vcpu->mode change
> + * rmb: make sure we see updated sptes
> + */
> + smp_mb();
> }
>
> static void walk_shadow_page_lockless_end(struct kvm_vcpu *vcpu)
> {
> - /* Decrease the counter after walking shadow page table finished */
> - smp_mb__before_atomic_dec();
> - atomic_dec(&vcpu->kvm->arch.reader_counter);
> - rcu_read_unlock();
> + /*
> + * Make our reads and writes to shadow page tables globally visible
> + * before leaving READING_SHADOW_PAGE_TABLES mode.
> + */
This comment is misleading. Writes to shadow page tables must be
performed with locked instructions outside the mmu_lock.
> + smp_mb();
> + vcpu->mode = OUTSIDE_GUEST_MODE;
Don't you want
vcpu->mode = OUTSIDE_GUEST_MODE;
smp_mb();
So that vcpu->mode update is globally visible before subsequent loads
execute?
next prev parent reply other threads:[~2012-04-26 23:45 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-24 9:47 [PATCH v2] KVM: MMU: Don't use RCU for lockless shadow walking Avi Kivity
2012-04-24 10:13 ` Xiao Guangrong
2012-04-24 10:42 ` Avi Kivity
2012-04-26 22:00 ` Marcelo Tosatti [this message]
2012-04-27 6:07 ` Xiao Guangrong
2012-04-27 21:49 ` Marcelo Tosatti
2012-04-29 9:38 ` Avi Kivity
2012-04-29 9:35 ` 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=20120426220000.GA30343@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--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