diff options
author | Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> | 2011-03-09 02:41:04 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2011-03-17 12:08:34 -0400 |
commit | 40dcaa9f69fa303ddcb5ea65baf4efefed3aec4b (patch) | |
tree | d5c4d15fbbdb786c156e8f23afe1e025ab156c49 | |
parent | 1aa8ceef0312a6aae7dd863a120a55f1637b361d (diff) |
KVM: fix rcu usage in init_rmode_* functions
fix:
[ 3494.671786] stack backtrace:
[ 3494.671789] Pid: 10527, comm: qemu-system-x86 Not tainted 2.6.38-rc6+ #23
[ 3494.671790] Call Trace:
[ 3494.671796] [] ? lockdep_rcu_dereference+0x9d/0xa5
[ 3494.671826] [] ? kvm_memslots+0x6b/0x73 [kvm]
[ 3494.671834] [] ? gfn_to_memslot+0x16/0x4f [kvm]
[ 3494.671843] [] ? gfn_to_hva+0x16/0x27 [kvm]
[ 3494.671851] [] ? kvm_write_guest_page+0x31/0x83 [kvm]
[ 3494.671861] [] ? kvm_clear_guest_page+0x1a/0x1c [kvm]
[ 3494.671867] [] ? vmx_set_tss_addr+0x83/0x122 [kvm_intel]
and:
[ 8328.789599] stack backtrace:
[ 8328.789601] Pid: 18736, comm: qemu-system-x86 Not tainted 2.6.38-rc6+ #23
[ 8328.789603] Call Trace:
[ 8328.789609] [] ? lockdep_rcu_dereference+0x9d/0xa5
[ 8328.789621] [] ? kvm_memslots+0x6b/0x73 [kvm]
[ 8328.789628] [] ? gfn_to_memslot+0x16/0x4f [kvm]
[ 8328.789635] [] ? gfn_to_hva+0x16/0x27 [kvm]
[ 8328.789643] [] ? kvm_write_guest_page+0x31/0x83 [kvm]
[ 8328.789699] [] ? kvm_clear_guest_page+0x1a/0x1c [kvm]
[ 8328.789713] [] ? vmx_create_vcpu+0x316/0x3c8 [kvm_intel]
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | arch/x86/kvm/vmx.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 3febb763cb7f..d8475a26add6 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -2397,11 +2397,12 @@ static bool guest_state_valid(struct kvm_vcpu *vcpu) | |||
2397 | 2397 | ||
2398 | static int init_rmode_tss(struct kvm *kvm) | 2398 | static int init_rmode_tss(struct kvm *kvm) |
2399 | { | 2399 | { |
2400 | gfn_t fn = rmode_tss_base(kvm) >> PAGE_SHIFT; | 2400 | gfn_t fn; |
2401 | u16 data = 0; | 2401 | u16 data = 0; |
2402 | int ret = 0; | 2402 | int r, idx, ret = 0; |
2403 | int r; | ||
2404 | 2403 | ||
2404 | idx = srcu_read_lock(&kvm->srcu); | ||
2405 | fn = rmode_tss_base(kvm) >> PAGE_SHIFT; | ||
2405 | r = kvm_clear_guest_page(kvm, fn, 0, PAGE_SIZE); | 2406 | r = kvm_clear_guest_page(kvm, fn, 0, PAGE_SIZE); |
2406 | if (r < 0) | 2407 | if (r < 0) |
2407 | goto out; | 2408 | goto out; |
@@ -2425,12 +2426,13 @@ static int init_rmode_tss(struct kvm *kvm) | |||
2425 | 2426 | ||
2426 | ret = 1; | 2427 | ret = 1; |
2427 | out: | 2428 | out: |
2429 | srcu_read_unlock(&kvm->srcu, idx); | ||
2428 | return ret; | 2430 | return ret; |
2429 | } | 2431 | } |
2430 | 2432 | ||
2431 | static int init_rmode_identity_map(struct kvm *kvm) | 2433 | static int init_rmode_identity_map(struct kvm *kvm) |
2432 | { | 2434 | { |
2433 | int i, r, ret; | 2435 | int i, idx, r, ret; |
2434 | pfn_t identity_map_pfn; | 2436 | pfn_t identity_map_pfn; |
2435 | u32 tmp; | 2437 | u32 tmp; |
2436 | 2438 | ||
@@ -2445,6 +2447,7 @@ static int init_rmode_identity_map(struct kvm *kvm) | |||
2445 | return 1; | 2447 | return 1; |
2446 | ret = 0; | 2448 | ret = 0; |
2447 | identity_map_pfn = kvm->arch.ept_identity_map_addr >> PAGE_SHIFT; | 2449 | identity_map_pfn = kvm->arch.ept_identity_map_addr >> PAGE_SHIFT; |
2450 | idx = srcu_read_lock(&kvm->srcu); | ||
2448 | r = kvm_clear_guest_page(kvm, identity_map_pfn, 0, PAGE_SIZE); | 2451 | r = kvm_clear_guest_page(kvm, identity_map_pfn, 0, PAGE_SIZE); |
2449 | if (r < 0) | 2452 | if (r < 0) |
2450 | goto out; | 2453 | goto out; |
@@ -2460,6 +2463,7 @@ static int init_rmode_identity_map(struct kvm *kvm) | |||
2460 | kvm->arch.ept_identity_pagetable_done = true; | 2463 | kvm->arch.ept_identity_pagetable_done = true; |
2461 | ret = 1; | 2464 | ret = 1; |
2462 | out: | 2465 | out: |
2466 | srcu_read_unlock(&kvm->srcu, idx); | ||
2463 | return ret; | 2467 | return ret; |
2464 | } | 2468 | } |
2465 | 2469 | ||