All of lore.kernel.org
 help / color / mirror / Atom feed
From: Emre Can Sezer <ecsezer@ncsu.edu>
To: Tim Deegan <Tim.Deegan@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: Re: Two shadow page tables for HVM
Date: Fri, 09 Jan 2009 17:08:59 -0500	[thread overview]
Message-ID: <4967CAFB.7090907@ncsu.edu> (raw)
In-Reply-To: <20081229165415.GB5734@york.uk.xensource.com>

I finally got around to implementing two paging modes.  Everything works 
fine until I swap modes :)

I get a shadow page fault with error_code 0.  This happens right after I 
swap the paging mode.  Any clues as to what might be the cause?

I walked through the code that updates paging modes.  It appears that we 
simply make an *empty* top level shadow and install it as top level 
shadow page table.  If this is the case, shouldn't the first fault have 
a non-zero error code?

Thanks,

John

Tim Deegan wrote:
> Hi,
>
> At 11:16 -0500 on 29 Dec (1230549392), Emre Can Sezer wrote:
>   
>> I've been trying to understand the shadow code for a while now and I have 
>> one last question about this approach.  In my case, the guest OS will have 
>> only a single set of page tables and in return I will have two sets of 
>> shadows for them.  I understand that once you change your shadow mode, the 
>> shadow pages are still kept and the mapping is stored in the shadow cache.  
>> However, if a page table is updated in one mode, how does the other mode 
>> know of this change? As far as I understand, the same gfn will be inserted 
>> to the hash twice with two types.  However, does Xen determine that the 
>> guest page's contents have changed? That change must somehow propagate to 
>> the second shadow mode's page tables with the appropriate permission 
>> changes. How is this being done? How does Xen determine that the page 
>> contents have changed?
>>     
>
> When making PTEs in the shadow tables, we never put in a writeable
> mapping of a page that has any shadows.  Then, in the pagefault handler,
> we spot that the guest is writing to a shadowed page and call the
> emulator so we can figure out what it's trying to write.  The emulator
> calls us back when it wants to write to memory, and in the callback we
> call the propagation code for _every_ kind of shadow the page has.
>
> We need to do that even within a single paging mode, because if the
> guest uses linear page tables a single page can be shadowed as l4, l3,
> l2 and l1 at the same time.
>
> The "out of sync" optimization relaxes the rule of never allowing a
> writeable mapping of a shadowed page, but it doesn't apply to pages that
> are shadowed more than once anyway.  Might be best to turn it off
> while you're working in this, anyway. :)
>
> Cheers,
>
> Tim.
>
>   
>>>> The reason I was thinking of synchronized page tables is because I will 
>>>> have to switch between them quite often - several times during a system 
>>>> call.  So I want to minimize the tlb flushes and make the switch as fast 
>>>> as possible.  With synced PT's, my plan was to set the guest CR3 to point 
>>>> to the new top level page table and only flush the kernel pages.
>>>>     
>>>>         
>>> That might be just as expensive -- ISTR Keir measured the cost of invlpg
>>> vs TLB flush a while ago and found that invlpg'ing more than one or two
>>> PTEs was slower than just flushing the whole TLB.
>>>
>>>   
>>>       
>>>> When considering the performance penalties of flushing the kernel page 
>>>> tables from the TLB, how significant is traversing all the shadow page 
>>>> tables for the guest kernel and updating their permissions?  If there 
>>>> isn't an order of magnitude of difference, it might be reasonable to take 
>>>> the short cut in implementation.
>>>>     
>>>>         
>>> I don't have any measurements for doing walks of the whole set of
>>> shadows, but in general we've found it's worth doing almost any trick
>>> that will avoid that.
>>>
>>> Cheers,
>>>
>>> Tim.
>>>
>>>   
>>>       
>>     
>
>   

  parent reply	other threads:[~2009-01-09 22:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-17 23:06 Two shadow page tables for HVM Emre Can Sezer
2008-12-18  3:50 ` Sina Bahram
2008-12-18 11:32 ` Tim Deegan
2008-12-22 18:28   ` Emre Can Sezer
2008-12-23 12:03     ` Gianluca Guida
     [not found]   ` <494FC8C7.8030508@ncsu.edu>
     [not found]     ` <20081223161006.GB28336@york.uk.xensource.com>
2008-12-29 16:17       ` Emre Can Sezer
     [not found]       ` <4958F7E0.8050207@ncsu.edu>
     [not found]         ` <20081229165415.GB5734@york.uk.xensource.com>
2009-01-09 22:08           ` Emre Can Sezer [this message]
2009-01-12  9:46             ` Tim Deegan
2009-01-27  0:39               ` Emre Can Sezer
2009-01-27 10:34                 ` Tim Deegan
2009-01-27 19:07                   ` Emre Can Sezer
2009-01-28  9:25                     ` Tim Deegan
2009-01-30 16:15                   ` Emre Can Sezer

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=4967CAFB.7090907@ncsu.edu \
    --to=ecsezer@ncsu.edu \
    --cc=Tim.Deegan@citrix.com \
    --cc=xen-devel@lists.xensource.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.