X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-dev.c;h=f019e186535d6dc03bb3ced9565adb8c02496d82;hb=ec8e7606831a6768d67c47ca8f48119af64f3453;hp=8b303521db8e5bdceb1c10047b8306c19e1e9f55;hpb=4801e692b7344051eb94fff6faf1be53f621d422;p=palacios.git diff --git a/linux_module/palacios-dev.c b/linux_module/palacios-dev.c index 8b30352..f019e18 100644 --- a/linux_module/palacios-dev.c +++ b/linux_module/palacios-dev.c @@ -24,9 +24,19 @@ #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 V3_CONFIG_EXT_INSPECTOR +#include "palacios-inspector.h" +#endif MODULE_LICENSE("GPL"); +int mod_allocs = 0; +int mod_frees = 0; + static int v3_major_num = 0; @@ -76,9 +86,9 @@ static long v3_dev_ioctl(struct file * filp, switch (ioctl) { case V3_START_GUEST:{ + int vm_minor = 0; struct v3_guest_img user_image; struct v3_guest * guest = kmalloc(sizeof(struct v3_guest), GFP_KERNEL); - int vm_minor = 0; if (IS_ERR(guest)) { printk("Error allocating Kernel guest_image\n"); @@ -128,7 +138,25 @@ static long v3_dev_ioctl(struct file * filp, 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)); @@ -152,16 +180,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; } + default: printk("\tUnhandled\n"); return -EINVAL; @@ -230,9 +251,33 @@ static int __init v3_init(void) { palacios_vmm_init(); +#ifdef V3_CONFIG_STREAM palacios_init_stream(); +#endif + +#ifdef V3_CONFIG_FILE palacios_file_init(); +#endif + +#ifdef V3_CONFIG_CONSOLE palacios_init_console(); +#endif + +#ifdef V3_CONFIG_EXT_INSPECTOR + palacios_init_inspector(); +#endif + +#ifdef V3_CONFIG_SOCKET + palacios_socket_init(); +#endif + +#ifdef V3_CONFIG_PACKET + palacios_init_packet(NULL); +#endif + +#ifdef V3_CONFIG_VNET + palacios_init_vnet(); +#endif return 0; @@ -251,6 +296,11 @@ static void __exit v3_exit(void) { extern u32 mallocs; extern u32 frees; + + // should probably try to stop any guests + + + dev_t dev = MKDEV(v3_major_num, MAX_VMS + 1); printk("Removing V3 Control device\n"); @@ -267,9 +317,44 @@ static void __exit v3_exit(void) { device_destroy(v3_class, dev); class_destroy(v3_class); + + + +#ifdef V3_CONFIG_EXT_INSPECTOR + palacios_deinit_inspector(); +#endif + +#ifdef V3_CONFIG_FILE + palacios_file_deinit(); +#endif + +#ifdef V3_CONFIG_STREAM + palacios_deinit_stream(); +#endif + + palacios_deinit_mm(); + + printk("Palacios Module Mallocs = %d, Frees = %d\n", mod_allocs, mod_frees); } module_init(v3_init); module_exit(v3_exit); + + + +void * trace_malloc(size_t size, gfp_t flags) { + void * addr = NULL; + + mod_allocs++; + addr = kmalloc(size, flags); + + return addr; +} + + +void trace_free(const void * objp) { + mod_frees++; + kfree(objp); +}