KVM: MMU: document fast invalidate all pages
Document it to Documentation/virtual/kvm/mmu.txt Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2d49c47f35
commit
f6f8adeef5
@ -210,6 +210,10 @@ Shadow pages contain the following information:
|
|||||||
A bitmap indicating which sptes in spt point (directly or indirectly) at
|
A bitmap indicating which sptes in spt point (directly or indirectly) at
|
||||||
pages that may be unsynchronized. Used to quickly locate all unsychronized
|
pages that may be unsynchronized. Used to quickly locate all unsychronized
|
||||||
pages reachable from a given page.
|
pages reachable from a given page.
|
||||||
|
mmu_valid_gen:
|
||||||
|
Generation number of the page. It is compared with kvm->arch.mmu_valid_gen
|
||||||
|
during hash table lookup, and used to skip invalidated shadow pages (see
|
||||||
|
"Zapping all pages" below.)
|
||||||
clear_spte_count:
|
clear_spte_count:
|
||||||
Only present on 32-bit hosts, where a 64-bit spte cannot be written
|
Only present on 32-bit hosts, where a 64-bit spte cannot be written
|
||||||
atomically. The reader uses this while running out of the MMU lock
|
atomically. The reader uses this while running out of the MMU lock
|
||||||
@ -375,6 +379,27 @@ causes its write_count to be incremented, thus preventing instantiation of
|
|||||||
a large spte. The frames at the end of an unaligned memory slot have
|
a large spte. The frames at the end of an unaligned memory slot have
|
||||||
artificially inflated ->write_counts so they can never be instantiated.
|
artificially inflated ->write_counts so they can never be instantiated.
|
||||||
|
|
||||||
|
Zapping all pages (page generation count)
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
For the large memory guests, walking and zapping all pages is really slow
|
||||||
|
(because there are a lot of pages), and also blocks memory accesses of
|
||||||
|
all VCPUs because it needs to hold the MMU lock.
|
||||||
|
|
||||||
|
To make it be more scalable, kvm maintains a global generation number
|
||||||
|
which is stored in kvm->arch.mmu_valid_gen. Every shadow page stores
|
||||||
|
the current global generation-number into sp->mmu_valid_gen when it
|
||||||
|
is created. Pages with a mismatching generation number are "obsolete".
|
||||||
|
|
||||||
|
When KVM need zap all shadow pages sptes, it just simply increases the global
|
||||||
|
generation-number then reload root shadow pages on all vcpus. As the VCPUs
|
||||||
|
create new shadow page tables, the old pages are not used because of the
|
||||||
|
mismatching generation number.
|
||||||
|
|
||||||
|
KVM then walks through all pages and zaps obsolete pages. While the zap
|
||||||
|
operation needs to take the MMU lock, the lock can be released periodically
|
||||||
|
so that the VCPUs can make progress.
|
||||||
|
|
||||||
Further reading
|
Further reading
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
@ -222,7 +222,10 @@ struct kvm_mmu_page {
|
|||||||
int root_count; /* Currently serving as active root */
|
int root_count; /* Currently serving as active root */
|
||||||
unsigned int unsync_children;
|
unsigned int unsync_children;
|
||||||
unsigned long parent_ptes; /* Reverse mapping for parent_pte */
|
unsigned long parent_ptes; /* Reverse mapping for parent_pte */
|
||||||
|
|
||||||
|
/* The page is obsolete if mmu_valid_gen != kvm->arch.mmu_valid_gen. */
|
||||||
unsigned long mmu_valid_gen;
|
unsigned long mmu_valid_gen;
|
||||||
|
|
||||||
DECLARE_BITMAP(unsync_child_bitmap, 512);
|
DECLARE_BITMAP(unsync_child_bitmap, 512);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
|
Loading…
Reference in New Issue
Block a user