[ovs-dev] [PATCH 12/17] ovs-numa: New ovs_numa_dump_contains_core() function.

Daniele Di Proietto diproiettod at vmware.com
Wed Nov 16 00:46:07 UTC 2016


It will be used by a future commit.  struct ovs_numa_dump now uses an
hmap instead of a list to make ovs_numa_dump_contains_core() more
efficient.

Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 lib/ovs-numa.c | 26 +++++++++++++++++++++++---
 lib/ovs-numa.h | 10 ++++++----
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c
index c8173e0..fc840c8 100644
--- a/lib/ovs-numa.c
+++ b/lib/ovs-numa.c
@@ -494,7 +494,7 @@ ovs_numa_dump_cores_on_numa(int numa_id)
     struct ovs_numa_dump *dump = xmalloc(sizeof *dump);
     struct numa_node *numa = get_numa_by_numa_id(numa_id);
 
-    ovs_list_init(&dump->dump);
+    hmap_init(&dump->dump);
 
     if (numa) {
         struct cpu_core *core;
@@ -504,13 +504,31 @@ ovs_numa_dump_cores_on_numa(int numa_id)
 
             info->numa_id = numa->numa_id;
             info->core_id = core->core_id;
-            ovs_list_insert(&dump->dump, &info->list_node);
+            hmap_insert(&dump->dump, &info->hmap_node,
+                        hash_2words(info->numa_id, info->core_id));
         }
     }
 
     return dump;
 }
 
+
+bool
+ovs_numa_dump_contains_core(const struct ovs_numa_dump *dump,
+                            int numa_id, unsigned core_id)
+{
+    struct ovs_numa_info *core;
+
+    HMAP_FOR_EACH_WITH_HASH(core, hmap_node, hash_2words(numa_id, core_id),
+                            &dump->dump) {
+        if (core->core_id == core_id && core->numa_id == numa_id) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
 void
 ovs_numa_dump_destroy(struct ovs_numa_dump *dump)
 {
@@ -520,10 +538,12 @@ ovs_numa_dump_destroy(struct ovs_numa_dump *dump)
         return;
     }
 
-    LIST_FOR_EACH_POP (iter, list_node, &dump->dump) {
+    HMAP_FOR_EACH_POP (iter, hmap_node, &dump->dump) {
         free(iter);
     }
 
+    hmap_destroy(&dump->dump);
+
     free(dump);
 }
 
diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h
index be836b2..c0eae07 100644
--- a/lib/ovs-numa.h
+++ b/lib/ovs-numa.h
@@ -21,19 +21,19 @@
 #include <stdbool.h>
 
 #include "compiler.h"
-#include "openvswitch/list.h"
+#include "openvswitch/hmap.h"
 
 #define OVS_CORE_UNSPEC INT_MAX
 #define OVS_NUMA_UNSPEC INT_MAX
 
 /* Dump of a list of 'struct ovs_numa_info'. */
 struct ovs_numa_dump {
-    struct ovs_list dump;
+    struct hmap dump;
 };
 
 /* A numa_id - core_id pair. */
 struct ovs_numa_info {
-    struct ovs_list list_node;
+    struct hmap_node hmap_node;
     int numa_id;
     unsigned core_id;
 };
@@ -54,10 +54,12 @@ unsigned ovs_numa_get_unpinned_core_any(void);
 unsigned ovs_numa_get_unpinned_core_on_numa(int numa_id);
 void ovs_numa_unpin_core(unsigned core_id);
 struct ovs_numa_dump *ovs_numa_dump_cores_on_numa(int numa_id);
+bool ovs_numa_dump_contains_core(const struct ovs_numa_dump *,
+                                 int numa_id, unsigned core_id);
 void ovs_numa_dump_destroy(struct ovs_numa_dump *);
 int ovs_numa_thread_setaffinity_core(unsigned core_id);
 
 #define FOR_EACH_CORE_ON_NUMA(ITER, DUMP)                    \
-    LIST_FOR_EACH((ITER), list_node, &(DUMP)->dump)
+    HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->dump)
 
 #endif /* ovs-numa.h */
-- 
2.10.2



More information about the dev mailing list