X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=931763557742e635bca6101aed89011e9eaaca29;hb=b1128b2a9d269fefc786c60c26878b372d5e39c1;hp=621ab5806442575193a07aedfef41817ffeb6a20;hpb=276cfa264720edddc1677e35c6a300596965de7d;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 621ab58..9317635 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -34,37 +34,22 @@ int mod_frees = 0; static int v3_major_num = 0; -static u8 v3_minor_map[MAX_VMS / 8] = {[0 ... (MAX_VMS / 8) - 1] = 0}; - +static struct v3_guest * guest_map[MAX_VMS] = {[0 ... MAX_VMS - 1] = 0}; struct class * v3_class = NULL; static struct cdev ctrl_dev; -static int register_vm( void ) { - int i, j = 0; - int avail = 0; - - for (i = 0; i < sizeof(v3_minor_map); i++) { - if (v3_minor_map[i] != 0xff) { - for (j = 0; j < 8; j++) { - if (!(v3_minor_map[i] & (0x1 << j))) { - avail = 1; - v3_minor_map[i] |= (0x1 << j); - break; - } - } - - if (avail == 1) { - break; - } +static int register_vm(struct v3_guest * guest) { + int i = 0; + + for (i = 0; i < MAX_VMS; i++) { + if (guest_map[i] == NULL) { + guest_map[i] = guest; + return i; } } - if (avail == 0) { - return -1; - } - - return (i * 8) + j; + return -1; } @@ -82,75 +67,72 @@ static long v3_dev_ioctl(struct file * filp, 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...\n"); + printk("Palacios: Starting V3 Guest...\n"); - vm_minor = register_vm(); + 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"); + printk("Palacios: Launching VM\n"); INIT_LIST_HEAD(&(guest->exts)); - init_completion(&(guest->start_done)); - init_completion(&(guest->thread_done)); + if (start_palacios_vm(guest) == -1) { + printk("Palacios: Error starting guest\n"); + return -EFAULT; + } - { - 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 + return guest->vm_dev; + break; + } + case V3_STOP_GUEST: { + unsigned long vm_idx = arg; + struct v3_guest * guest = guest_map[vm_idx]; - 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; - } + printk("Stopping VM idx=%d\n", vm_idx); + printk("Stopping VM (%s) (%p)\n", guest->name, guest); - kthread_bind(launch_thread, smp_processor_id()); - preempt_enable(); - wake_up_process(launch_thread); + if (irqs_disabled()) { + printk("WHAT!!?? IRQs are disabled??\n"); + break; } - wait_for_completion(&(guest->start_done)); - - return guest->vm_dev; + stop_palacios_vm(guest); + guest_map[vm_idx] = NULL; break; } case V3_ADD_MEMORY: {