All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marcelo Tosatti <mtosatti@redhat.com>
To: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Avi Kivity <avi@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	KVM <kvm@vger.kernel.org>
Subject: Re: [PATCH v3 04/19] KVM: MMU: cache mmio info on page fault path
Date: Tue, 5 Jul 2011 16:04:57 -0300	[thread overview]
Message-ID: <20110705190457.GA24417@amt.cnet> (raw)
In-Reply-To: <4E0C31EA.5070403@cn.fujitsu.com>

On Thu, Jun 30, 2011 at 04:20:58PM +0800, Xiao Guangrong wrote:
> If the page fault is caused by mmio, we can cache the mmio info, later, we do
> not need to walk guest page table and quickly know it is a mmio fault while we
> emulate the mmio instruction
> 
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> ---
>  arch/x86/include/asm/kvm_host.h |    5 +++++
>  arch/x86/kvm/mmu.c              |   21 +++++++--------------
>  arch/x86/kvm/mmu.h              |   23 +++++++++++++++++++++++
>  arch/x86/kvm/paging_tmpl.h      |   21 ++++++++++++++-------
>  arch/x86/kvm/x86.c              |   11 +++++++++++
>  arch/x86/kvm/x86.h              |   36 ++++++++++++++++++++++++++++++++++++
>  6 files changed, 96 insertions(+), 21 deletions(-)
> 

> index 7086ca8..05310b1 100644
> --- a/arch/x86/kvm/mmu.h
> +++ b/arch/x86/kvm/mmu.h
> @@ -76,4 +76,27 @@ static inline int is_present_gpte(unsigned long pte)
>  	return pte & PT_PRESENT_MASK;
>  }
>  
> +static inline int is_writable_pte(unsigned long pte)
> +{
> +	return pte & PT_WRITABLE_MASK;
> +}
> +
> +static inline bool is_write_protection(struct kvm_vcpu *vcpu)
> +{
> +	return kvm_read_cr0_bits(vcpu, X86_CR0_WP);
> +}
> +
> +static inline bool check_write_user_access(struct kvm_vcpu *vcpu,
> +					   bool write_fault, bool user_fault,
> +					   unsigned long pte)
> +{
> +	if (unlikely(write_fault && !is_writable_pte(pte)
> +	      && (user_fault || is_write_protection(vcpu))))
> +		return false;
> +
> +	if (unlikely(user_fault && !(pte & PT_USER_MASK)))
> +		return false;
> +
> +	return true;
> +}
>  #endif
> diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
> index 1caeb4d..13978dc 100644
> --- a/arch/x86/kvm/paging_tmpl.h
> +++ b/arch/x86/kvm/paging_tmpl.h
> @@ -201,11 +201,8 @@ walk:
>  			break;
>  		}
>  
> -		if (unlikely(write_fault && !is_writable_pte(pte)
> -			     && (user_fault || is_write_protection(vcpu))))
> -			eperm = true;
> -
> -		if (unlikely(user_fault && !(pte & PT_USER_MASK)))
> +		if (!check_write_user_access(vcpu, write_fault, user_fault,
> +					  pte))
>  			eperm = true;
>  
>  #if PTTYPE == 64
> @@ -631,8 +628,16 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code,
>  		return 0;
>  
>  	/* mmio */
> -	if (is_error_pfn(pfn))
> -		return kvm_handle_bad_page(vcpu->kvm, walker.gfn, pfn);
> +	if (is_error_pfn(pfn)) {
> +		unsigned access = walker.pte_access;
> +		bool dirty = is_dirty_gpte(walker.ptes[walker.level - 1]);
> +
> +		if (dirty)
> +			access &= ~ACC_WRITE_MASK;
> +
> +		return kvm_handle_bad_page(vcpu, mmu_is_nested(vcpu) ? 0 :
> +					   addr, access, walker.gfn, pfn);
> +	}

