Signed-off-by: Lin Ma <lma@xxxxxxxx> --- tools/virsh-completer-host.c | 35 +++++++++++++++++++++++++++++++++++ tools/virsh-completer-host.h | 4 ++++ tools/virsh-host.c | 1 + 3 files changed, 40 insertions(+) diff --git a/tools/virsh-completer-host.c b/tools/virsh-completer-host.c index 339390aa00..a74578d2e2 100644 --- a/tools/virsh-completer-host.c +++ b/tools/virsh-completer-host.c @@ -136,3 +136,38 @@ virshCellnoCompleter(vshControl *ctl, return g_steal_pointer(&tmp); } + + +char ** +virshCpuCompleter(vshControl *ctl, + const vshCmd *cmd G_GNUC_UNUSED, + unsigned int flags) +{ + int i, cpuid = 0, cpunum, offset = 0; + unsigned int online; + g_autofree unsigned char *cpumap = NULL; + char **ret = NULL; + VIR_AUTOSTRINGLIST tmp = NULL; + virshControlPtr priv = ctl->privData; + + virCheckFlags(0, NULL); + + if ((cpunum = virNodeGetCPUMap(priv->conn, &cpumap, &online, 0)) < 0) + return NULL; + + tmp = g_new0(char *, online + 1); + + for (i = 0; i < cpunum; i++) { + if (VIR_CPU_USED(cpumap, cpuid) == 0) { + offset += 1; + cpuid += 1; + continue; + } else { + tmp[i - offset] = g_strdup_printf("%u", cpuid++); + } + } + + ret = g_steal_pointer(&tmp); + + return ret; +} diff --git a/tools/virsh-completer-host.h b/tools/virsh-completer-host.h index 921beb7a2d..777783b908 100644 --- a/tools/virsh-completer-host.h +++ b/tools/virsh-completer-host.h @@ -29,3 +29,7 @@ char ** virshAllocpagesPagesizeCompleter(vshControl *ctl, char ** virshCellnoCompleter(vshControl *ctl, const vshCmd *cmd, unsigned int flags); + +char ** virshCpuCompleter(vshControl *ctl, + const vshCmd *cmd, + unsigned int flags); diff --git a/tools/virsh-host.c b/tools/virsh-host.c index cda2ef4ac1..4774f76ed8 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -751,6 +751,7 @@ static const vshCmdInfo info_nodecpustats[] = { static const vshCmdOptDef opts_node_cpustats[] = { {.name = "cpu", .type = VSH_OT_INT, + .completer = virshCpuCompleter, .help = N_("prints specified cpu statistics only.") }, {.name = "percent", -- 2.26.0