All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: kvm@vger.kernel.org
Subject: Re: [PATCH] Flush TLB when D bit is manually changed.
Date: Fri, 09 Jan 2015 10:09:49 +0100	[thread overview]
Message-ID: <54AF9ADD.7090401@redhat.com> (raw)
In-Reply-To: <1420793070-27529-1-git-send-email-kai.huang@linux.intel.com>



On 09/01/2015 09:44, Kai Huang wrote:
> When software changes D bit (either from 1 to 0, or 0 to 1), the corresponding
> TLB entity in the hardware won't be updated immediately. We should flush it to
> guarantee the consistence of D bit between TLB and MMU page table in memory.
> This is required if some specific hardware feature uses D-bit status to do
> specific things.
> 
> Sanity test was done on my machine with Intel processor.
> 
> Signed-off-by: Kai Huang <kai.huang@linux.intel.com>
> ---
>  arch/x86/kvm/mmu.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
> index 978f402..1feac0c 100644
> --- a/arch/x86/kvm/mmu.c
> +++ b/arch/x86/kvm/mmu.c
> @@ -547,6 +547,11 @@ static bool spte_is_bit_cleared(u64 old_spte, u64 new_spte, u64 bit_mask)
>  	return (old_spte & bit_mask) && !(new_spte & bit_mask);
>  }
>  
> +static bool spte_is_bit_changed(u64 old_spte, u64 new_spte, u64 bit_mask)
> +{
> +	return (old_spte & bit_mask) != (new_spte & bit_mask);
> +}
> +
>  /* Rules for using mmu_spte_set:
>   * Set the sptep from nonpresent to present.
>   * Note: the sptep being assigned *must* be either not present
> @@ -597,6 +602,13 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
>  	if (!shadow_accessed_mask)
>  		return ret;
>  
> +	/*
> +	 * We also need to flush TLB when D-bit is changed by software to
> +	 * guarantee the D-bit consistence between TLB and MMU page table.
> +	 */
> +	if (spte_is_bit_changed(old_spte, new_spte, shadow_dirty_mask))

I think shadow_accessed_mask needs to be checked too.  I made the change
and applied the patch.

Paolo

> +		ret = true;
> +
>  	if (spte_is_bit_cleared(old_spte, new_spte, shadow_accessed_mask))
>  		kvm_set_pfn_accessed(spte_to_pfn(old_spte));
>  	if (spte_is_bit_cleared(old_spte, new_spte, shadow_dirty_mask))
> 


  reply	other threads:[~2015-01-09  9:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-09  8:44 [PATCH] Flush TLB when D bit is manually changed Kai Huang
2015-01-09  9:09 ` Paolo Bonzini [this message]
2015-01-09  9:09 ` Paolo Bonzini
2015-01-09  9:50 ` 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=54AF9ADD.7090401@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=kvm@vger.kernel.org \
    /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.