lkml.org 
[lkml]   [2008]   [Dec]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/36] KVM: s390: Fix refcounting and allow module unload
    Date
    From: Christian Borntraeger <borntraeger@de.ibm.com>

    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>
    ---
    arch/s390/kvm/kvm-s390.c | 35 +++++++++++++++++++++--------------
    1 files changed, 21 insertions(+), 14 deletions(-)

    diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
    index 8b00eb2..3db9e5d 100644
    --- a/arch/s390/kvm/kvm-s390.c
    +++ b/arch/s390/kvm/kvm-s390.c
    @@ -185,8 +185,6 @@ struct kvm *kvm_arch_create_vm(void)
    debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
    VM_EVENT(kvm, 3, "%s", "vm created");

    - try_module_get(THIS_MODULE);
    -
    return kvm;
    out_nodbf:
    free_page((unsigned long)(kvm->arch.sca));
    @@ -196,13 +194,32 @@ out_nokvm:
    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)
    {
    - debug_unregister(kvm->arch.dbf);
    + kvm_free_vcpus(kvm);
    kvm_free_physmem(kvm);
    free_page((unsigned long)(kvm->arch.sca));
    + debug_unregister(kvm->arch.dbf);
    kfree(kvm);
    - module_put(THIS_MODULE);
    }

    /* 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,
    vcpu->arch.sie_block);

    - try_module_get(THIS_MODULE);
    -
    return vcpu;
    out_free_cpu:
    kfree(vcpu);
    @@ -317,14 +332,6 @@ out_nomem:
    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)
    {
    /* kvm common code refers to this, but never calls it */
    --
    1.6.0.3


    \
     
     \ /
      Last update: 2008-12-14 09:15    [W:0.024 / U:0.488 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site