diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index bcc0efce85b..4be89e1c014 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -5574,7 +5574,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
5574 | struct kvm_sregs *sregs) | 5574 | struct kvm_sregs *sregs) |
5575 | { | 5575 | { |
5576 | int mmu_reset_needed = 0; | 5576 | int mmu_reset_needed = 0; |
5577 | int pending_vec, max_bits; | 5577 | int pending_vec, max_bits, idx; |
5578 | struct desc_ptr dt; | 5578 | struct desc_ptr dt; |
5579 | 5579 | ||
5580 | dt.size = sregs->idt.limit; | 5580 | dt.size = sregs->idt.limit; |
@@ -5603,10 +5603,13 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
5603 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); | 5603 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); |
5604 | if (sregs->cr4 & X86_CR4_OSXSAVE) | 5604 | if (sregs->cr4 & X86_CR4_OSXSAVE) |
5605 | update_cpuid(vcpu); | 5605 | update_cpuid(vcpu); |
5606 | |||
5607 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
5606 | if (!is_long_mode(vcpu) && is_pae(vcpu)) { | 5608 | if (!is_long_mode(vcpu) && is_pae(vcpu)) { |
5607 | load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu)); | 5609 | load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu)); |
5608 | mmu_reset_needed = 1; | 5610 | mmu_reset_needed = 1; |
5609 | } | 5611 | } |
5612 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
5610 | 5613 | ||
5611 | if (mmu_reset_needed) | 5614 | if (mmu_reset_needed) |
5612 | kvm_mmu_reset_context(vcpu); | 5615 | kvm_mmu_reset_context(vcpu); |