X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fvm.c;h=54d5efde8fbd7a1dbad360c0f82ff6d51affc461;hb=298a05652b5704f9881af0683e3f16fc4cd03959;hp=b14cff42c57cdfa4579a5b9a746b1594d22f43a6;hpb=4b9f54d875c87a0b06337fb64239278d6cfc02fa;p=palacios.releases.git diff --git a/linux_module/vm.c b/linux_module/vm.c index b14cff4..54d5efd 100644 --- a/linux_module/vm.c +++ b/linux_module/vm.c @@ -93,6 +93,8 @@ int add_guest_ctrl(struct v3_guest * guest, unsigned int cmd, } + + static struct vm_ctrl * get_ctrl(struct v3_guest * guest, unsigned int cmd) { struct rb_node * n = guest->vm_ctrls.rb_node; struct vm_ctrl * ctrl = NULL; @@ -112,6 +114,35 @@ static struct vm_ctrl * get_ctrl(struct v3_guest * guest, unsigned int cmd) { return NULL; } +int remove_guest_ctrl(struct v3_guest * guest, unsigned int cmd) { + struct vm_ctrl * ctrl = get_ctrl(guest, cmd); + + if (ctrl == NULL) { + INFO("Could not find control (%d) to remove\n", cmd); + return -1; + } + + rb_erase(&(ctrl->tree_node), &(guest->vm_ctrls)); + + kfree(ctrl); + + return 0; +} + +static void free_guest_ctrls(struct v3_guest * guest) { + struct rb_node * node = rb_first(&(guest->vm_ctrls)); + struct vm_ctrl * ctrl = NULL; + + while (node) { + ctrl = rb_entry(node, struct vm_ctrl, tree_node); + + node = rb_next(node); + + WARNING("Cleaning up guest ctrl that was not removed explicitly (%d)\n", ctrl->cmd); + + kfree(ctrl); + } +} @@ -199,7 +230,7 @@ static long v3_vm_ioctl(struct file * filp, return -EFAULT; } - NOTICE("Loading Guest to %s:%s\n", chkpt.store, chkpt.url); + NOTICE("Loading Guest from %s:%s\n", chkpt.store, chkpt.url); if (v3_load_vm(guest->v3_ctx, chkpt.store, chkpt.url) == -1) { WARNING("Error Loading VM state\n"); @@ -402,12 +433,17 @@ out_err: int free_palacios_vm(struct v3_guest * guest) { - v3_free_vm(guest->v3_ctx); + if (v3_free_vm(guest->v3_ctx)<0) { + return -1; + } device_destroy(v3_class, guest->vm_dev); cdev_del(&(guest->cdev)); + free_guest_ctrls(guest); + + vfree(guest->img); palacios_free(guest);