--- tools/virsh-domain.c | 99 +++++++++++++++++++++------------------------------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 20a7a17..ff620b6 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -6163,8 +6163,9 @@ cmdMemtune(vshControl *ctl, const vshCmd *cmd) long long hard_limit = 0, soft_limit = 0, swap_hard_limit = 0; long long min_guarantee = 0; int nparams = 0; + int maxparams = 0; unsigned int i = 0; - virTypedParameterPtr params = NULL, temp = NULL; + virTypedParameterPtr params = NULL; bool ret = false; unsigned int flags = 0; bool current = vshCommandOptBool(cmd, "current"); @@ -6196,17 +6197,41 @@ cmdMemtune(vshControl *ctl, const vshCmd *cmd) goto cleanup; } - if (hard_limit) - nparams++; + if (hard_limit) { + if (hard_limit == -1) + hard_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_MEMORY_HARD_LIMIT, + hard_limit) < 0) + goto save_error; + } - if (soft_limit) - nparams++; + if (soft_limit) { + if (soft_limit == -1) + soft_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_MEMORY_SOFT_LIMIT, + soft_limit) < 0) + goto save_error; + } - if (swap_hard_limit) - nparams++; + if (swap_hard_limit) { + if (swap_hard_limit == -1) + swap_hard_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT, + swap_hard_limit) < 0) + goto save_error; + } - if (min_guarantee) - nparams++; + if (min_guarantee) { + if (min_guarantee == -1) + min_guarantee = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; + if (virTypedParamsAddULLong(¶ms, &nparams, &maxparams, + VIR_DOMAIN_MEMORY_MIN_GUARANTEE, + min_guarantee) < 0) + goto save_error; + } if (nparams == 0) { /* get the number of memory parameters */ @@ -6239,66 +6264,20 @@ cmdMemtune(vshControl *ctl, const vshCmd *cmd) VIR_FREE(str); } } - - ret = true; } else { - /* set the memory parameters */ - params = vshCalloc(ctl, nparams, sizeof(*params)); - - for (i = 0; i < nparams; i++) { - temp = ¶ms[i]; - - /* - * 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 (soft_limit) { - if (virTypedParameterAssign(temp, - VIR_DOMAIN_MEMORY_SOFT_LIMIT, - VIR_TYPED_PARAM_ULLONG, - soft_limit) < 0) - goto error; - soft_limit = 0; - } else if (hard_limit) { - if (virTypedParameterAssign(temp, - VIR_DOMAIN_MEMORY_HARD_LIMIT, - VIR_TYPED_PARAM_ULLONG, - hard_limit) < 0) - goto error; - hard_limit = 0; - } else if (swap_hard_limit) { - if (virTypedParameterAssign(temp, - VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT, - VIR_TYPED_PARAM_ULLONG, - swap_hard_limit) < 0) - goto error; - swap_hard_limit = 0; - } else if (min_guarantee) { - if (virTypedParameterAssign(temp, - VIR_DOMAIN_MEMORY_MIN_GUARANTEE, - VIR_TYPED_PARAM_ULLONG, - min_guarantee) < 0) - goto error; - min_guarantee = 0; - } - - /* If the user has passed -1, we interpret it as unlimited */ - if (temp->value.ul == -1) - temp->value.ul = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED; - } if (virDomainSetMemoryParameters(dom, params, nparams, flags) != 0) goto error; - else - ret = true; } + ret = true; + cleanup: - VIR_FREE(params); + virTypedParamsFree(params, nparams); virDomainFree(dom); return ret; +save_error: + vshSaveLibvirtError(); error: vshError(ctl, "%s", _("Unable to change memory parameters")); goto cleanup; -- 1.8.1.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list