Signed-off-by: François Diakhaté <[EMAIL PROTECTED]> --- libkvm/libkvm.c | 24 +++++++++++++++++++----- 1 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 444b97f..44c931b 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -286,6 +286,7 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks, int fd; kvm_context_t kvm; int r; + int i; fd = open("/dev/kvm", O_RDWR); if (fd == -1) { @@ -317,6 +318,8 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks, memset(kvm, 0, sizeof(*kvm)); kvm->fd = fd; kvm->vm_fd = -1; + for (i = 0; i < MAX_VCPUS; ++i) + kvm->vcpu_fd[i] = -1; kvm->callbacks = callbacks; kvm->opaque = opaque; kvm->dirty_pages_log_all = 0; @@ -331,9 +334,16 @@ kvm_context_t kvm_init(struct kvm_callbacks *callbacks, void kvm_finalize(kvm_context_t kvm) { - if (kvm->vcpu_fd[0] != -1) - close(kvm->vcpu_fd[0]); - if (kvm->vm_fd != -1) + int i; + long mmap_size; + + mmap_size = ioctl(kvm->fd, KVM_GET_VCPU_MMAP_SIZE, 0); + for(i = 0; i < MAX_VCPUS; ++i) + if (kvm->vcpu_fd[i] != -1){ + close(kvm->vcpu_fd[i]); + munmap(kvm->run[i], mmap_size); + } + if (kvm->vm_fd != -1) close(kvm->vm_fd); close(kvm->fd); free(kvm); @@ -365,16 +375,20 @@ int kvm_create_vcpu(kvm_context_t kvm, int slot) if (mmap_size == -1) { r = -errno; fprintf(stderr, "get vcpu mmap size: %m\n"); - return r; + goto error; } kvm->run[slot] = mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_SHARED, kvm->vcpu_fd[slot], 0); if (kvm->run[slot] == MAP_FAILED) { r = -errno; fprintf(stderr, "mmap vcpu area: %m\n"); - return r; + goto error; } return 0; +error: + close(kvm->vcpu_fd[slot]); + kvm->vcpu_fd[slot] = -1; + return r; } int kvm_create_vm(kvm_context_t kvm) -- 1.6.0.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html