Skip to content

Commit

Permalink
ovs-numa: New ovs_numa_dump_contains_core() function.
Browse files Browse the repository at this point in the history
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>
Acked-by: Ilya Maximets <i.maximets@samsung.com>
  • Loading branch information
ddiproietto committed Jan 16, 2017
1 parent f5d317a commit b2ce05e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 7 deletions.
25 changes: 22 additions & 3 deletions lib/ovs-numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -504,13 +504,30 @@ 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)
{
Expand All @@ -520,10 +537,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);
}

Expand Down
10 changes: 6 additions & 4 deletions lib/ovs-numa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand All @@ -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 */

0 comments on commit b2ce05e

Please sign in to comment.