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;
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)
{
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);
}
#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;
};
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 */