diff options
author | Daniele Di Proietto <diproiettod@vmware.com> | 2016-11-15 15:40:49 -0800 |
---|---|---|
committer | Daniele Di Proietto <diproiettod@vmware.com> | 2017-01-15 19:25:12 -0800 |
commit | dbedeb9dd4cc799a2f2097457f73e7f1922bc8a4 (patch) | |
tree | a4e24e360e0b2c1b35f9be2d2b0f82f481ca7ffd /lib | |
parent | b2ce05edeef52770ab3e2dbd982d52c8d9124993 (diff) | |
download | openvswitch-dbedeb9dd4cc799a2f2097457f73e7f1922bc8a4.tar.gz |
ovs-numa: Add new dump types.
They will be used by a future commit.
This patch introduces some code duplication which will be removed in a
future commit.
Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Acked-by: Ilya Maximets <i.maximets@samsung.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ovs-numa.c | 76 | ||||
-rw-r--r-- | lib/ovs-numa.h | 4 |
2 files changed, 79 insertions, 1 deletions
diff --git a/lib/ovs-numa.c b/lib/ovs-numa.c index 85f392a91..7d34c6744 100644 --- a/lib/ovs-numa.c +++ b/lib/ovs-numa.c @@ -32,6 +32,7 @@ #include "openvswitch/list.h" #include "ovs-thread.h" #include "openvswitch/vlog.h" +#include "util.h" VLOG_DEFINE_THIS_MODULE(ovs_numa); @@ -512,6 +513,81 @@ ovs_numa_dump_cores_on_numa(int numa_id) return dump; } +struct ovs_numa_dump * +ovs_numa_dump_cores_with_cmask(const char *cmask) +{ + struct ovs_numa_dump *dump = xmalloc(sizeof *dump); + 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)) { + end_idx = 2; + } + + for (int i = strlen(cmask) - 1; i >= end_idx; i--) { + char hex = cmask[i]; + int bin; + + bin = hexit_value(hex); + if (bin == -1) { + VLOG_WARN("Invalid cpu mask: %c", cmask[i]); + bin = 0; + } + + for (int j = 0; j < 4; j++) { + if ((bin >> j) & 0x1) { + 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)); + } + } + + core_id++; + } + } + + return dump; +} + +struct ovs_numa_dump * +ovs_numa_dump_n_cores_per_numa(int cores_per_numa) +{ + struct ovs_numa_dump *dump = xmalloc(sizeof *dump); + 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; + + LIST_FOR_EACH (core, list_node, &n->cores) { + if (i++ >= 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)); + } + } + + return dump; +} + bool ovs_numa_dump_contains_core(const struct ovs_numa_dump *dump, int numa_id, unsigned core_id) diff --git a/lib/ovs-numa.h b/lib/ovs-numa.h index c0eae07d8..62bdb225f 100644 --- a/lib/ovs-numa.h +++ b/lib/ovs-numa.h @@ -54,12 +54,14 @@ 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); +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); 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) \ +#define FOR_EACH_CORE_ON_DUMP(ITER, DUMP) \ HMAP_FOR_EACH((ITER), hmap_node, &(DUMP)->dump) #endif /* ovs-numa.h */ |