diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2008-09-16 19:54:47 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-10-15 08:25:06 -0400 |
commit | 4c2155ce81c193788082d4b8cdbc26d79edebc58 (patch) | |
tree | 5c028fe4a18c55b5c0e9c4e80be459dad3f96da7 /arch/x86/kvm/x86.c | |
parent | 777b3f49d297e387866604093b635e5bc9b9d2a6 (diff) |
KVM: switch to get_user_pages_fast
Convert gfn_to_pfn to use get_user_pages_fast, which can do lockless
pagetable lookups on x86. Kernel compilation on 4-way guest is 3.7%
faster on VMX.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 6 |
1 files changed, 0 insertions, 6 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 61eddbeabeb4..108f07267e87 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -946,10 +946,8 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
946 | /* ...but clean it before doing the actual write */ | 946 | /* ...but clean it before doing the actual write */ |
947 | vcpu->arch.time_offset = data & ~(PAGE_MASK | 1); | 947 | vcpu->arch.time_offset = data & ~(PAGE_MASK | 1); |
948 | 948 | ||
949 | down_read(¤t->mm->mmap_sem); | ||
950 | vcpu->arch.time_page = | 949 | vcpu->arch.time_page = |
951 | gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT); | 950 | gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT); |
952 | up_read(¤t->mm->mmap_sem); | ||
953 | 951 | ||
954 | if (is_error_page(vcpu->arch.time_page)) { | 952 | if (is_error_page(vcpu->arch.time_page)) { |
955 | kvm_release_page_clean(vcpu->arch.time_page); | 953 | kvm_release_page_clean(vcpu->arch.time_page); |
@@ -2322,9 +2320,7 @@ static int emulator_cmpxchg_emulated(unsigned long addr, | |||
2322 | 2320 | ||
2323 | val = *(u64 *)new; | 2321 | val = *(u64 *)new; |
2324 | 2322 | ||
2325 | down_read(¤t->mm->mmap_sem); | ||
2326 | page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); | 2323 | page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); |
2327 | up_read(¤t->mm->mmap_sem); | ||
2328 | 2324 | ||
2329 | kaddr = kmap_atomic(page, KM_USER0); | 2325 | kaddr = kmap_atomic(page, KM_USER0); |
2330 | set_64bit((u64 *)(kaddr + offset_in_page(gpa)), val); | 2326 | set_64bit((u64 *)(kaddr + offset_in_page(gpa)), val); |
@@ -3089,9 +3085,7 @@ static void vapic_enter(struct kvm_vcpu *vcpu) | |||
3089 | if (!apic || !apic->vapic_addr) | 3085 | if (!apic || !apic->vapic_addr) |
3090 | return; | 3086 | return; |
3091 | 3087 | ||
3092 | down_read(¤t->mm->mmap_sem); | ||
3093 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); | 3088 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); |
3094 | up_read(¤t->mm->mmap_sem); | ||
3095 | 3089 | ||
3096 | vcpu->arch.apic->vapic_page = page; | 3090 | vcpu->arch.apic->vapic_page = page; |
3097 | } | 3091 | } |