KVM: MMU: fast invalidate all mmio sptes
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Fri, 7 Jun 2013 08:51:26 +0000 (16:51 +0800)
committerGleb Natapov <gleb@redhat.com>
Thu, 27 Jun 2013 11:20:36 +0000 (14:20 +0300)
commitf8f559422b6c6a05469dfde614b67789b6142cb5
tree6a20c82079581d5af9a9e8d4ca83bc2266e01f21
parentb37fbea6cefc3a8ff7b6cfec9867432d1a10046d
KVM: MMU: fast invalidate all mmio sptes

This patch tries to introduce a very simple and scale way to invalidate
all mmio sptes - it need not walk any shadow pages and hold mmu-lock

KVM maintains a global mmio valid generation-number which is stored in
kvm->memslots.generation and every mmio spte stores the current global
generation-number into his available bits when it is created

When KVM need zap all mmio sptes, it just simply increase the global
generation-number. When guests do mmio access, KVM intercepts a MMIO #PF
then it walks the shadow page table and get the mmio spte. If the
generation-number on the spte does not equal the global generation-number,
it will go to the normal #PF handler to update the mmio spte

Since 19 bits are used to store generation-number on mmio spte, we zap all
mmio sptes when the number is round

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Reviewed-by: Gleb Natapov <gleb@redhat.com>
Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu.c
arch/x86/kvm/mmu.h
arch/x86/kvm/paging_tmpl.h
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c