X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fpalacios-dev.c;h=cf8e0fe784e186ca002ff19073ea6be5ffed5558;hb=f1fa6648dfea31fe4261c8c2d329a68613739714;hp=a135be9ef5620be1737f45819332a9f4d8ed6fad;hpb=c79291850ac3605c924a2c5e9617028038bb8f63;p=palacios.releases.git diff --git a/linux_module/palacios-dev.c b/linux_module/palacios-dev.c index a135be9..cf8e0fe 100644 --- a/linux_module/palacios-dev.c +++ b/linux_module/palacios-dev.c @@ -24,6 +24,18 @@ #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 + +#ifdef V3_CONFIG_KEYED_STREAMS +#include "palacios-keyed-stream.h" +#endif + MODULE_LICENSE("GPL"); @@ -49,7 +61,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; @@ -109,7 +121,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"); @@ -128,10 +140,31 @@ static long v3_dev_ioctl(struct file * filp, INIT_LIST_HEAD(&(guest->streams)); INIT_LIST_HEAD(&(guest->files)); INIT_LIST_HEAD(&(guest->sockets)); +#ifdef V3_CONFIG_HOST_DEVICE + INIT_LIST_HEAD(&(guest->hostdev.devs)); +#endif 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)); @@ -155,16 +188,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; @@ -233,9 +259,45 @@ 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_KEYED_STREAMS + palacios_init_keyed_streams(); +#endif + +#ifdef V3_CONFIG_CONSOLE palacios_init_console(); +#endif + +#ifdef V3_CONFIG_GRAPHICS_CONSOLE + palacios_init_graphics_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_vnet_init(); +#endif + +#ifdef V3_CONFIG_HOST_DEVICE + palacios_init_host_dev(); +#endif return 0; @@ -277,8 +339,30 @@ static void __exit v3_exit(void) { 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 + +#ifdef V3_CONFIG_SOCKET + palacios_socket_deinit(); +#endif + +#ifdef V3_CONFIG_PACKET + palacios_deinit_packet(NULL); +#endif + +#ifdef V3_CONFIG_VNET + palacios_vnet_deinit(); +#endif palacios_deinit_mm();