aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-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