@@ -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);
}
@@ -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 */
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@vmware.com> --- lib/ovs-numa.c | 26 +++++++++++++++++++++++--- lib/ovs-numa.h | 10 ++++++---- 2 files changed, 29 insertions(+), 7 deletions(-)