mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
virnuma: Introduce virNumaGetDistances
The API gets a NUMA node and find distances to other nodes. The distances are returned in an array. If an item X within the array equals to value of zero, then there's no such node as X. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
9046f910bd
commit
77c830d8c4
@ -1652,6 +1652,7 @@ virNodeSuspendGetTargetMask;
|
||||
virDomainNumatuneMemModeTypeFromString;
|
||||
virDomainNumatuneMemModeTypeToString;
|
||||
virNumaGetAutoPlacementAdvice;
|
||||
virNumaGetDistances;
|
||||
virNumaGetMaxNode;
|
||||
virNumaGetNodeMemory;
|
||||
virNumaIsAvailable;
|
||||
|
@ -216,6 +216,61 @@ virNumaGetMaxNode(void)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virNumaGetDistances:
|
||||
* @node: identifier of the requested NUMA node
|
||||
* @distances: array of distances to sibling nodes
|
||||
* @ndistances: size of @distances
|
||||
*
|
||||
* Get array of distances to sibling nodes from @node. If a
|
||||
* distances[x] equals to zero, the node x is not enabled or
|
||||
* doesn't exist. As a special case, if @node itself refers to
|
||||
* disabled or nonexistent NUMA node, then @distances and
|
||||
* @ndistances are set to NULL and zero respectively.
|
||||
*
|
||||
* The distances are a bit of magic. For a local node the value
|
||||
* is 10, for remote it's typically 20 meaning that time penalty
|
||||
* for accessing a remote node is two time bigger than when
|
||||
* accessing a local node.
|
||||
*
|
||||
* Returns 0 on success, -1 otherwise.
|
||||
*/
|
||||
int
|
||||
virNumaGetDistances(int node,
|
||||
int **distances,
|
||||
int *ndistances)
|
||||
{
|
||||
int ret = -1;
|
||||
int max_node;
|
||||
size_t i;
|
||||
|
||||
if (!numa_bitmask_isbitset(numa_nodes_ptr, node)) {
|
||||
VIR_DEBUG("Node %d does not exist", node);
|
||||
*distances = NULL;
|
||||
*ndistances = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((max_node = virNumaGetMaxNode()) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (VIR_ALLOC_N(*distances, max_node) < 0)
|
||||
goto cleanup;
|
||||
|
||||
*ndistances = max_node + 1;
|
||||
|
||||
for (i = 0; i<= max_node; i++) {
|
||||
if (!numa_bitmask_isbitset(numa_nodes_ptr, i))
|
||||
continue;
|
||||
|
||||
(*distances)[i] = numa_distance(node, i);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* virNumaGetNodeMemory:
|
||||
* @node: identifier of the requested NUMA node
|
||||
|
@ -58,6 +58,9 @@ int virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
|
||||
|
||||
bool virNumaIsAvailable(void);
|
||||
int virNumaGetMaxNode(void);
|
||||
int virNumaGetDistances(int node,
|
||||
int **distances,
|
||||
int *ndistances);
|
||||
int virNumaGetNodeMemory(int node,
|
||||
unsigned long long *memsize,
|
||||
unsigned long long *memfree);
|
||||
|
Loading…
Reference in New Issue
Block a user