Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


minor numa interface cleanup, and make sure initialization occurs
Peter Dinda [Thu, 19 Sep 2013 23:26:54 +0000 (18:26 -0500)]
linux_module/main.c
linux_module/numa.c
linux_module/numa.h

index 4d09399..8162172 100644 (file)
@@ -563,6 +563,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);
 
@@ -695,6 +699,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);
index 4c31731..aa2f9a6 100644 (file)
 
 
 
-#if 0
-struct mem_region {
-    u64 start_addr;
-    u64 end_addr;
-    u32 node_id;
-};
-
-
-static struct {
-    unsigned int num_nodes;
-    unsigned int num_cpus;
-    unsigned int num_mem_regions;
-
-    u32 * cpu_to_node_map;
-
-    // For now an array, but we might want to move this to an rbtree
-    struct mem_region * mem_to_node_map;
-    
-    u32 * distance_table;
-} topology}
-
-
-int create_numa_topology_from_user(void __user * argp) {
-    struct v3_numa_topo user_topo;
-
-    if (copy_from_user(&user_topo, argp, sizeof(struct v3_numa_topo))) {
-       ERROR("Could not read in NUMA topology from user\n");
-       return -1;
-    }
-       
-    argp += sizeof(struct v3_numa_topo);
-
-    topology.num_nodes = user_topo.num_nodes;
-    topology.num_cpus = user_topo.num_cpus;
-    topology.num_mem_regions = user_topo.num_mem_regions;
-
-
-    /* Read in the CPU to Node mapping */
-    {
-       topology.cpu_to_node_map = palacios_alloc(sizeof(u32) * topology.num_cpus);
-       
-       if (IS_ERR(topology.cpu_to_node_map)) {
-           ERROR("Could  not allocate cpu to node map\n");
-           return -1;
-       }
-       
-
-       if (copy_from_user(topology.cpu_to_node_map, argp,
-                          sizeof(u32) * topology.num_cpus)) {
-           ERROR("Could not copy cpu to node map from user space\n");
-           palacios_free(topology.cpu_to_node_map);
-           return -1;
-       }
-       
-       argp += sizeof(u32) * topology.num_cpus;
-    }
-
-    /* Read in the memory to Node Mapping */
-    {
-       int i = 0;
-
-       topology.mem_to_node_map = palacios_alloc(sizeof(struct mem_region) * topology.num_mem_regions);
-
-       if (IS_ERR(topology.mem_to_node_map)) {
-           ERROR("Could not allocate mem to node map\n");
-           palacios_free(topology.cpu_to_node_map);
-           return -1;
-       }
-
-       if (copy_from_user(topology.mem_to_node_map, argp,
-                          sizeof(struct mem_region) * topology.num_mem_regions)) {
-           ERROR("Coudl not copy mem to node map from user space\n");
-           palacios_free(topology.cpu_to_node_map);
-           palacios_free(topology.mem_to_node_map);
-           return -1;
-       }
-
-       /* The memory range comes in as the base_addr and the number of pages
-          We need to fix it up to be the base addr and end addr instead 
-          We just perform the transformation inline
-       */
-       for (i = 0; i < topology.num_mem_regions; i++) {
-           struct mem_region * region = &(topology.mem_to_node_map[i]);
-
-           region->end_addr = region->base_addr + (region->end_addr * 4096);
-       }
-
-    }
-
-    
-    /* Read in the distance table */
-    {
-       topology.distance_table = palacios_alloc(sizeof(u32) * (topology.num_nodes * topology.num_nodes));
-       
-       if (IS_ERR(topology.distance_table)) {
-           ERROR("Could not allocate distance table\n");
-           palacios_free(topology.cpu_to_node_map);
-           palacios_free(topology.mem_to_node_map);
-           return -1;
-       }
-       
-
-       if (copy_from_user(topology.distance_table, argp,
-                          sizeof(u32) * (topology.num_nodes * topology.num_nodes))) {
-           ERROR("Could not copy distance table from user space\n");
-           palacios_free(topology.cpu_to_node_map);
-           palacios_free(topology.mem_to_node_map);
-           palacios_free(topology.distance_table);
-           return -1;
-       }
-
-    }
-    
-    /* Report what we found */
-    {
-       int i = 0;
-       int j = 0;
-
-       INFO("Created NUMA topology from user space\n");
-       INFO("Number of Nodes: %d, CPUs: %d, MEM regions: %d\n", 
-              topology.num_nodes, topology.num_cpus, topology.num_mem_regions);
-
-       INFO("CPU mapping\n");
-       for (i = 0; i < topology.num_cpus; i++) {
-           INFO("\tCPU %d -> Node %d\n", i, topology.cpu_to_node_map[i]);
-       }
-
-       INFO("Memory mapping\n");
-
-       for (i = 0; i < topology.num_mem_regions; i++) {
-           struct mem_region * region = &(topology.mem_to_node_map[i]);
-           INFO("\tMEM %p - %p -> Node %d\n", 
-                  region->start_addr, 
-                  region->end_addr, 
-                  region->node_id);
-       }
-
-
-       INFO("Distance Table\n");
-       for (i = 0; i < topology.num_nodes; i++) {
-           INFO("\t%d", i);
-       }
-       INFO("\n");
-       
-       for (i = 0; i < topology.num_nodes; i++) {
-           INFO("%d", i);
-
-           for (j = 0; j < topology.num_nodes; j++) {
-               INFO("\t%d", topology.distance_table[j + (i * topology.num_nodes)]);
-           }
-
-           INFO("\n");
-
-       }           
-
-
-    }
-    return 0;
-
-}
-
-
-#endif
-
-
 
 int numa_num_nodes(void) {
     return num_online_nodes();
@@ -212,6 +47,13 @@ struct v3_numa_hooks numa_hooks = {
 int palacios_init_numa( void ) {
  
     V3_Init_NUMA(&numa_hooks);
+
+    INFO("palacios numa interface initialized\n");
   
     return 0;
 }
+
+int palacios_deinit_numa(void) {
+    INFO("palacios numa interface deinitialized\n");
+    return 0;
+}
index f943163..15c06a7 100644 (file)
@@ -6,13 +6,8 @@
 #ifndef __NUMA_H__
 #define __NUMA_H__
 
-#if 0
-int create_numa_topology_from_user(void __user * argp);
-
-void free_numa_topology();
-#endif
-
 int palacios_init_numa( void );
+int palacios_deinit_numa(void);
 
 int numa_num_nodes(void );
 int numa_cpu_to_node(int cpu_id);