From: Marek Olszewski <mareko@csail.mit.edu>
To: Avi Kivity <avi@redhat.com>
Cc: kvm@vger.kernel.org
Subject: Re: Shadow page table questions
Date: Wed, 10 Mar 2010 19:06:06 -0500 [thread overview]
Message-ID: <4B9833EE.1070705@csail.mit.edu> (raw)
In-Reply-To: <4B976AA8.9030904@redhat.com>
Thanks for the response. I've looked through the code some more and
think I have figured it out now. I finally see that the root_hpa
variable gets switched before entering the guest in mmu_alloc_roots, to
correspond with the new cr3. Thanks again.
Perhaps you can help me with one more question. I was hoping to try out
a certain change for a research project. I would like to "privatize"
kvm_mmu_page's and their spe's for each guest thread running in certain
designated guest processes. The goal is to give each thread its own
shadow page table graphs that map the same guest logical addresses to
guest physical addresses (with some changes to be introduced later).
Are there any assumptions that KVM makes that will break if I do
something like this? I understand that I will have to add some code
throughout the mmu to make sure that these structures are synchronized
when a guest thread makes a change, but I'm wondering if there is
anything else. Does the reverse mapping data structure you have assume
that there is only one shadow page per guest page?
Thanks!
Marek
Avi Kivity wrote:
> On 03/10/2010 06:57 AM, Marek Olszewski wrote:
>> Hello,
>>
>> I was wondering if someone could point me to some documentation that
>> explains the basic non-nested-paging shadow page table
>> algorithm/strategy used by KVM. I understand that KVM caches shadow
>> page tables across context switches and that there is a reverse
>> mapping and page protection to help zap shadow page tables when the
>> guest page tables change. However, I'm not entirely sure how the
>> actual caching is done. At first I assumed that KVM would change the
>> host CR3 on every guest context switch such that it would point to a
>> cached shadow page table for the currently running guest user thread,
>> however, as far as I can tell, the host CR3 does not change so I'm a
>> little lost. If indeed it doesn't change the CR3, how does KVM solve
>> the problem that arises when two processes in the guest OS share the
>> same guest logical addresses?
>
> The host cr3 does change, though not by using the 'mov cr3'
> instruction (that would cause the host to immediately switch to the
> guest address space, which would be bad).
>
> See the calls to kvm_x86_ops->set_cr3().
>
>>
>> I'm also interested in figuring out what KVM does when running with
>> multiple virtual CPUs. Looking at the code, I can see that each VCPU
>> has its own root pointer to a shadow page table graph, but I have yet
>> to figure out if this graph has node's shared between VCPUs, or
>> whether they are all private.
>
> Everything is shared. If the guest is running with identical cr3s,
> kvm will load identical cr3s in guest mode.
>
> An exception is when we use 32-bit pae mode. In that case, the guest
> cr3s will be different (but guest PDPTRs will be identical). Instead
> of dealing with the pae cr3, we deal with the four PDPTRs.
>
next prev parent reply other threads:[~2010-03-11 0:11 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-10 4:57 Shadow page table questions Marek Olszewski
2010-03-10 9:47 ` Avi Kivity
2010-03-11 0:06 ` Marek Olszewski [this message]
2010-03-11 6:39 ` Avi Kivity
2010-03-11 16:14 ` Marek Olszewski
2010-03-13 8:51 ` Avi Kivity
2010-03-18 23:50 ` KVM Page Fault Question Marek Olszewski
2010-03-19 8:39 ` Avi Kivity
2010-04-02 4:41 ` Marek Olszewski
2010-04-02 6:39 ` Avi Kivity
[not found] ` <4BB614BC.9080608@csail.mit.edu>
2010-04-04 16:59 ` Avi Kivity
2010-04-22 5:26 ` Marek Olszewski
2010-04-22 6:52 ` Avi Kivity
[not found] ` <4BD0DFBE.1090103@csail.mit.edu>
2010-04-26 5:42 ` Marek Olszewski
2010-05-20 2:24 ` Shadow MMU state preserved across kvm_mmu_zap_all? Marek Olszewski
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=4B9833EE.1070705@csail.mit.edu \
--to=mareko@csail.mit.edu \
--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.