virsh: added --all flag to freecell command

This will iterate over all NUMA nodes, showing
free memory for each and sum at the end.
Existing default behavior is not changed.
This commit is contained in:
Michal Privoznik 2011-01-28 19:21:57 +01:00 committed by Eric Blake
parent 96f4986aca
commit 30e21374ea

View File

@ -2273,36 +2273,87 @@ static const vshCmdInfo info_freecell[] = {
static const vshCmdOptDef opts_freecell[] = {
{"cellno", VSH_OT_INT, 0, N_("NUMA cell number")},
{"all", VSH_OT_BOOL, 0, N_("show free memory for all NUMA cells")},
{NULL, 0, 0, NULL}
};
static int
cmdFreecell(vshControl *ctl, const vshCmd *cmd)
{
int func_ret = FALSE;
int ret;
int cell, cell_given;
unsigned long long memory;
unsigned long long *nodes = NULL;
int all_given;
virNodeInfo info;
if (!vshConnectionUsability(ctl, ctl->conn))
return FALSE;
cell = vshCommandOptInt(cmd, "cellno", &cell_given);
all_given = vshCommandOptBool(cmd, "all");
if (all_given && cell_given) {
vshError(ctl, "%s", _("--cellno and --all are mutually exclusive. "
"Please choose only one."));
goto cleanup;
}
if (all_given) {
if (virNodeGetInfo(ctl->conn, &info) < 0) {
vshError(ctl, "%s", _("failed to get NUMA nodes count"));
goto cleanup;
}
if (!info.nodes) {
vshError(ctl, "%s", _("no NUMA nodes present"));
goto cleanup;
}
if (VIR_ALLOC_N(nodes, info.nodes) < 0) {
vshError(ctl, "%s", _("could not allocate memory"));
goto cleanup;
}
ret = virNodeGetCellsFreeMemory(ctl->conn, nodes, 0, info.nodes);
if (ret != info.nodes) {
vshError(ctl, "%s", _("could not get information about "
"all NUMA nodes"));
goto cleanup;
}
memory = 0;
for (cell = 0; cell < info.nodes; cell++) {
vshPrint(ctl, "%5d: %10llu kB\n", cell, (nodes[cell]/1024));
memory += nodes[cell];
}
vshPrintExtra(ctl, "--------------------\n");
vshPrintExtra(ctl, "%5s: %10llu kB\n", _("Total"), memory/1024);
} else {
if (!cell_given) {
memory = virNodeGetFreeMemory(ctl->conn);
if (memory == 0)
return FALSE;
goto cleanup;
} else {
ret = virNodeGetCellsFreeMemory(ctl->conn, &memory, cell, 1);
if (ret != 1)
return FALSE;
goto cleanup;
}
if (cell == -1)
vshPrint(ctl, "%s: %llu kB\n", _("Total"), (memory/1024));
else
vshPrint(ctl, "%d: %llu kB\n", cell, (memory/1024));
}
return TRUE;
func_ret = TRUE;
cleanup:
VIR_FREE(nodes);
return func_ret;
}
/*