mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 17:53:56 +08:00
KVM: s390: Fix refcounting and allow module unload
Currently it is impossible to unload the kvm module on s390. This patch fixes kvm_arch_destroy_vm to release all cpus. This make it possible to unload the module. In addition we stop messing with the module refcount in arch code. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Acked-by: Carsten Otte <cotte@de.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
6b7ad61ffb
commit
d329c035e7
@ -185,8 +185,6 @@ struct kvm *kvm_arch_create_vm(void)
|
|||||||
debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
|
debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
|
||||||
VM_EVENT(kvm, 3, "%s", "vm created");
|
VM_EVENT(kvm, 3, "%s", "vm created");
|
||||||
|
|
||||||
try_module_get(THIS_MODULE);
|
|
||||||
|
|
||||||
return kvm;
|
return kvm;
|
||||||
out_nodbf:
|
out_nodbf:
|
||||||
free_page((unsigned long)(kvm->arch.sca));
|
free_page((unsigned long)(kvm->arch.sca));
|
||||||
@ -196,13 +194,32 @@ out_nokvm:
|
|||||||
return ERR_PTR(rc);
|
return ERR_PTR(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
VCPU_EVENT(vcpu, 3, "%s", "free cpu");
|
||||||
|
free_page((unsigned long)(vcpu->arch.sie_block));
|
||||||
|
kfree(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kvm_free_vcpus(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < KVM_MAX_VCPUS; ++i) {
|
||||||
|
if (kvm->vcpus[i]) {
|
||||||
|
kvm_arch_vcpu_destroy(kvm->vcpus[i]);
|
||||||
|
kvm->vcpus[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void kvm_arch_destroy_vm(struct kvm *kvm)
|
void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
debug_unregister(kvm->arch.dbf);
|
kvm_free_vcpus(kvm);
|
||||||
kvm_free_physmem(kvm);
|
kvm_free_physmem(kvm);
|
||||||
free_page((unsigned long)(kvm->arch.sca));
|
free_page((unsigned long)(kvm->arch.sca));
|
||||||
|
debug_unregister(kvm->arch.dbf);
|
||||||
kfree(kvm);
|
kfree(kvm);
|
||||||
module_put(THIS_MODULE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Section: vcpu related */
|
/* Section: vcpu related */
|
||||||
@ -308,8 +325,6 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
|
|||||||
VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
|
VM_EVENT(kvm, 3, "create cpu %d at %p, sie block at %p", id, vcpu,
|
||||||
vcpu->arch.sie_block);
|
vcpu->arch.sie_block);
|
||||||
|
|
||||||
try_module_get(THIS_MODULE);
|
|
||||||
|
|
||||||
return vcpu;
|
return vcpu;
|
||||||
out_free_cpu:
|
out_free_cpu:
|
||||||
kfree(vcpu);
|
kfree(vcpu);
|
||||||
@ -317,14 +332,6 @@ out_nomem:
|
|||||||
return ERR_PTR(rc);
|
return ERR_PTR(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
VCPU_EVENT(vcpu, 3, "%s", "destroy cpu");
|
|
||||||
free_page((unsigned long)(vcpu->arch.sie_block));
|
|
||||||
kfree(vcpu);
|
|
||||||
module_put(THIS_MODULE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
|
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
/* kvm common code refers to this, but never calls it */
|
/* kvm common code refers to this, but never calls it */
|
||||||
|
Loading…
Reference in New Issue
Block a user