All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marcelo Tosatti <mtosatti@redhat.com>
To: Avi Kivity <avi@redhat.com>
Cc: kvm-devel <kvm@vger.kernel.org>
Subject: Re: KVM: MMU: optimize set_spte for page sync
Date: Tue, 25 Nov 2008 15:58:07 +0100	[thread overview]
Message-ID: <20081125145807.GA14994@dmt.cnet> (raw)
In-Reply-To: <492C0DD5.7070206@redhat.com>

On Tue, Nov 25, 2008 at 04:38:13PM +0200, Avi Kivity wrote:
> Marcelo Tosatti wrote:
>> *shadow_pte can point to a different page if the guest updates
>> pagetable, there is a fault before resync, the fault updates the
>> spte with new gfn (and pfn) via mmu_set_spte. In which case the gfn
>> cache is updated since:
>>
>>                     } else if (pfn != spte_to_pfn(*shadow_pte)) {
>>                         printk("hfn old %lx new %lx\n",
>>                                  spte_to_pfn(*shadow_pte), pfn);
>>                         rmap_remove(vcpu->kvm, shadow_pte);
>>   
>
> Okay.  Please resend but without the reversal of can_unsync, it will  
> make a more readable patch.  If you like, send a follow on that only  
> does the reversal.

Here it goes.

KVM: MMU: optimize set_spte for page sync

The write protect verification in set_spte is unnecessary for page sync.

Its guaranteed that, if the unsync spte was writable, the target page
does not have a write protected shadow (if it had, the spte would have
been write protected under mmu_lock by rmap_write_protect before).

Same reasoning applies to mark_page_dirty: the gfn has been marked as
dirty via the pagefault path.

The cost of hash table and memslot lookups are quite significant if the
workload is pagetable write intensive resulting in increased mmu_lock
contention.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: kvm/arch/x86/kvm/mmu.c
===================================================================
--- kvm.orig/arch/x86/kvm/mmu.c
+++ kvm/arch/x86/kvm/mmu.c
@@ -1593,6 +1593,15 @@ static int set_spte(struct kvm_vcpu *vcp
 
 		spte |= PT_WRITABLE_MASK;
 
+		/*
+ 	 	 * Optimization: for pte sync, if spte was writable the hash
+ 	 	 * lookup is unnecessary (and expensive). Write protection
+ 	 	 * is responsibility of mmu_get_page / kvm_sync_page.
+ 	 	 * Same reasoning can be applied to dirty page accounting.
+ 	 	 */
+		if (!can_unsync && is_writeble_pte(*shadow_pte))
+			goto set_pte;
+
 		if (mmu_need_write_protect(vcpu, gfn, can_unsync)) {
 			pgprintk("%s: found shadow page for %lx, marking ro\n",
 				 __func__, gfn);


  reply	other threads:[~2008-11-25 18:00 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-21 18:49 KVM: MMU: optimize set_spte for page sync Marcelo Tosatti
2008-11-23 10:36 ` Avi Kivity
2008-11-24 12:04   ` Marcelo Tosatti
2008-11-24 13:23     ` Marcelo Tosatti
2008-11-25 14:38       ` Avi Kivity
2008-11-25 14:58         ` Marcelo Tosatti [this message]
2008-11-26 11:12           ` Avi Kivity
2008-12-09 15:52             ` Marcelo Tosatti
2008-12-10  9:14               ` Avi Kivity
2008-12-10 12:54                 ` Marcelo Tosatti

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=20081125145807.GA14994@dmt.cnet \
    --to=mtosatti@redhat.com \
    --cc=avi@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.