|
@@ -5574,7 +5574,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
|
|
struct kvm_sregs *sregs)
|
|
|
{
|
|
|
int mmu_reset_needed = 0;
|
|
|
- int pending_vec, max_bits;
|
|
|
+ int pending_vec, max_bits, idx;
|
|
|
struct desc_ptr dt;
|
|
|
|
|
|
dt.size = sregs->idt.limit;
|
|
@@ -5603,10 +5603,13 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
|
|
kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
|
|
|
if (sregs->cr4 & X86_CR4_OSXSAVE)
|
|
|
update_cpuid(vcpu);
|
|
|
+
|
|
|
+ idx = srcu_read_lock(&vcpu->kvm->srcu);
|
|
|
if (!is_long_mode(vcpu) && is_pae(vcpu)) {
|
|
|
load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu));
|
|
|
mmu_reset_needed = 1;
|
|
|
}
|
|
|
+ srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
|
|
|
|
|
if (mmu_reset_needed)
|
|
|
kvm_mmu_reset_context(vcpu);
|