aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/mmu.c
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@cn.fujitsu.com>2011-07-11 15:27:14 -0400
committerAvi Kivity <avi@redhat.com>2011-07-24 04:50:32 -0400
commitbd4c86eaa6ff10abc4e00d0f45d2a28b10b09df4 (patch)
tree3e3cecd289b6fca2655e286de95f6542ad360d3c /arch/x86/kvm/mmu.c
parentaa6bd187af013319c3f18be7b0970d9a3d1be696 (diff)
KVM: MMU: split kvm_mmu_free_page
Split kvm_mmu_free_page to kvm_mmu_isolate_page and kvm_mmu_free_page One is used to remove the page from cache under mmu lock and the other is used to free page table out of mmu lock Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/mmu.c')
-rw-r--r--arch/x86/kvm/mmu.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 91d30695677b..2f8543c65fa3 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1039,14 +1039,28 @@ static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, int nr)
1039 percpu_counter_add(&kvm_total_used_mmu_pages, nr); 1039 percpu_counter_add(&kvm_total_used_mmu_pages, nr);
1040} 1040}
1041 1041
1042static void kvm_mmu_free_page(struct kvm_mmu_page *sp) 1042/*
1043 * Remove the sp from shadow page cache, after call it,
1044 * we can not find this sp from the cache, and the shadow
1045 * page table is still valid.
1046 * It should be under the protection of mmu lock.
1047 */
1048static void kvm_mmu_isolate_page(struct kvm_mmu_page *sp)
1043{ 1049{
1044 ASSERT(is_empty_shadow_page(sp->spt)); 1050 ASSERT(is_empty_shadow_page(sp->spt));
1045 hlist_del(&sp->hash_link); 1051 hlist_del(&sp->hash_link);
1046 list_del(&sp->link);
1047 free_page((unsigned long)sp->spt);
1048 if (!sp->role.direct) 1052 if (!sp->role.direct)
1049 free_page((unsigned long)sp->gfns); 1053 free_page((unsigned long)sp->gfns);
1054}
1055
1056/*
1057 * Free the shadow page table and the sp, we can do it
1058 * out of the protection of mmu lock.
1059 */
1060static void kvm_mmu_free_page(struct kvm_mmu_page *sp)
1061{
1062 list_del(&sp->link);
1063 free_page((unsigned long)sp->spt);
1050 kmem_cache_free(mmu_page_header_cache, sp); 1064 kmem_cache_free(mmu_page_header_cache, sp);
1051} 1065}
1052 1066
@@ -1678,6 +1692,7 @@ static void kvm_mmu_commit_zap_page(struct kvm *kvm,
1678 do { 1692 do {
1679 sp = list_first_entry(invalid_list, struct kvm_mmu_page, link); 1693 sp = list_first_entry(invalid_list, struct kvm_mmu_page, link);
1680 WARN_ON(!sp->role.invalid || sp->root_count); 1694 WARN_ON(!sp->role.invalid || sp->root_count);
1695 kvm_mmu_isolate_page(sp);
1681 kvm_mmu_free_page(sp); 1696 kvm_mmu_free_page(sp);
1682 } while (!list_empty(invalid_list)); 1697 } while (!list_empty(invalid_list));
1683 1698