X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fmain.c;h=932b739df96e72174f6c8a4ebb7458d30dbf000b;hb=b07dd4e35a37f1db04c4f52f9904ee7206673ac6;hp=7ec627b67d86216e96af61e3a6c280b67c688548;hpb=d1026ce50fd8b517ef69944eba5db7f838820b40;p=palacios.git diff --git a/linux_module/main.c b/linux_module/main.c index 7ec627b..932b739 100644 --- a/linux_module/main.c +++ b/linux_module/main.c @@ -3,7 +3,7 @@ (c) Jack Lange, 2010 */ - +#include #include #include #include @@ -27,13 +27,13 @@ #include "palacios.h" #include "mm.h" #include "vm.h" +#include "numa.h" #include "allow_devmem.h" #include "memcheck.h" #include "lockcheck.h" #include "linux-exts.h" - MODULE_LICENSE("GPL"); // Module parameter @@ -355,8 +355,9 @@ 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)\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))); } } seq_printf(s, @@ -449,6 +450,7 @@ static int guests_full_proc_open(struct inode * inode, struct file * filp) + static struct file_operations guest_full_proc_ops = { .owner = THIS_MODULE, .open = guests_full_proc_open, @@ -465,6 +467,78 @@ static struct file_operations guest_short_proc_ops = { .release = single_release, }; +// Supply basic information that the user-space tools need +// to manipulate Palacios. The current use case here is to +// convey memory information +static int read_info(struct seq_file *s, void *v) +{ + uint64_t mem_block_size; + int i,j; + int max_node=-1; + seq_printf(s,"kernel MAX_ORDER:\t%d\n",MAX_ORDER); + seq_printf(s,"number of nodes:\t%d\n", numa_num_nodes()); + seq_printf(s,"number of cpus: \t%d\n", num_online_cpus()); + seq_printf(s,"\npalacios compiled mem_block_size:\t%d\n", V3_CONFIG_MEM_BLOCK_SIZE); + if (!v3_lookup_option("mem_block_size")) { + mem_block_size = V3_CONFIG_MEM_BLOCK_SIZE; + } else { + if (strict_strtoull(v3_lookup_option("mem_block_size"), 0, &mem_block_size)) { + // huh? + mem_block_size=-1; + } + } + seq_printf(s,"palacios run-time mem_block_size:\t%llu\n", mem_block_size); + + seq_printf(s,"\nCPU to node mappings\n"); + for (i=0;i node %d\n", i, numa_cpu_to_node(i)); + if (numa_cpu_to_node(i)>max_node) { + max_node=numa_cpu_to_node(i); + } + } + seq_printf(s,"\nNode to node distances\n"); + for (j=0;j<=max_node;j++) { + seq_printf(s," \t%2d", j); + } + seq_printf(s,"\n"); + for (i=0;i<=max_node;i++) { + seq_printf(s,"%2d ",i); + for (j=0;j<=max_node;j++) { + seq_printf(s,"\t%2d", numa_get_distance(i,j)); + } + seq_printf(s,"\n"); + } + seq_printf(s,"\nCPU to CPU distances\n"); + for (j=0;jdata); +} + + + +static struct file_operations info_proc_ops = { + .owner = THIS_MODULE, + .open = info_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + static int __init v3_init(void) { @@ -490,6 +564,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); @@ -550,14 +628,27 @@ static int __init v3_init(void) { ERROR("Could not create proc entry\n"); goto failure7; } + + entry = create_proc_entry("v3-info", 0444, palacios_proc_dir); + if (entry) { + entry->proc_fops = &info_proc_ops; + INFO("/proc/v3vee/v3-info successfully created\n"); + } else { + ERROR("Could not create proc entry\n"); + goto failure8; + } + + } return 0; - failure7: + failure8: remove_proc_entry("v3-guests-details", palacios_proc_dir); - failure6: + failure7: remove_proc_entry("v3-guests", palacios_proc_dir); + failure6: + device_destroy(v3_class, dev); failure5: unregister_chrdev_region(MKDEV(v3_major_num, 0), MAX_VMS + 1); failure4: @@ -609,6 +700,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); @@ -629,6 +722,7 @@ static void __exit v3_exit(void) { palacios_deinit_mm(); + remove_proc_entry("v3-info", palacios_proc_dir); remove_proc_entry("v3-guests-details", palacios_proc_dir); remove_proc_entry("v3-guests", palacios_proc_dir); remove_proc_entry("v3vee", NULL);