libnuma: changes in type defs and macros
authorReto Achermann <reto.achermann@inf.ethz.ch>
Tue, 16 Dec 2014 12:34:48 +0000 (13:34 +0100)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Tue, 16 Dec 2014 12:34:48 +0000 (13:34 +0100)
* moved definition of nodeid_t into types.h
* changed printf specifies to use PRIuNODEID
* changes in debug macros to take arguments
* additional sanity checks for core/node ids

include/barrelfish_kpi/types.h
include/numa.h
lib/numa/numa.c
lib/numa/numa_debug.h
lib/numa/numa_internal.h
lib/numa/utilities.c

index 58a5837..d8116da 100644 (file)
@@ -86,6 +86,15 @@ typedef uint8_t      coreid_t;
 #define MAX_COREID  255 // limit of coreid_t type (see comment above)
 #endif
 
+/* node id type */
+typedef coreid_t nodeid_t;
+#define PRIuNODEID PRIu8
+#define PRIxNODEID PRIx8
+
+#ifndef MAX_NODEID
+#define MAX_NODEID 255
+#endif
+
 /* ID capability ID */
 // Returned if IDCmd_Identify is invoked on an ID capability.
 typedef uint64_t idcap_id_t;
index 790efd7..9831263 100644 (file)
 #ifndef __NUMA_H
 #define __NUMA_H 1
 
-///< typedef for the NUMA node IDs
-typedef coreid_t nodeid_t;
-
 ///< the maximum number of nodes supported
 #define NUMA_MAX_NUMNODES 16
 
+#if NUMA_MAX_NUMNODES > MAX_NODEID
+#error maximum node bigger than maximum nodeid
+#endif
+
 ///< specify the local node for allocation
 #define NUMA_NODE_LOCAL ((nodeid_t)-1)
 
 ///< error value for the numa node size
 #define NUMA_NODE_INVALID ((uintptr_t)-1)
 
+///< error value for invalid cores
+#define NUMA_CORE_INVALID ((coreid_t)-1);
+
+
 typedef enum numa_policy {
     NUMA_POLICY_DEFAULT,   ///< default numa policy
     NUMA_POLICY_STRICT,    ///< strict numa policy
index 976e2b1..6223be7 100644 (file)
@@ -78,6 +78,8 @@ errval_t numa_available(void)
 
     numa_initialized = 0x1;
 
+    /* TODO: initialize bitmap pointers */
+
     return SYS_ERR_OK;
 }
 
@@ -88,6 +90,8 @@ errval_t numa_available(void)
  */
 nodeid_t numa_max_node(void)
 {
+    numa_check_init();
+
     // XXX: assume nodes are 0..n-1
     return numa_topology.num_nodes - 1;
 }
@@ -99,6 +103,8 @@ nodeid_t numa_max_node(void)
  */
 coreid_t numa_max_core(void)
 {
+    numa_check_init();
+
     // XXX: assume the IDs are 0...n-1
     return numa_topology.num_cores - 1;
 }
@@ -110,6 +116,8 @@ coreid_t numa_max_core(void)
  */
 nodeid_t numa_current_node(void)
 {
+    numa_check_init();
+
     // XXX: do we need disp_get_core_id() here?
     return numa_topology.cores[disp_get_current_core_id()]->node->id;
 }
@@ -121,6 +129,8 @@ nodeid_t numa_current_node(void)
  */
 nodeid_t numa_num_possible_nodes(void)
 {
+    numa_check_init();
+
     return NUMA_MAX_NUMNODES;
 }
 
@@ -134,6 +144,8 @@ nodeid_t numa_num_possible_nodes(void)
  */
 nodeid_t numa_num_configured_nodes(void)
 {
+    numa_check_init();
+
     // XXX: we have all nodes configures
     return numa_topology.num_nodes;
 }
@@ -148,6 +160,8 @@ nodeid_t numa_num_configured_nodes(void)
  */
 struct numa_bm *numa_get_mems_allowed(void)
 {
+    numa_check_init();
+
     assert(!"NYI");
     return 0;
 }
@@ -162,6 +176,8 @@ struct numa_bm *numa_get_mems_allowed(void)
  */
 coreid_t numa_num_configured_cpus(void)
 {
+    numa_check_init();
+
     // XXX we assume that we can schedule all cores
     return numa_topology.num_cores;
 }
