X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=2199d88a760989684fa98fb1527b42b8ba39cbf6;hb=4a7e01a6d71dcfb0ecf19ca4271f195a654a94ca;hp=4d09399cb47bcf8dfb74743dd237771d4faf268d;hpb=e94507c7055f81abcf6a95132cb7ad90f1b5e6ca;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 4d09399..2199d88 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -90,7 +90,7 @@ static long v3_dev_ioctl(struct file * filp, struct v3_guest_img user_image; struct v3_guest * guest = palacios_alloc(sizeof(struct v3_guest)); - if (IS_ERR(guest)) { + if (!(guest)) { ERROR("Palacios: Error allocating Kernel guest_image\n"); return -EFAULT; } @@ -118,7 +118,7 @@ static long v3_dev_ioctl(struct file * filp, DEBUG("Palacios: Allocating kernel memory for guest image (%llu bytes)\n", user_image.size); guest->img = palacios_valloc(guest->img_size); - if (IS_ERR(guest->img)) { + if (!guest->img) { ERROR("Palacios Error: Could not allocate space for guest image\n"); goto out_err1; } @@ -326,7 +326,8 @@ static int read_guests_details(struct seq_file *s, void *v) base->state==V3_VM_STOPPED ? "stopped" : base->state==V3_VM_PAUSED ? "paused" : base->state==V3_VM_ERROR ? "ERROR" : - base->state==V3_VM_SIMULATING ? "simulating" : "UNKNOWN", + base->state==V3_VM_SIMULATING ? "simulating" : + base->state==V3_VM_RESETTING ? "resetting" : "UNKNOWN", core->num_vcores, mem->num_regions); seq_printf(s, "Core States\n"); @@ -337,7 +338,8 @@ static int read_guests_details(struct seq_file *s, void *v) j, core->vcore[j].state==V3_VCORE_INVALID ? "INVALID" : core->vcore[j].state==V3_VCORE_RUNNING ? "running" : - core->vcore[j].state==V3_VCORE_STOPPED ? "stopped" : "UNKNOWN", + core->vcore[j].state==V3_VCORE_STOPPED ? "stopped" : + core->vcore[j].state==V3_VCORE_RESETTING ? "resetting" : "UNKNOWN", core->vcore[j].pcore, core->vcore[j].num_exits, core->vcore[j].last_rip, @@ -355,8 +357,11 @@ static int read_guests_details(struct seq_file *s, void *v) seq_printf(s, "\nMemory Regions\n"); for (j=0;jnum_regions;j++) { - seq_printf(s," region %u has HPAs 0x%p-0x%p\n", - j, mem->region[j].host_paddr, mem->region[j].host_paddr+mem->region[j].size); + seq_printf(s," region %u has HPAs 0x%p-0x%p (node %d) %s %s\n", + j, mem->region[j].host_paddr, mem->region[j].host_paddr+mem->region[j].size, + numa_addr_to_node((uintptr_t)(mem->region[j].host_paddr)), + mem->region[j].swapped ? "swapped" : "", + mem->region[j].pinned ? "pinned" : ""); } } seq_printf(s, @@ -563,6 +568,10 @@ static int __init v3_init(void) { palacios_allow_devmem(); } + // numa is now a required interface and we need it + // up before primary initiatilization + palacios_init_numa(); + // Initialize Palacios palacios_vmm_init(options); @@ -571,7 +580,7 @@ static int __init v3_init(void) { v3_class = class_create(THIS_MODULE, "vms"); - if (IS_ERR(v3_class)) { + if (!v3_class || IS_ERR(v3_class)) { ERROR("Failed to register V3 VM device class\n"); ret = PTR_ERR(v3_class); goto failure3; @@ -677,8 +686,13 @@ static void __exit v3_exit(void) { /* Stop and free any running VMs */ for (i = 0; i < MAX_VMS; i++) { - if (guest_map[i] != NULL) { - guest = (struct v3_guest *)guest_map[i]; + if (guest_map[i] != NULL) { + guest = (struct v3_guest *)(guest_map[i]); + + if (!guest->v3_ctx) { + ERROR("Orphan VM detected and skipped: index=%d name=%s\n", i, guest->name); + continue; + } if (v3_stop_vm(guest->v3_ctx) < 0) ERROR("Couldn't stop VM %d\n", i); @@ -695,6 +709,8 @@ static void __exit v3_exit(void) { palacios_vmm_exit(); + palacios_deinit_numa(); + DEBUG("Palacios Mallocs = %d, Frees = %d\n", mallocs, frees); DEBUG("Palacios Vmallocs = %d, Vfrees = %d\n", vmallocs, vfrees); DEBUG("Palacios Page Allocs = %d, Page Frees = %d\n", pg_allocs, pg_frees);