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

Reply via email to