@@ -173,6 +189,8 @@ coreid_t numa_num_configured_cpus(void)
  */
 coreid_t numa_num_task_cpus(void)
 {
+    numa_check_init();
+
     // XXX: we do not have any restrictions yet, return all cores
     return numa_topology.num_cores;
 }
@@ -185,6 +203,8 @@ coreid_t numa_num_task_cpus(void)
  */
 nodeid_t numa_num_task_nodes(void)
 {
+    numa_check_init();
+
     // XXX: We do not have any restrictions yet. just return all nodes
     return numa_topology.num_nodes;
 }
@@ -203,6 +223,7 @@ nodeid_t numa_num_task_nodes(void)
  */
 size_t numa_node_size(nodeid_t node, uintptr_t *freep)
 {
+    numa_check_init();
     numa_check_node_id(node);
 
     if (freep) {
@@ -220,6 +241,7 @@ size_t numa_node_size(nodeid_t node, uintptr_t *freep)
  */
 lpaddr_t numa_node_base(nodeid_t node)
 {
+    numa_check_init();
     numa_check_node_id(node);
 
     return numa_topology.nodes[node].mem_base;
@@ -232,6 +254,7 @@ lpaddr_t numa_node_base(nodeid_t node)
  */
 nodeid_t numa_preferred(void)
 {
+    numa_check_init();
     return numa_current_node();
 }
 
@@ -247,8 +270,11 @@ nodeid_t numa_preferred(void)
  */
 void numa_set_preferred(nodeid_t node)
 {
+    numa_check_init();
+
     if (node >= numa_topology.num_nodes) {
-        NUMA_WARNING("Node ID exceeds number of available nodes");
+        NUMA_WARNING("Node ID exceeds number of available nodes %" PRIuNODEID "/%"
+                     PRIuNODEID, node, numa_topology.num_nodes);
         return;
     }
 
@@ -268,6 +294,8 @@ void numa_set_preferred(nodeid_t node)
  */
 errval_t numa_run_on_node(nodeid_t node)
 {
+    numa_check_init();
+
     USER_PANIC("running the domain on a specific node is not supported yet\n");
     return 0;
 }
@@ -283,6 +311,8 @@ errval_t numa_run_on_node(nodeid_t node)
  */
 errval_t numa_run_on_node_mask(struct numa_bm *nodemask)
 {
+    numa_check_init();
+
     USER_PANIC("running the domain on a specific node is not supported yet\n");
     return 0;
 }
@@ -295,6 +325,8 @@ errval_t numa_run_on_node_mask(struct numa_bm *nodemask)
  */
 struct numa_bm *numa_get_run_node_mask(void)
 {
+    numa_check_init();
+
     return numa_all_nodes_ptr;
 }
 
@@ -309,6 +341,8 @@ struct numa_bm *numa_get_run_node_mask(void)
  */
 void numa_set_bind_policy(numa_policy_t strict)
 {
+    numa_check_init();
+
     if (strict == NUMA_POLICY_STRICT) {
         numa_topology.bind = strict;
     } else {
@@ -328,6 +362,8 @@ void numa_set_bind_policy(numa_policy_t strict)
  */
 void numa_set_strict(numa_policy_t strict)
 {
+    numa_check_init();
+
     if (strict == NUMA_POLICY_STRICT) {
         numa_topology.strict = strict;
     } else {
@@ -349,6 +385,8 @@ void numa_set_strict(numa_policy_t strict)
  */
 uint32_t numa_distance(nodeid_t from, nodeid_t to)
 {
+    numa_check_init();
+
     assert(!"NYI");
     return 0;
 }
@@ -365,6 +403,8 @@ uint32_t numa_distance(nodeid_t from, nodeid_t to)
  */
 errval_t numa_sched_getaffinity(domainid_t did, struct numa_bm *mask)
 {
+    numa_check_init();
+
     assert(!"NYI");
     return 0;
 }
@@ -381,6 +421,8 @@ errval_t numa_sched_getaffinity(domainid_t did, struct numa_bm *mask)
  */
 errval_t numa_sched_setaffinity(domainid_t did, struct numa_bm *mask)
 {
+    numa_check_init();
+
     assert(!"NYI");
     return 0;
 }
@@ -393,6 +435,8 @@ errval_t numa_sched_setaffinity(domainid_t did, struct numa_bm *mask)
  */
 size_t numa_pagesize(void)
 {
+    numa_check_init();
+
     return numa_topology.pagesize;
 }
 
@@ -412,6 +456,8 @@ size_t numa_pagesize(void)
  */
 errval_t numa_node_to_cpus(nodeid_t node, struct numa_bm *mask)
 {
+    numa_check_init();
+
     assert(!"NYI");
     return 0;
 }
@@ -427,10 +473,9 @@ errval_t numa_node_to_cpus(nodeid_t node, struct numa_bm *mask)
  */
 nodeid_t numa_node_of_cpu(coreid_t cpu)
 {
-    if (cpu < numa_topology.num_cores) {
-        return numa_topology.cores[cpu]->node->id;
-    } else {
-        NUMA_WARNING("Core ID exceeds number of present cores");
-        return (nodeid_t)NUMA_NODE_INVALID;
-    }
+    numa_check_init();
+
+    numa_check_core_id(cpu);
+
+    return numa_topology.cores[cpu]->node->id;
 }
index 086c6f8..29c8aca 100644 (file)
@@ -34,7 +34,7 @@
 
 #define NUMA_DEBUG_ALLOC(x...) NUMA_DEBUG_PRINT("[numa alloc] " x);
 
-#define NUMA_ERROR(x...) debug_printf("[numa error] %s():" x "\n",  __FUNCTION__);
-#define NUMA_WARNING(x...) debug_printf("[numa  warn] %s():" x "\n",  __FUNCTION__);
+#define NUMA_ERROR(fmt, ...) debug_printf("[numa error] " fmt " in %s():", __VA_ARGS__, __FUNCTION__);
+#define NUMA_WARNING(fmt, ...) debug_printf("[numa  warn] " fmt " in %s():", __VA_ARGS__, __FUNCTION__);
 
 #endif /* NUMA_DEBUG_H_ */
index 89a0fea..c77967c 100644 (file)
@@ -117,14 +117,16 @@ void numa_dump_topology(struct numa_topology *topology);
 
 #define numa_check_node_id(_id) \
     if (_id >= numa_topology.num_nodes) { \
-        NUMA_WARNING("Node ID exceeds number of available nodes"); \
+        NUMA_WARNING("Node ID exceeds number of available nodes: %" PRIuNODEID "/%" \
+                      PRIuNODEID, _id, numa_topology.num_nodes); \
         return NUMA_NODE_INVALID; \
     }
 
 #define numa_check_core_id(_id) \
-    if (_id >= numa_topology.num_nodes) { \
-        NUMA_WARNING("Core ID exceeds number of available cores"); \
-        return NUMA_NODE_INVALID; \
+    if (_id >= numa_topology.num_cores) { \
+        NUMA_WARNING("Core ID exceeds number of available cores: %"PRIuCOREID \
+                     "/%" PRIuCOREID, _id, numa_topology.num_cores); \
+        return (coreid_t)-1; \
     }
 
 #else
index 7205f3a..c21f8f7 100644 (file)
@@ -37,27 +37,28 @@ void numa_dump_topology(struct numa_topology *topology)
 
     printf("dumping NUMA topology\n");
     printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n");
-    printf("Cores: %" PRIuCOREID "  Nodes: %u\n", topology->num_cores,
+
+    printf("Cores: %" PRIuCOREID "  Nodes: %" PRIuNODEID" \n", topology->num_cores,
            topology->num_nodes);
 
     printf("---------------------------------------\n");
     for (nodeid_t nodeid = 0; nodeid < topology->num_nodes; ++nodeid) {
         struct numa_node *node = &topology->nodes[nodeid];
-        printf(" # Node %u:  [0x%016" PRIxLPADDR ", 0x%016" PRIxLPADDR "] of %"
-               PRIu64 " MB\n", nodeid, node->mem_base, node->mem_limit,
+        printf(" # Node %" PRIuNODEID ":  [0x%016" PRIxLPADDR ", 0x%016" PRIxLPADDR
+               "] of %" PRIu64 " MB\n", nodeid, node->mem_base, node->mem_limit,
                (node->mem_limit - node->mem_base) >> 20);
         for (coreid_t coreid = 0; coreid < node->num_cores; ++coreid) {
             struct numa_core *core = &node->cores[coreid];
-            printf("  + Core %-3" PRIuCOREID ": [apic=%-3" PRIu16 ", node=%-3d]\n",
-                   core->id, core->apicid, core->node->id);
+            printf("  + Core %-3" PRIuCOREID ": [apic=%-3" PRIu16 ", node=%-3"
+                        PRIuNODEID "]\n", core->id, core->apicid, core->node->id);
         }
     }
 
     printf("---------------------------------------\n");
     for (coreid_t coreid = 0; coreid < topology->num_cores; ++coreid) {
         struct numa_core *core = topology->cores[coreid];
-        printf(" # Core %-3" PRIuCOREID ": [apic=%-3" PRIu16 ", node=%-3d]\n",
-               coreid, core->apicid, core->node->id);
+        printf(" # Core %-3" PRIuCOREID ": [apic=%-3" PRIu16 ", node=%-3"
+               PRIuNODEID "]\n", coreid, core->apicid, core->node->id);
     }
 
     printf("\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
@@ -102,11 +103,19 @@ errval_t numa_get_topology_from_skb(struct numa_topology *topology)
         return err_push(err, NUMA_ERR_SKB_DATA);
     }
 
-    NUMA_DEBUG_INIT("discovered topology with %" PRIu32 " nodes, %" PRIu32 " cores\n",
-                    node, core);
+    NUMA_DEBUG_INIT("discovered topology with %" PRIuNODEID " nodes, %" PRIuCOREID
+                    " cores\n", node, core);
+
+    if (!core || !node || node > core) {
+        NUMA_ERROR("invalid number of cores %" PRIu32 " or nodes %" PRIu32 ".",
+                   core, node);
+        return err_push(err, NUMA_ERR_SKB_DATA);
+    }
 
-    if (!core || !node) {
-        USER_PANIC("invalid data returned\n");
+    if (core >= MAX_COREID || node >= NUMA_MAX_NUMNODES) {
+        NUMA_ERROR("too large number of cores %" PRIu32 " or nodes %" PRIu32 ".",
+                   core, node);
+        return err_push(err, NUMA_ERR_SKB_DATA);
     }
 
     topology->num_cores = (coreid_t) core;
@@ -157,15 +166,15 @@ errval_t numa_get_topology_from_skb(struct numa_topology *topology)
 
         // TODO: topology->nodes[node].coresbm = allocbm()
 
-        NUMA_DEBUG_INIT("  > node %u [0x%016" PRIxLPADDR", 0x%016" PRIxLPADDR"] (%"
-                        PRIuLPADDR" MB)\n",
+        NUMA_DEBUG_INIT("  > node %" PRIuNODEID " [0x%016" PRIxLPADDR", 0x%016"
+                        PRIxLPADDR "] (%" PRIuLPADDR " MB)\n",
                         node, base, limit, (limit-base) >> 20);
         parsed++;
     }
 
     if ((nodeid_t) parsed != topology->num_nodes) {
-        NUMA_DEBUG_INIT("node list incomplete: %" PRIu32 ", %" PRIu32 "\n", parsed,
-                        topology->num_nodes);
+        NUMA_DEBUG_INIT("node list incomplete: %" PRIuNODEID ", %" PRIuNODEID "\n",
+                        parsed, topology->num_nodes);
         err = NUMA_ERR_SKB_DATA;
         goto error_out;
     }
@@ -186,7 +195,7 @@ errval_t numa_get_topology_from_skb(struct numa_topology *topology)
             break;
         }
         if (!(node < topology->num_nodes)) {
-            NUMA_DEBUG_INIT("core %" PRIuCOREID " invalid node id %" PRIu32 "\n",
+            NUMA_DEBUG_INIT("core %" PRIuCOREID " invalid node id %" PRIuNODEID "\n",
                             core, node);
             err = NUMA_ERR_SKB_DATA;
             goto error_out;
@@ -213,8 +222,8 @@ errval_t numa_get_topology_from_skb(struct numa_topology *topology)
             goto error_out;
         }
 
-        NUMA_DEBUG_INIT("  > %s core %"PRIuCOREID" apic=%"PRIu32", node=%"PRIu32"\n",
-                        arch, (coreid_t )core, apic, node);
+        NUMA_DEBUG_INIT("  > %s core %" PRIuCOREID" apic=%" PRIu32 ", node=%"
+                        PRIuNODEID "\n", arch, (coreid_t )core, apic, node);
         parsed++;
     }
 
@@ -232,6 +241,3 @@ errval_t numa_get_topology_from_skb(struct numa_topology *topology)
     return err;
 
 }
-
-
-