KVM: mark memory slots as rcu
we access the memslots array via srcu. Mark it as such and use the right access functions also for the freeing of memory slots. Found by sparse: ./include/linux/kvm_host.h:565:16: error: incompatible types in comparison expression (different address spaces) Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
4a12f95177
Коммит
a80cf7b5f4
|
@ -390,7 +390,7 @@ struct kvm {
|
||||||
spinlock_t mmu_lock;
|
spinlock_t mmu_lock;
|
||||||
struct mutex slots_lock;
|
struct mutex slots_lock;
|
||||||
struct mm_struct *mm; /* userspace tied to this vm */
|
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];
|
struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -707,7 +707,8 @@ out_err_no_disable:
|
||||||
for (i = 0; i < KVM_NR_BUSES; i++)
|
for (i = 0; i < KVM_NR_BUSES; i++)
|
||||||
kfree(rcu_access_pointer(kvm->buses[i]));
|
kfree(rcu_access_pointer(kvm->buses[i]));
|
||||||
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; 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);
|
kvm_arch_free_vm(kvm);
|
||||||
mmdrop(current->mm);
|
mmdrop(current->mm);
|
||||||
return ERR_PTR(r);
|
return ERR_PTR(r);
|
||||||
|
@ -756,7 +757,8 @@ static void kvm_destroy_vm(struct kvm *kvm)
|
||||||
kvm_arch_destroy_vm(kvm);
|
kvm_arch_destroy_vm(kvm);
|
||||||
kvm_destroy_devices(kvm);
|
kvm_destroy_devices(kvm);
|
||||||
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; 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));
|
||||||
cleanup_srcu_struct(&kvm->irq_srcu);
|
cleanup_srcu_struct(&kvm->irq_srcu);
|
||||||
cleanup_srcu_struct(&kvm->srcu);
|
cleanup_srcu_struct(&kvm->srcu);
|
||||||
kvm_arch_free_vm(kvm);
|
kvm_arch_free_vm(kvm);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче