diff options
| -rw-r--r-- | include/linux/kvm_host.h | 2 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 6 | 
2 files changed, 5 insertions, 3 deletions
| diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 6a164f9eb02c..b3ca77a96b2d 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -390,7 +390,7 @@ struct kvm {  	spinlock_t mmu_lock;  	struct mutex slots_lock;  	struct mm_struct *mm; /* userspace tied to this vm */ -	struct kvm_memslots *memslots[KVM_ADDRESS_SPACE_NUM]; +	struct kvm_memslots __rcu *memslots[KVM_ADDRESS_SPACE_NUM];  	struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];  	/* diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d76e822f8929..6e6d4edf0e92 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -707,7 +707,8 @@ out_err_no_disable:  	for (i = 0; i < KVM_NR_BUSES; i++)  		kfree(rcu_access_pointer(kvm->buses[i]));  	for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) -		kvm_free_memslots(kvm, kvm->memslots[i]); +		kvm_free_memslots(kvm, +			rcu_dereference_protected(kvm->memslots[i], 1));  	kvm_arch_free_vm(kvm);  	mmdrop(current->mm);  	return ERR_PTR(r); @@ -756,7 +757,8 @@ static void kvm_destroy_vm(struct kvm *kvm)  	kvm_arch_destroy_vm(kvm);  	kvm_destroy_devices(kvm);  	for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) -		kvm_free_memslots(kvm, kvm->memslots[i]); +		kvm_free_memslots(kvm, +			rcu_dereference_protected(kvm->memslots[i], 1));  	cleanup_srcu_struct(&kvm->irq_srcu);  	cleanup_srcu_struct(&kvm->srcu);  	kvm_arch_free_vm(kvm); | 