Don't get this... if guest pte is dirty you cache without allowing
write access? Why?


  reply	other threads:[~2011-07-05 21:08 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-30  8:19 [PATCH v3 01/19] KVM: MMU: fix walking shadow page table Xiao Guangrong
2011-06-30  8:19 ` [PATCH v3 02/19] KVM: MMU: do not update slot bitmap if spte is nonpresent Xiao Guangrong
2011-06-30  8:20 ` [PATCH v3 03/19] KVM: x86: introduce vcpu_mmio_gva_to_gpa to cleanup the code Xiao Guangrong
2011-06-30  8:20 ` [PATCH v3 04/19] KVM: MMU: cache mmio info on page fault path Xiao Guangrong
2011-07-05 19:04   ` Marcelo Tosatti [this message]
2011-07-06  1:17     ` Xiao Guangrong
2011-06-30  8:21 ` [PATCH v3 05/19] KVM: MMU: optimize to handle dirty bit Xiao Guangrong
2011-07-05 19:27   ` Marcelo Tosatti
2011-07-06  1:22     ` Xiao Guangrong
2011-07-06 16:51       ` Marcelo Tosatti
2011-07-06 19:12         ` Xiao Guangrong
2011-07-07  8:15           ` Marcelo Tosatti
2011-06-30  8:21 ` [PATCH v3 06/19] KVM: MMU: cleanup for FNAME(fetch) Xiao Guangrong
2011-06-30  8:22 ` [PATCH v3 07/19] KVM: MMU: rename 'pt_write' to 'emulate' Xiao Guangrong
2011-06-30  8:22 ` [PATCH v3 08/19] KVM: MMU: count used shadow pages on prepareing path Xiao Guangrong
2011-06-30  8:23 ` [PATCH v3 09/19] KVM: MMU: split kvm_mmu_free_page Xiao Guangrong
2011-06-30  8:23 ` [PATCH v3 10/19] KVM: MMU: remove bypass_guest_pf Xiao Guangrong
2011-06-30  8:24 ` [PATCH v3 11/19] KVM: MMU: filter out the mmio pfn from the fault pfn Xiao Guangrong
2011-07-06 17:17   ` Marcelo Tosatti
2011-07-06 19:13     ` Xiao Guangrong
2011-06-30  8:24 ` [PATCH v3 12/19] KVM: MMU: abstract some functions to handle " Xiao Guangrong
2011-06-30  8:25 ` [PATCH v3 13/19] KVM: MMU: introduce the rules to modify shadow page table Xiao Guangrong
2011-06-30  8:25 ` [PATCH v3 14/19] KVM: MMU: clean up spte updating and clearing Xiao Guangrong
2011-07-06 17:39   ` Marcelo Tosatti
2011-07-06 19:18     ` Xiao Guangrong
2011-07-07  8:16       ` Marcelo Tosatti
2011-07-07  9:30         ` Xiao Guangrong
2011-06-30  8:26 ` [PATCH v3 15/19] KVM: MMU: do not need atomicly to set/clear spte Xiao Guangrong
2011-06-30  8:26 ` [PATCH v3 16/19] KVM: MMU: lockless walking shadow page table Xiao Guangrong
2011-07-06 18:08   ` Marcelo Tosatti
2011-07-06 19:26     ` Xiao Guangrong
2011-07-07  8:18       ` Marcelo Tosatti
2011-06-30  8:26 ` [PATCH v3 17/19] KVM: MMU: reorganize struct kvm_shadow_walk_iterator Xiao Guangrong
2011-06-30  8:27 ` [PATCH v3 18/19] KVM: MMU: mmio page fault support Xiao Guangrong
2011-07-06 18:52   ` Marcelo Tosatti
2011-07-06 19:59     ` Xiao Guangrong
2011-07-07  8:49       ` Marcelo Tosatti
2011-06-30  8:28 ` [PATCH v3 19/19] KVM: MMU: trace mmio page fault 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=20110705190457.GA24417@amt.cnet \
    --to=mtosatti@redhat.com \
    --cc=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=xiaoguangrong@cn.fujitsu.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.