X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-dev.c;h=f6404031f572abe3fdcb081dc4d81057410c6083;hb=3518e3eb158edabb0d471ceb406c450490a4d07a;hp=e3f83b6988169c1dde2d2a075685de9174001978;hpb=467878dcf7ccb6248c83483e01360b0ffdc83dc0;p=palacios-OLD.git diff --git a/linux_module/palacios-dev.c b/linux_module/palacios-dev.c index e3f83b6..f640403 100644 --- a/linux_module/palacios-dev.c +++ b/linux_module/palacios-dev.c @@ -21,16 +21,10 @@ #include "palacios.h" #include "palacios-mm.h" #include "palacios-vm.h" -#include "palacios-stream.h" -#include "palacios-file.h" -#include "palacios-serial.h" -#include "palacios-socket.h" -#include "palacios-vnet.h" -#include "palacios-packet.h" -#ifdef CONFIG_DEBUG_FS -#include "palacios-debugfs.h" -#endif +#include "linux-exts.h" + + MODULE_LICENSE("GPL"); @@ -46,9 +40,6 @@ static u8 v3_minor_map[MAX_VMS / 8] = {[0 ... (MAX_VMS / 8) - 1] = 0}; struct class * v3_class = NULL; static struct cdev ctrl_dev; -void * v3_base_addr = NULL; -unsigned int v3_pages = 0; - static int register_vm( void ) { int i, j = 0; int avail = 0; @@ -56,7 +47,7 @@ static int register_vm( void ) { 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)) { + if (!(v3_minor_map[i] & (0x1 << j))) { avail = 1; v3_minor_map[i] |= (0x1 << j); break; @@ -116,7 +107,7 @@ static long v3_dev_ioctl(struct file * filp, guest->img_size = user_image.size; printk("Allocating kernel memory for guest image (%llu bytes)\n", user_image.size); - guest->img = kmalloc(guest->img_size, GFP_KERNEL); + guest->img = vmalloc(guest->img_size); if (IS_ERR(guest->img)) { printk("Error: Could not allocate space for guest image\n"); @@ -132,13 +123,30 @@ static long v3_dev_ioctl(struct file * filp, printk("Launching VM\n"); - INIT_LIST_HEAD(&(guest->streams)); - INIT_LIST_HEAD(&(guest->files)); - INIT_LIST_HEAD(&(guest->sockets)); + INIT_LIST_HEAD(&(guest->exts)); + init_completion(&(guest->start_done)); init_completion(&(guest->thread_done)); - kthread_run(start_palacios_vm, guest, guest->name); + { + 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); + } wait_for_completion(&(guest->start_done)); @@ -162,47 +170,9 @@ static long v3_dev_ioctl(struct file * filp, return -EFAULT; } - // Mem test... - /* - { - void * vaddr = __va(alloc_palacios_pgs(131072, 4096)); - memset(vaddr, 0xfe492fe2, mem.num_pages * 4096); - } - */ - break; } - case V3_START_NETWORK: { - struct v3_network net; - memset(&net, 0, sizeof(struct v3_network)); - - if(copy_from_user(&net, argp, sizeof(struct v3_network))){ - printk("copy from user error getting network service requests ... \n"); - return -EFAULT; - } - - #ifdef CONFIG_PALACIOS_SOCKET - if(net.socket == 1){ - palacios_socket_init(); - printk("Started Palacios Socket\n"); - } - #endif - #ifdef CONFIG_PALACIOS_PACKET - if(net.packet == 1){ - palacios_init_packet(NULL); - printk("Started Palacios Direct Network Bridge\n"); - } - #endif - #ifdef CONFIG_PALACIOS_VNET - if(net.vnet == 1){ - palacios_init_vnet(); - printk("Started Palacios VNET Service\n"); - } - #endif - - break; - } default: printk("\tUnhandled\n"); return -EINVAL; @@ -220,8 +190,6 @@ static struct file_operations v3_ctrl_fops = { }; -extern unsigned int v3_pages; -extern void * v3_base_addr; static int __init v3_init(void) { dev_t dev = MKDEV(0, 0); // We dynamicallly assign the major number @@ -230,6 +198,16 @@ static int __init v3_init(void) { palacios_init_mm(); + + // Initialize Palacios + + palacios_vmm_init(); + + + // initialize extensions + init_lnx_extensions(); + + v3_class = class_create(THIS_MODULE, "vms"); if (IS_ERR(v3_class)) { printk("Failed to register V3 VM device class\n"); @@ -263,23 +241,8 @@ static int __init v3_init(void) { goto failure1; } - if ((v3_pages > 0) && (v3_base_addr != NULL)) { - add_palacios_memory(__pa(v3_base_addr), v3_pages); - } - - // Initialize Palacios - - palacios_vmm_init(); - - palacios_init_stream(); - palacios_file_init(); - palacios_init_console(); -#ifdef CONFIG_DEBUG_FS - palacios_init_debugfs(); -#endif - return 0; failure1: @@ -320,13 +283,7 @@ static void __exit v3_exit(void) { class_destroy(v3_class); - -#ifdef CONFIG_DEBUG_FS - palacios_deinit_debugfs(); -#endif - - palacios_file_deinit(); - palacios_deinit_stream(); + deinit_lnx_extensions(); palacios_deinit_mm();