[libvirt] [PATCH 07/10] conf: refactor virDomainResctrlAppend
John Ferlan
jferlan at redhat.com
Wed Sep 5 15:48:44 UTC 2018
On 08/27/2018 07:23 AM, Wang Huaqiang wrote:
> Changed the interface from
> virDomainResctrlAppend(virDomainDefPtr def,
> xmlNodePtr node,
> virResctrlAllocPtr alloc,
> virBitmapPtr vcpus,
> unsigned int flags);
> to
> virDomainResctrlAppend(virDomainDefPtr def,
> xmlNodePtr node,
> virDomainResctrlDefPtr resctrl,
> unsigned int flags);
>
> Changes will let virDomainRestrlAppend pass through more information
> with virDomainResctrlDefPtr, such as monitoring groups associated
> with the allocation.
>
> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
> ---
> src/conf/domain_conf.c | 48 ++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 34 insertions(+), 14 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index bde9fef..9a65655 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -19247,17 +19247,21 @@ virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt,
> static int
> virDomainResctrlAppend(virDomainDefPtr def,
> xmlNodePtr node,
> - virResctrlAllocPtr alloc,
> - virBitmapPtr vcpus,
> + virDomainResctrlDefPtr resctrl,
> unsigned int flags)
> {
> char *vcpus_str = NULL;
> char *alloc_id = NULL;
> - virDomainResctrlDefPtr tmp_resctrl = NULL;
> + virResctrlAllocPtr alloc = NULL;
> + virBitmapPtr vcpus = NULL;
No need for locals here - just change to resctrl->{alloc|vcpus}
> +
> int ret = -1;
>
> - if (VIR_ALLOC(tmp_resctrl) < 0)
> - goto cleanup;
> + if (!resctrl)
> + return -1;
Again, here we have a programming error without an error message which
results in a generic libvirt an error occurred. Either create a specific
error message or "assume" that your caller has done the right thing.
> +
> + alloc = virObjectRef(resctrl->alloc);
Yikes, how many Ref's are we taking on this? [1]
I don't think this is necessary since we Unref later and currently both
callers do the Ref
> + vcpus = resctrl->vcpus;
>
> /* We need to format it back because we need to be consistent in the naming
> * even when users specify some "sub-optimal" string there. */
> @@ -19281,15 +19285,12 @@ virDomainResctrlAppend(virDomainDefPtr def,
> if (virResctrlAllocSetID(alloc, alloc_id) < 0)
> goto cleanup;
>
> - tmp_resctrl->vcpus = vcpus;
> - tmp_resctrl->alloc = alloc;
> -
> - if (VIR_APPEND_ELEMENT(def->resctrls, def->nresctrls, tmp_resctrl) < 0)
> + if (VIR_APPEND_ELEMENT(def->resctrls, def->nresctrls, resctrl) < 0)
> goto cleanup;
>
> ret = 0;
> cleanup:
> - virDomainResctrlDefFree(tmp_resctrl);
> + virObjectUnref(alloc);
> VIR_FREE(alloc_id);
> VIR_FREE(vcpus_str);
> return ret;
> @@ -19306,6 +19307,8 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
> xmlNodePtr *nodes = NULL;
> virBitmapPtr vcpus = NULL;
> virResctrlAllocPtr alloc = NULL;
> + virDomainResctrlDefPtr tmp_resctrl = NULL;
> +
> ssize_t i = 0;
> int n;
> int ret = -1;
> @@ -19349,15 +19352,24 @@ virDomainCachetuneDefParse(virDomainDefPtr def,
> goto cleanup;
> }
>
> - if (virDomainResctrlAppend(def, node, alloc, vcpus, flags) < 0)
> + if (VIR_ALLOC(tmp_resctrl) < 0)
> goto cleanup;
> - vcpus = NULL;
> +
> + tmp_resctrl->vcpus = vcpus;
> + tmp_resctrl->alloc = virObjectRef(alloc);
[1] Seems the called function also takes a Ref?
> +
> + if (virDomainResctrlAppend(def, node, tmp_resctrl, flags) < 0)
> + goto cleanup;
> +
> alloc = NULL;
> + vcpus = NULL;
> + tmp_resctrl = NULL;
This sequence is quite familiar with [2] ...
>
> ret = 0;
> cleanup:
> ctxt->node = oldnode;
> virObjectUnref(alloc);
> + VIR_FREE(tmp_resctrl);
> virBitmapFree(vcpus);
> VIR_FREE(nodes);
> return ret;
> @@ -19514,6 +19526,7 @@ virDomainMemorytuneDefParse(virDomainDefPtr def,
> xmlNodePtr *nodes = NULL;
> virBitmapPtr vcpus = NULL;
> virResctrlAllocPtr alloc = NULL;
> + virDomainResctrlDefPtr tmp_resctrl = NULL;
> ssize_t i = 0;
> int n;
> int ret = -1;
> @@ -19560,17 +19573,24 @@ virDomainMemorytuneDefParse(virDomainDefPtr def,
> * just update the existing alloc information, which is done in above
> * virDomainMemorytuneDefParseMemory */
> if (new_alloc) {
> - if (virDomainResctrlAppend(def, node, alloc, vcpus, flags) < 0)
> + if (VIR_ALLOC(tmp_resctrl) < 0)
> + goto cleanup;
> +
> + tmp_resctrl->alloc = virObjectRef(alloc);
[1] Seems the called function also takes a Ref?
> + tmp_resctrl->vcpus = vcpus;
> + if (virDomainResctrlAppend(def, node, tmp_resctrl, flags) < 0)
> goto cleanup;
> vcpus = NULL;
> alloc = NULL;
> + tmp_resctrl = NULL;
[2] ... this sequence
It seems to me you could create helper :
virDomainResctrlCreate(def, node, alloc, vcpus, flags)
which could :
if (VIR_ALLOC(resctrl) < 0)
return -1;
resctrl->alloc = alloc;
resctrl->vcpus = vcpus;
if (virDomainResctrlAppend(def, node, resctrl, flags) < 0) {
VIR_FREE(resctrl);
return -1;
}
virObjectRef(alloc);
return 0;
with the current callers just changing from Append to Create keeping
their alloc = NULL and vcpus = NULL on success.
John
> }
>
> ret = 0;
> cleanup:
> ctxt->node = oldnode;
> - virObjectUnref(alloc);
> virBitmapFree(vcpus);
> + virObjectUnref(alloc);
> + VIR_FREE(tmp_resctrl);
> VIR_FREE(nodes);
> return ret;
> }
>
More information about the libvir-list
mailing list