[libvirt] [PATCH 10/10] add new command numatune to virsh

Hu Tao hutao at cn.fujitsu.com
Thu Nov 3 11:55:25 UTC 2011


add new command numatune to virsh to get/set numa parameters
---
 tools/virsh.c |  187 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 187 insertions(+), 0 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 5544a41..e2c3cc2 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -4974,6 +4974,192 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd)
 }
 
 /*
+ * "numatune" command
+ */
+static const vshCmdInfo info_numatune[] = {
+    {"help", N_("Get or set numa parameters")},
+    {"desc", N_("Get or set the current numa parameters for a guest" \
+                " domain.\n" \
+                "    To get the numa parameters use following command: \n\n" \
+                "    virsh # numatune <domain>")},
+    {NULL, NULL}
+
+};
+
+static const vshCmdOptDef opts_numatune[] = {
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
+    {"nodeset", VSH_OT_DATA, VSH_OFLAG_NONE,
+     N_("NUMA node to set")},
+    {"strict", VSH_OT_INT, VSH_OFLAG_NONE,
+     N_("whether memory allocation should be restricted to the memory nodes ")},
+    {"exclusive", VSH_OT_INT, VSH_OFLAG_NONE,
+     N_("XXX")},
+    {"config", VSH_OT_BOOL, 0, N_("affect next boot")},
+    {"live", VSH_OT_BOOL, 0, N_("affect running domain")},
+    {"current", VSH_OT_BOOL, 0, N_("affect current domain")},
+    {NULL, 0, 0, NULL}
+};
+
+static bool
+cmdNumatune(vshControl * ctl, const vshCmd * cmd)
+{
+    virDomainPtr dom;
+    int rc = -1;
+    int nparams = 0;
+    unsigned int i = 0;
+    virTypedParameterPtr params = NULL, temp = NULL;
+    const char *nodeset = NULL;
+    unsigned long strict = 0;
+    unsigned long exclusive = 0;
+    bool strictParam = false;
+    bool exclusiveParam = false;
+    bool ret = false;
+    unsigned int flags = 0;
+    int current = vshCommandOptBool(cmd, "current");
+    int config = vshCommandOptBool(cmd, "config");
+    int live = vshCommandOptBool(cmd, "live");
+
+    if (current) {
+        if (live || config) {
+            vshError(ctl, "%s", _("--current must be specified exclusively"));
+            return false;
+        }
+        flags = VIR_DOMAIN_AFFECT_CURRENT;
+    } else {
+        if (config)
+            flags |= VIR_DOMAIN_AFFECT_CONFIG;
+        if (live)
+            flags |= VIR_DOMAIN_AFFECT_LIVE;
+    }
+
+    if (!vshConnectionUsability(ctl, ctl->conn))
+        return false;
+
+    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+        return false;
+
+    if (vshCommandOptString(cmd, "nodeset", &nodeset) < 0) {
+        vshError(ctl, "%s", _("Unable to parse nodeset."));
+        virDomainFree(dom);
+        return false;
+    }
+    rc = vshCommandOptUL(cmd, "strict", &strict);
+    if (rc > 0) {
+        nparams++;
+        strictParam = true;
+    } else if (rc < 0) {
+        vshError(ctl, "%s", _("Unable to parse parameter --strict."));
+        virDomainFree(dom);
+        return false;
+    }
+
+    rc = vshCommandOptUL(cmd, "exclusive", &exclusive);
+    if (rc > 0) {
+        nparams++;
+        exclusiveParam = true;
+    } else if (rc < 0) {
+        vshError(ctl, "%s", _("Unable to parse parameter --exclusive."));
+        virDomainFree(dom);
+        return false;
+    }
+
+    if (!nodeset) {
+        /* get nodeset information */
+    }
+
+    if (nparams == 0) {
+        /* get the number of numa parameters */
+        if (virDomainGetNumaParameters(dom, NULL, &nparams, flags) != 0) {
+            vshError(ctl, "%s",
+                     _("Unable to get number of memory parameters"));
+            goto cleanup;
+        }
+
+        if (nparams == 0) {
+            /* nothing to output */
+            ret = true;
+            goto cleanup;
+        }
+
+        /* now go get all the numa parameters */
+        params = vshCalloc(ctl, nparams, sizeof(*params));
+        if (virDomainGetNumaParameters(dom, params, &nparams, flags) != 0) {
+            vshError(ctl, "%s", _("Unable to get numa parameters"));
+            goto cleanup;
+        }
+
+        for (i = 0; i < nparams; i++) {
+            switch (params[i].type) {
+                case VIR_TYPED_PARAM_INT:
+                    vshPrint(ctl, "%-15s: %d\n", params[i].field,
+                             params[i].value.i);
+                    break;
+                case VIR_TYPED_PARAM_UINT:
+                    vshPrint(ctl, "%-15s: %u\n", params[i].field,
+                             params[i].value.ui);
+                    break;
+                case VIR_TYPED_PARAM_LLONG:
+                    vshPrint(ctl, "%-15s: %lld\n", params[i].field,
+                             params[i].value.l);
+                    break;
+                case VIR_TYPED_PARAM_ULLONG:
+                    vshPrint(ctl, "%-15s: %llu\n", params[i].field,
+                             params[i].value.ul);
+                    break;
+                case VIR_TYPED_PARAM_DOUBLE:
+                    vshPrint(ctl, "%-15s: %f\n", params[i].field,
+                             params[i].value.d);
+                    break;
+                case VIR_TYPED_PARAM_BOOLEAN:
+                    vshPrint(ctl, "%-15s: %d\n", params[i].field,
+                             params[i].value.b);
+                    break;
+                default:
+                    vshPrint(ctl, "unimplemented numa parameter type\n");
+            }
+        }
+
+        ret = true;
+    } else {
+        /* set the numa parameters */
+        params = vshCalloc(ctl, nparams, sizeof(*params));
+
+        for (i = 0; i < nparams; i++) {
+            temp = &params[i];
+            temp->type = VIR_TYPED_PARAM_ULLONG;
+
+            /*
+             * Some magic here, this is used to fill the params structure with
+             * the valid arguments passed, after filling the particular
+             * argument we purposely make them 0, so on the next pass it goes
+             * to the next valid argument and so on.
+             */
+            if (strictParam) {
+                temp->value.i = strict;
+                strncpy(temp->field, VIR_DOMAIN_NUMA_STRICT,
+                        sizeof(temp->field));
+                strictParam = false;
+            }
+            if (exclusiveParam) {
+                temp->value.i = exclusive;
+                strncpy(temp->field, VIR_DOMAIN_NUMA_EXCLUSIVE,
+                        sizeof(temp->field));
+                exclusiveParam = false;
+            }
+        }
+        if (virDomainSetNumaParameters(dom, params, nparams, flags) != 0)
+            vshError(ctl, "%s", _("Unable to change numa parameters"));
+        else
+            ret = true;
+    }
+
+  cleanup:
+    VIR_FREE(params);
+    virDomainFree(dom);
+    return ret;
+}
+
+/*
  * "nodeinfo" command
  */
 static const vshCmdInfo info_nodeinfo[] = {
@@ -14050,6 +14236,7 @@ static const vshCmdDef domManagementCmds[] = {
      info_managedsaveremove, 0},
     {"maxvcpus", cmdMaxvcpus, opts_maxvcpus, info_maxvcpus, 0},
     {"memtune", cmdMemtune, opts_memtune, info_memtune, 0},
+    {"numatune", cmdNumatune, opts_numatune, info_numatune, 0},
     {"migrate", cmdMigrate, opts_migrate, info_migrate, 0},
     {"migrate-setmaxdowntime", cmdMigrateSetMaxDowntime,
      opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime, 0},
-- 
1.7.3.1




More information about the libvir-list mailing list