kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marcelo Tosatti <mtosatti@redhat.com>
To: Sheng Yang <sheng@linux.intel.com>
Cc: Avi Kivity <avi@redhat.com>, kvm@vger.kernel.org
Subject: Re: [PATCH 4/4] VMX: x86: Only reset MMU when necessary
Date: Tue, 11 May 2010 16:36:26 -0300	[thread overview]
Message-ID: <20100511193625.GG9712@amt.cnet> (raw)
In-Reply-To: <1273555807-11534-4-git-send-email-sheng@linux.intel.com>

On Tue, May 11, 2010 at 01:30:07PM +0800, Sheng Yang wrote:
> Only modifying some bits of CR0/CR4 needs paging mode switch.
> 
> Add update_rsvd_bits_mask() to address EFER.NX bit updating for reserved bits.
> 
> Signed-off-by: Sheng Yang <sheng@linux.intel.com>
> ---
>  arch/x86/include/asm/kvm_host.h |    1 +
>  arch/x86/kvm/mmu.c              |   17 ++++++++++++++---
>  arch/x86/kvm/x86.c              |   14 ++++++++++++--
>  3 files changed, 27 insertions(+), 5 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index ed48904..c8c8a03 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -553,6 +553,7 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot);
>  void kvm_mmu_zap_all(struct kvm *kvm);
>  unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm);
>  void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages);
> +void update_rsvd_bits_mask(struct kvm_vcpu *vcpu);
>  
>  int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3);
>  
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index 5412185..98abdcf 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -2335,6 +2335,19 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level)
>  	}
>  }
>  
> +void update_rsvd_bits_mask(struct kvm_vcpu *vcpu)
> +{
> +	if (!is_paging(vcpu))
> +		return;
> +	if (is_long_mode(vcpu))
> +		reset_rsvds_bits_mask(vcpu, PT64_ROOT_LEVEL);
> +	else if (is_pae(vcpu))
> +		reset_rsvds_bits_mask(vcpu, PT32E_ROOT_LEVEL);
> +	else
> +		reset_rsvds_bits_mask(vcpu, PT32_ROOT_LEVEL);
> +}
> +EXPORT_SYMBOL_GPL(update_rsvd_bits_mask);
> +
>  static int paging64_init_context_common(struct kvm_vcpu *vcpu, int level)
>  {
>  	struct kvm_mmu *context = &vcpu->arch.mmu;
> @@ -2400,18 +2413,16 @@ static int init_kvm_tdp_mmu(struct kvm_vcpu *vcpu)
>  		context->gva_to_gpa = nonpaging_gva_to_gpa;
>  		context->root_level = 0;
>  	} else if (is_long_mode(vcpu)) {
> -		reset_rsvds_bits_mask(vcpu, PT64_ROOT_LEVEL);
>  		context->gva_to_gpa = paging64_gva_to_gpa;
>  		context->root_level = PT64_ROOT_LEVEL;
>  	} else if (is_pae(vcpu)) {
> -		reset_rsvds_bits_mask(vcpu, PT32E_ROOT_LEVEL);
>  		context->gva_to_gpa = paging64_gva_to_gpa;
>  		context->root_level = PT32E_ROOT_LEVEL;
>  	} else {
> -		reset_rsvds_bits_mask(vcpu, PT32_ROOT_LEVEL);
>  		context->gva_to_gpa = paging32_gva_to_gpa;
>  		context->root_level = PT32_ROOT_LEVEL;
>  	}
> +	update_rsvd_bits_mask(vcpu);
>  
>  	return 0;
>  }
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b59fc67..1c76e08 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -416,6 +416,9 @@ out:
>  
>  static int __kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
>  {
> +	unsigned long old_cr0 = kvm_read_cr0(vcpu);
> +	unsigned long update_bits = X86_CR0_PG | X86_CR0_PE;

If PAE paging would be in use following an execution of MOV to CR0 or
MOV to CR4 (see Section 4.1.1) and the instruction is modifying any of
CR0.CD, CR0.NW, CR0.PG, CR4.PAE, CR4.PGE, or CR4.PSE; then the PDPTEs
are loaded from the address in CR3.

If the PDPTRS changed, the mmu must be reloaded.


  reply	other threads:[~2010-05-11 19:36 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-11  5:30 [PATCH 1/4] KVM: x86: Check LMA bit before set_efer Sheng Yang
2010-05-11  5:30 ` [PATCH 2/4] KVM: Clean up duplicate assignment Sheng Yang
2010-05-11  5:30 ` [PATCH 3/4] KVM: x86: Remove kvm_mmu_reset_context() in kvm_set_efer() Sheng Yang
2010-05-11 19:33   ` Marcelo Tosatti
2010-05-11  5:30 ` [PATCH 4/4] VMX: x86: Only reset MMU when necessary Sheng Yang
2010-05-11 19:36   ` Marcelo Tosatti [this message]
2010-05-12  1:53     ` Sheng Yang
2010-05-12  2:09       ` Sheng Yang
2010-05-12  6:31         ` Avi Kivity
2010-05-12  6:33           ` [PATCH 1/4] KVM: x86: Check LMA bit before set_efer Sheng Yang
2010-05-12  6:33           ` [PATCH 2/4] KVM: Clean up duplicate assignment Sheng Yang
2010-05-12  6:33           ` [PATCH 3/4] KVM: x86: Remove kvm_mmu_reset_context() in kvm_set_efer() Sheng Yang
2010-05-12  6:33           ` [PATCH 4/4] VMX: x86: Only reset MMU when necessary Sheng Yang
2010-05-12  6:59             ` Avi Kivity
2010-05-12  7:31               ` Sheng Yang
2010-05-12  8:11                 ` 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=20100511193625.GG9712@amt.cnet \
    --to=mtosatti@redhat.com \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=sheng@linux.intel.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).