X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=62a0fb5d10801a1954b5ebf2998616f2b0f1f155;hb=0b342d28c860e4b3911b529f5363d35faa86aa25;hp=a6787ce28d359fd12fc6c77fb2039a31fd0e729b;hpb=401f28c04132e4f5ccafc145dcb69b6dee4afe4e;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index a6787ce..62a0fb5 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -61,97 +61,68 @@ static long v3_dev_ioctl(struct file * filp, switch (ioctl) { - case V3_START_GUEST:{ + case V3_CREATE_GUEST:{ int vm_minor = 0; struct v3_guest_img user_image; struct v3_guest * guest = kmalloc(sizeof(struct v3_guest), GFP_KERNEL); if (IS_ERR(guest)) { - printk("Error allocating Kernel guest_image\n"); + printk("Palacios: Error allocating Kernel guest_image\n"); return -EFAULT; } memset(guest, 0, sizeof(struct v3_guest)); - printk("Starting V3 Guest... (%p)\n", guest); + printk("Palacios: Creating V3 Guest...\n"); vm_minor = register_vm(guest); if (vm_minor == -1) { - printk("Too many VMs are currently running\n"); + printk("Palacios Error: Too many VMs are currently running\n"); return -EFAULT; } guest->vm_dev = MKDEV(v3_major_num, vm_minor); if (copy_from_user(&user_image, argp, sizeof(struct v3_guest_img))) { - printk("copy from user error getting guest image...\n"); + printk("Palacios Error: copy from user error getting guest image...\n"); return -EFAULT; } guest->img_size = user_image.size; - printk("Allocating kernel memory for guest image (%llu bytes)\n", user_image.size); + printk("Palacios: Allocating kernel memory for guest image (%llu bytes)\n", user_image.size); guest->img = vmalloc(guest->img_size); if (IS_ERR(guest->img)) { - printk("Error: Could not allocate space for guest image\n"); + printk("Palacios Error: Could not allocate space for guest image\n"); return -EFAULT; } if (copy_from_user(guest->img, user_image.guest_data, guest->img_size)) { - printk("Error loading guest data\n"); + printk("Palacios: Error loading guest data\n"); return -EFAULT; } strncpy(guest->name, user_image.name, 127); - printk("Launching VM\n"); - INIT_LIST_HEAD(&(guest->exts)); - init_completion(&(guest->start_done)); - init_completion(&(guest->thread_done)); - - { - struct task_struct * launch_thread = NULL; - // At some point we're going to want to allow the user to specify a CPU mask - // But for now, well just launch from the local core, and rely on the global cpu mask - - preempt_disable(); - launch_thread = kthread_create(start_palacios_vm, guest, guest->name); - - if (IS_ERR(launch_thread)) { - preempt_enable(); - printk("Palacios error creating launch thread for vm (%s)\n", guest->name); - return -EFAULT; - } - - kthread_bind(launch_thread, smp_processor_id()); - preempt_enable(); - - wake_up_process(launch_thread); + if (create_palacios_vm(guest) == -1) { + printk("Palacios: Error creating guest\n"); + return -EFAULT; } - wait_for_completion(&(guest->start_done)); - - return guest->vm_dev; + return vm_minor; break; } - case V3_STOP_GUEST: { + case V3_FREE_GUEST: { unsigned long vm_idx = arg; struct v3_guest * guest = guest_map[vm_idx]; - printk("Stopping VM idx=%d\n", vm_idx); - printk("Stopping VM (%s) (%p)\n", guest->name, guest); - - - if (irqs_disabled()) { - printk("WHAT!!?? IRQs are disabled??\n"); - break; - } + printk("Freeing VM (%s) (%p)\n", guest->name, guest); - stop_palacios_vm(guest); + free_palacios_vm(guest); guest_map[vm_idx] = NULL; break; }