[ovs-dev] [PATCH v3 15/18] ovs-numa: Add per numa and global counts in dump.

Daniele Di Proietto diproiettod at vmware.com
Mon Jan 9 03:15:13 UTC 2017


They will be used by a future commit.

Suggested-by: Ilya Maximets <i.maximets at samsung.com>
Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 lib/ovs-numa.c | 96 +++++++++++++++++++++++++++++++++++++---------------------
 lib/ovs-numa.h | 18 +++++++++--
 2 files changed, 77 insertions(+), 37 deletions(-)

diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
index f8a37b1ea..04225a958 100644
--- a/lib/ovs-numa.c
+++ b/lib/ovs-numa.c
@@ -489,25 +489,53 @@ ovs_numa_unpin_core(unsigned core_id)
     }
 }
 
+static struct ovs_numa_dump *
+ovs_numa_dump_create(void)
+{
+    struct ovs_numa_dump *dump = xmalloc(sizeof *dump);
+
+    hmap_init(&dump->cores);
+    hmap_init(&dump->numas);
+
+    return dump;
+}
+
+static void
+ovs_numa_dump_add(struct ovs_numa_dump *dump, int numa_id, int core_id)
+{
+    struct ovs_numa_info_core *c = xzalloc(sizeof *c);
+    struct ovs_numa_info_numa *n;
+
+    c->numa_id = numa_id;
+    c->core_id = core_id;
+    hmap_insert(&dump->cores, &c->hmap_node, hash_2words(numa_id, core_id));
+
+    HMAP_FOR_EACH_WITH_HASH (n, hmap_node, hash_int(numa_id, 0),
+                             &dump->numas) {
+        if (n->numa_id == numa_id) {
+            n->n_cores++;
+            return;
+        }
+    }
+
+    n = xzalloc(sizeof *n);
+    n->numa_id = numa_id;
+    n->n_cores = 1;
+    hmap_insert(&dump->numas, &n->hmap_node, hash_int(numa_id, 0));
+}
+
 /* Given the 'numa_id', returns dump of all cores on the numa node. */
 struct ovs_numa_dump *
 ovs_numa_dump_cores_on_numa(int numa_id)
 {
-    struct ovs_numa_dump *dump = xmalloc(sizeof *dump);
+    struct ovs_numa_dump *dump = ovs_numa_dump_create();
     struct numa_node *numa = get_numa_by_numa_id(numa_id);
 
-    hmap_init(&dump->dump);
-
     if (numa) {
         struct cpu_core *core;
 
-        LIST_FOR_EACH(core, list_node, &numa->cores) {
-            struct ovs_numa_info *info = xmalloc(sizeof *info);
-
-            info->numa_id = numa->numa_id;
-            info->core_id = core->core_id;
-            hmap_insert(&dump->dump, &info->hmap_node,
-                        hash_2words(info->numa_id, info->core_id));
+        LIST_FOR_EACH (core, list_node, &numa->cores) {
+            ovs_numa_dump_add(dump, numa->numa_id, core->core_id);
         }
     }
 
@@ -517,12 +545,10 @@ ovs_numa_dump_cores_on_numa(int numa_id)
 struct ovs_numa_dump *
 ovs_numa_dump_cores_with_cmask(const char *cmask)
 {
-    struct ovs_numa_dump *dump = xmalloc(sizeof *dump);
+    struct ovs_numa_dump *dump = ovs_numa_dump_create();
     int core_id = 0;
     int end_idx;
 
-    hmap_init(&dump->dump);
-
     /* Ignore leading 0x. */
     end_idx = 0;
     if (!strncmp(cmask, "0x", 2) || !strncmp(cmask, "0X", 2)) {
@@ -547,12 +573,9 @@ ovs_numa_dump_cores_with_cmask(const char *cmask)
                 struct cpu_core *core = get_core_by_core_id(core_id);
 
                 if (core) {
-                    struct ovs_numa_info *info = xmalloc(sizeof *info);
-
-                    info->numa_id = core->numa->numa_id;
-                    info->core_id = core->core_id;
-                    hmap_insert(&dump->dump, &info->hmap_node,
-                                hash_2words(info->numa_id, info->core_id));
+                    ovs_numa_dump_add(dump,
+                                      core->numa->numa_id,
+                                      core->core_id);
                 }
             }
 
@@ -566,11 +589,9 @@ ovs_numa_dump_cores_with_cmask(const char *cmask)
 struct ovs_numa_dump *
 ovs_numa_dump_n_cores_per_numa(int cores_per_numa)
 {
-    struct ovs_numa_dump *dump = xmalloc(sizeof *dump);
+    struct ovs_numa_dump *dump = ovs_numa_dump_create();
     const struct numa_node *n;
 
-    hmap_init(&dump->dump);
-
     HMAP_FOR_EACH (n, hmap_node, &all_numa_nodes) {
         const struct cpu_core *core;
         int i = 0;
@@ -580,12 +601,7 @@ ovs_numa_dump_n_cores_per_numa(int cores_per_numa)
                 break;
             }
 
-            struct ovs_numa_info *info = xmalloc(sizeof *info);
-
-            info->numa_id = core->numa->numa_id;
-            info->core_id = core->core_id;
-            hmap_insert(&dump->dump, &info->hmap_node,
-                        hash_2words(info->numa_id, info->core_id));
+            ovs_numa_dump_add(dump, core->numa->numa_id, core->core_id);
         }
     }
 
@@ -596,10 +612,10 @@ bool
 ovs_numa_dump_contains_core(const struct ovs_numa_dump *dump,
                             int numa_id, unsigned core_id)
 {
-    struct ovs_numa_info *core;
+    struct ovs_numa_info_core *core;
 
     HMAP_FOR_EACH_WITH_HASH (core, hmap_node, hash_2words(numa_id, core_id),
-                             &dump->dump) {
+                             &dump->cores) {
         if (core->core_id == core_id && core->numa_id == numa_id) {
             return true;
         }
@@ -608,20 +624,32 @@ ovs_numa_dump_contains_core(const struct ovs_numa_dump *dump,
     return false;
 }
 
+size_t
+ovs_numa_dump_count(const struct ovs_numa_dump *dump)
+{
+    return hmap_count(&dump->cores);
+}
+
 void
 ovs_numa_dump_destroy(struct ovs_numa_dump *dump)
 {
-    struct ovs_numa_info *iter;
+    struct ovs_numa_info_core *c;
+    struct ovs_numa_info_numa *n;
 
     if (!dump) {
         return;
     }
 
-    HMAP_FOR_EACH_POP (iter, hmap_node, &dump->dump) {
-        free(iter);
+    HMAP_FOR_EACH_POP (c, hmap_node, &dump->cores) {
+        free(c);
+    }
+
+    HMAP_FOR_EACH_POP (n, hmap_node, &dump->numas) {
+        free(n);
     }
 
-    hmap_destroy(&dump->dump);
+    hmap_destroy(&dump->cores);
+    hmap_destroy(&dump->numas);
 
     free(dump);
 }
diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h
index 62bdb225f..52339ace2 100644
--- a/lib/ovs-numa.h
+++ b/lib/ovs-numa.h
@@ -28,16 +28,24 @@
 
 /* Dump of a list of 'struct ovs_numa_info'. */
 struct ovs_numa_dump {
-    struct hmap dump;
+    struct hmap cores;
+    struct hmap numas;
 };
 
 /* A numa_id - core_id pair. */
-struct ovs_numa_info {
+struct ovs_numa_info_core {
     struct hmap_node hmap_node;
     int numa_id;
     unsigned core_id;
 };
 
+/* A numa node. */
+struct ovs_numa_info_numa {
+    struct hmap_node hmap_node;
+    int numa_id;
+    size_t n_cores;
+};
+
 void ovs_numa_init(void);
 void ovs_numa_set_dummy(const char *dummy_config);
 bool ovs_numa_numa_id_is_valid(int numa_id);
@@ -58,10 +66,14 @@ struct ovs_numa_dump *ovs_numa_dump_cores_with_cmask(const char *cmask);
 struct ovs_numa_dump *ovs_numa_dump_n_cores_per_numa(int n);
 bool ovs_numa_dump_contains_core(const struct ovs_numa_dump *,
                                  int numa_id, unsigned core_id);
+size_t ovs_numa_dump_count(const struct ovs_numa_dump *);
 void ovs_numa_dump_destroy(struct ovs_numa_dump *);
 int ovs_numa_thread_setaffinity_core(unsigned core_id);
 
 #define FOR_EACH_CORE_ON_DUMP(ITER, DUMP)                    \
-    HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->dump)
+    HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->cores)
+
+#define FOR_EACH_NUMA_ON_DUMP(ITER, DUMP)                    \
+    HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->numas)
 
 #endif /* ovs-numa.h */
-- 
2.11.0



More information about the dev mailing list