unsigned int cmd, unsigned long arg,
void * priv_data),
void * priv_data) {
- struct vm_ctrl * ctrl = kmalloc(sizeof(struct vm_ctrl), GFP_KERNEL);
+ struct vm_ctrl * ctrl = palacios_alloc(sizeof(struct vm_ctrl));
if (ctrl == NULL) {
WARNING("Error: Could not allocate vm ctrl %d\n", cmd);
if (__insert_ctrl(guest, ctrl) != NULL) {
WARNING("Could not insert guest ctrl %d\n", cmd);
- kfree(ctrl);
+ palacios_free(ctrl);
return -1;
}
memset(&cmd, 0, sizeof(struct v3_debug_cmd));
if (copy_from_user(&cmd, argp, sizeof(struct v3_debug_cmd))) {
- printk("Error: Could not copy debug command from user space\n");
+ ERROR("Error: Could not copy debug command from user space\n");
return -EFAULT;
}
evt.core_id = cmd.core;
evt.cmd = cmd.cmd;
- printk("Debugging VM\n");
+ INFO("Debugging VM\n");
if (v3_deliver_debug_event(guest->v3_ctx, &evt) == -1) {
- printk("Error could not deliver debug cmd\n");
+ ERROR("Error could not deliver debug cmd\n");
return -EFAULT;
}
int create_palacios_vm(struct v3_guest * guest) {
int err;
- init_vm_extensions(guest);
+ if (init_vm_extensions(guest) < 0) {
+ WARNING("palacios: failed to initialize extensions\n");
+ return -1;
+ }
guest->v3_ctx = v3_create_vm(guest->img, (void *)guest, guest->name);
if (guest->v3_ctx == NULL) {
WARNING("palacios: failed to create vm\n");
- return -1;
+ goto out_err;
}
-
NOTICE("Creating VM device: Major %d, Minor %d\n", MAJOR(guest->vm_dev), MINOR(guest->vm_dev));
cdev_init(&(guest->cdev), &v3_vm_fops);
if (err) {
WARNING("Fails to add cdev\n");
- v3_free_vm(guest->v3_ctx);
- return -1;
+ goto out_err1;
}
if (device_create(v3_class, NULL, guest->vm_dev, guest, "v3-vm%d", MINOR(guest->vm_dev)) == NULL){
WARNING("Fails to create device\n");
- cdev_del(&(guest->cdev));
- v3_free_vm(guest->v3_ctx);
- return -1;
+ goto out_err2;
}
NOTICE("palacios: vm created at /dev/v3-vm%d\n", MINOR(guest->vm_dev));
return 0;
+
+out_err2:
+ cdev_del(&(guest->cdev));
+out_err1:
+ v3_free_vm(guest->v3_ctx);
+out_err:
+ deinit_vm_extensions(guest);
+ return -1;
}
cdev_del(&(guest->cdev));
vfree(guest->img);
- kfree(guest);
+ palacios_free(guest);
return 0;
}