numa: Introduce virNumaGetNodeMemory and use it instead of numa_node_size64

This commit is contained in:
Peter Krempa 2013-10-17 18:30:09 +02:00
parent f72cfea1ab
commit 9dd02965a5
4 changed files with 67 additions and 13 deletions

View File

@ -1524,6 +1524,7 @@ virDomainNumatuneMemModeTypeFromString;
virDomainNumatuneMemModeTypeToString;
virNumaGetAutoPlacementAdvice;
virNumaGetMaxNode;
virNumaGetNodeMemory;
virNumaIsAvailable;
virNumaSetupMemoryPolicy;
virNumaTuneMemPlacementModeTypeFromString;

View File

@ -1680,6 +1680,7 @@ nodeGetCellsFreeMemory(unsigned long long *freeMems,
int startCell,
int maxCells)
{
unsigned long long mem;
int n, lastCell, numCells;
int ret = -1;
int maxCell;
@ -1702,9 +1703,7 @@ nodeGetCellsFreeMemory(unsigned long long *freeMems,
lastCell = maxCell;
for (numCells = 0, n = startCell; n <= lastCell; n++) {
long long mem;
if (numa_node_size64(n, &mem) < 0)
mem = 0;
virNumaGetNodeMemory(n, NULL, &mem);
freeMems[numCells++] = mem;
}
@ -1717,6 +1716,7 @@ cleanup:
unsigned long long
nodeGetFreeMemory(void)
{
unsigned long long mem;
unsigned long long freeMem = 0;
int max_node;
int n;
@ -1728,9 +1728,7 @@ nodeGetFreeMemory(void)
return 0;
for (n = 0; n <= max_node; n++) {
long long mem;
if (numa_node_size64(n, &mem) < 0)
continue;
virNumaGetNodeMemory(n, NULL, &mem);
freeMem += mem;
}
@ -1742,21 +1740,19 @@ nodeGetFreeMemory(void)
* nodeGetCellMemory
* @cell: The number of the numa cell to get memory info for.
*
* Will call the numa_node_size64() function from libnuma to get
* the amount of total memory in bytes. It is then converted to
* KiB and returned.
* Request size of memory in a NUMA node.
*
* Returns 0 if unavailable, amount of memory in KiB on success.
*/
static unsigned long long nodeGetCellMemory(int cell)
{
long long mem;
unsigned long long mem;
unsigned long long memKiB = 0;
int maxCell;
/* Make sure the provided cell number is valid. */
if ((maxCell = virNumaGetMaxNode()) < 0)
return 0;
goto cleanup;
if (cell > maxCell) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -1766,8 +1762,7 @@ static unsigned long long nodeGetCellMemory(int cell)
}
/* Get the amount of memory(bytes) in the node */
mem = numa_node_size64(cell, NULL);
if (mem < 0) {
if (virNumaGetNodeMemory(cell, &mem, NULL) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to query NUMA total memory for node: %d"),
cell);

View File

@ -202,6 +202,45 @@ virNumaGetMaxNode(void)
return ret;
}
/**
* virNumaGetNodeMemorySize:
* @node: identifier of the requested NUMA node
* @memsize: returns the total size of memory in the NUMA node
* @memfree: returns the total free memory in a NUMA node
*
* Returns the size of the memory in one NUMA node in bytes via the @size
* argument and free memory of a node in the @free argument. The caller has to
* guarantee that @node is in range (see virNumaGetMaxNode).
*
* Returns 0 on success, -1 on error. Does not report errors.
*/
int
virNumaGetNodeMemory(int node,
unsigned long long *memsize,
unsigned long long *memfree)
{
long long node_size;
long long node_free;
if (memsize)
*memsize = 0;
if (memfree)
*memfree = 0;
if ((node_size = numa_node_size64(node, &node_free)) < 0)
return -1;
if (memsize)
*memsize = node_size;
if (memfree)
*memfree = node_free;
return 0;
}
#else
int
virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
@ -232,4 +271,20 @@ virNumaGetMaxNode(void)
_("NUMA isn't available on this host"));
return -1;
}
int
virNumaGetNodeMemory(int node ATTRIBUTE_UNUSED,
unsigned long long *memsize,
unsigned long long *memfree)
{
if (memsize)
*memsize = 0;
if (memfree)
*memfree = 0;
VIR_DEBUG("NUMA isn't available on this host");
return -1;
}
#endif

View File

@ -58,5 +58,8 @@ int virNumaSetupMemoryPolicy(virNumaTuneDef numatune,
bool virNumaIsAvailable(void);
int virNumaGetMaxNode(void);
int virNumaGetNodeMemory(int node,
unsigned long long *memsize,
unsigned long long *memfree);
#endif /* __VIR_NUMA_H__ */