From f2670434261a395acfe97a9bd93bd55c6b3fb1f2 Mon Sep 17 00:00:00 2001 Message-Id: From: Michal Privoznik Date: Wed, 7 Oct 2020 18:45:41 +0200 Subject: [PATCH] numa: expose HMAT APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These APIs will be used by QEMU driver when building the command line. Signed-off-by: Michal Privoznik Reviewed-by: Daniel Henrique Barboza (cherry picked from commit 11d8ca9794e80224d0634d67da86a20380c22ab5) Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1749518 Conflicts: - src/conf/numa_conf.c: - src/conf/numa_conf.h: Both are context. Signed-off-by: Michal Privoznik Message-Id: Reviewed-by: Ján Tomko --- src/conf/numa_conf.c | 139 +++++++++++++++++++++++++++++++++++++++ src/conf/numa_conf.h | 28 ++++++++ src/libvirt_private.syms | 6 ++ 3 files changed, 173 insertions(+) diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index c90fb01bb6..277a695d84 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -1800,3 +1800,142 @@ virDomainNumaGetMemorySize(virDomainNumaPtr numa) return ret; } + + +bool +virDomainNumaHasHMAT(const virDomainNuma *numa) +{ + size_t i; + + if (!numa) + return false; + + if (numa->ninterconnects) + return true; + + for (i = 0; i < numa->nmem_nodes; i++) { + if (numa->mem_nodes[i].ncaches) + return true; + } + + return false; +} + + +size_t +virDomainNumaGetNodeCacheCount(const virDomainNuma *numa, + size_t node) +{ + if (!numa || node >= numa->nmem_nodes) + return 0; + + return numa->mem_nodes[node].ncaches; +} + + +int +virDomainNumaGetNodeCache(const virDomainNuma *numa, + size_t node, + size_t cache, + unsigned int *level, + unsigned int *size, + unsigned int *line, + virDomainCacheAssociativity *associativity, + virDomainCachePolicy *policy) +{ + const virDomainNumaNode *cell; + + if (!numa || node >= numa->nmem_nodes) + return -1; + + cell = &numa->mem_nodes[node]; + + if (cache >= cell->ncaches) + return -1; + + *level = cell->caches[cache].level; + *size = cell->caches[cache].size; + *line = cell->caches[cache].line; + *associativity = cell->caches[cache].associativity; + *policy = cell->caches[cache].policy; + return 0; +} + + +ssize_t +virDomainNumaGetNodeInitiator(const virDomainNuma *numa, + size_t node) +{ + size_t i; + unsigned int maxBandwidth = 0; + ssize_t candidateBandwidth = -1; + unsigned int minLatency = UINT_MAX; + ssize_t candidateLatency = -1; + + if (!numa || node >= numa->nmem_nodes) + return -1; + + for (i = 0; i < numa->ninterconnects; i++) { + const virDomainNumaInterconnect *l = &numa->interconnects[i]; + + if (l->target != node) + continue; + + switch (l->type) { + case VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_LATENCY: + if (l->value < minLatency) { + minLatency = l->value; + candidateLatency = l->initiator; + } + break; + + case VIR_DOMAIN_NUMA_INTERCONNECT_TYPE_BANDWIDTH: + if (l->value > maxBandwidth) { + maxBandwidth = l->value; + candidateBandwidth = l->initiator; + } + break; + } + } + + if (candidateLatency >= 0) + return candidateLatency; + + return candidateBandwidth; +} + + +size_t +virDomainNumaGetInterconnectsCount(const virDomainNuma *numa) +{ + if (!numa) + return 0; + + return numa->ninterconnects; +} + + +int +virDomainNumaGetInterconnect(const virDomainNuma *numa, + size_t i, + virDomainNumaInterconnectType *type, + unsigned int *initiator, + unsigned int *target, + unsigned int *cache, + virDomainMemoryLatency *accessType, + unsigned long *value) +{ + const virDomainNumaInterconnect *l; + + if (!numa || i >= numa->ninterconnects) + return -1; + + l = &numa->interconnects[i]; + *type = l->type; + *initiator = l->initiator; + *target = l->target; + *cache = l->cache; + *accessType = l->accessType; + *value = l->value; + return 0; +} diff --git a/src/conf/numa_conf.h b/src/conf/numa_conf.h index 2963004c94..63843a1cc6 100644 --- a/src/conf/numa_conf.h +++ b/src/conf/numa_conf.h @@ -220,3 +220,31 @@ int virDomainNumaDefFormatXML(virBufferPtr buf, virDomainNumaPtr def); int virDomainNumaDefValidate(const virDomainNuma *def); unsigned int virDomainNumaGetCPUCountTotal(virDomainNumaPtr numa); + +bool virDomainNumaHasHMAT(const virDomainNuma *numa); + +size_t virDomainNumaGetNodeCacheCount(const virDomainNuma *numa, + size_t node); + +int virDomainNumaGetNodeCache(const virDomainNuma *numa, + size_t node, + size_t cache, + unsigned int *level, + unsigned int *size, + unsigned int *line, + virDomainCacheAssociativity *associativity, + virDomainCachePolicy *policy); + +ssize_t virDomainNumaGetNodeInitiator(const virDomainNuma *numa, + size_t node); + +size_t virDomainNumaGetInterconnectsCount(const virDomainNuma *numa); + +int virDomainNumaGetInterconnect(const virDomainNuma *numa, + size_t i, + virDomainNumaInterconnectType *type, + unsigned int *initiator, + unsigned int *target, + unsigned int *cache, + virDomainMemoryLatency *accessType, + unsigned long *value); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index de95e3b116..fdd104cd25 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -820,14 +820,20 @@ virDomainNumaCheckABIStability; virDomainNumaEquals; virDomainNumaFree; virDomainNumaGetCPUCountTotal; +virDomainNumaGetInterconnect; +virDomainNumaGetInterconnectsCount; virDomainNumaGetMaxCPUID; virDomainNumaGetMemorySize; +virDomainNumaGetNodeCache; +virDomainNumaGetNodeCacheCount; virDomainNumaGetNodeCount; virDomainNumaGetNodeCpumask; virDomainNumaGetNodeDiscard; virDomainNumaGetNodeDistance; +virDomainNumaGetNodeInitiator; virDomainNumaGetNodeMemoryAccessMode; virDomainNumaGetNodeMemorySize; +virDomainNumaHasHMAT; virDomainNumaNew; virDomainNumaNodeDistanceIsUsingDefaults; virDomainNumaNodesDistancesAreBeingSet; -- 2.29.2