diff options
Diffstat (limited to 'arch/x86/kvm/vmx.c')
-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 | ||