From 1ec22be550eacc929a6cfb61d42ee594b9f1ce7e Mon Sep 17 00:00:00 2001 From: Shivaprasad G Bhat Date: Wed, 7 Sep 2016 14:25:42 +0530 Subject: [PATCH] virsh: use virConnectGetDomainCapabilities with maxvcpus virsh maxvcpus --type kvm output is useless on PPC. Also, in commit e6806d79 we documented not rely on virConnectGetMaxVcpus output. Fix the maxvcpus to use virConnectGetDomainCapabilities now to make it useful. The call is made to use the default emulator binary and to check for the host machine and arch which is what the command intends to show anyway. Signed-off-by: Shivaprasad G Bhat --- tools/virsh-host.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 57f0c0ec07..2337ce8e6e 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -606,18 +606,40 @@ static bool cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd) { const char *type = NULL; - int vcpus; + int vcpus = -1; + char *caps = NULL; + xmlDocPtr xml = NULL; + xmlXPathContextPtr ctxt = NULL; virshControlPtr priv = ctl->privData; + bool ret = false; if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0) return false; - if ((vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0) - return false; + if ((caps = virConnectGetDomainCapabilities(priv->conn, NULL, NULL, NULL, + type, 0))) { + if (!(xml = virXMLParseStringCtxt(caps, _("(domainCapabilities)"), &ctxt))) + goto cleanup; + + ignore_value(virXPathInt("string(./vcpu[1]/@max)", ctxt, &vcpus)); + } else { + if (last_error && last_error->code != VIR_ERR_NO_SUPPORT) + goto cleanup; + + vshResetLibvirtError(); + } + + if (vcpus < 0 && (vcpus = virConnectGetMaxVcpus(priv->conn, type)) < 0) + goto cleanup; vshPrint(ctl, "%d\n", vcpus); + ret = true; - return true; + cleanup: + xmlXPathFreeContext(ctxt); + xmlFreeDoc(xml); + VIR_FREE(caps); + return ret; } /*