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