X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=38a2fd4a28e33d1aacd812fc5f71189478a24a2b;hb=cfc3d544077dfbcc8b407fef7b76fa4c4b30f300;hp=99ec9e8c420b6510a71393e65e6612859433c89a;hpb=e8e3ec0355b791d6f729df796d0155bccca85090;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 99ec9e8..38a2fd4 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; } @@ -355,8 +355,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, @@ -481,7 +484,7 @@ static int read_info(struct seq_file *s, void *v) if (!v3_lookup_option("mem_block_size")) { mem_block_size = V3_CONFIG_MEM_BLOCK_SIZE; } else { - if (kstrtoull(v3_lookup_option("mem_block_size"), 0, &mem_block_size)) { + if (strict_strtoull(v3_lookup_option("mem_block_size"), 0, &mem_block_size)) { // huh? mem_block_size=-1; } @@ -563,6 +566,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 +578,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 +684,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 +707,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);