diff options
author | Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> | 2011-07-11 15:27:14 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-07-24 04:50:32 -0400 |
commit | bd4c86eaa6ff10abc4e00d0f45d2a28b10b09df4 (patch) | |
tree | 3e3cecd289b6fca2655e286de95f6542ad360d3c /arch/x86/kvm/mmu.c | |
parent | aa6bd187af013319c3f18be7b0970d9a3d1be696 (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.c | 21 |
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 | ||
1042 | static 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 | */ | ||
1048 | static 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 | */ | ||
1060 | static 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 | ||