[libvirt] [PATCHv7 10/18] conf: Remove virDomainResctrlAppend and introduce virDomainResctrlNew
Wang, Huaqiang
huaqiang.wang at intel.com
Mon Nov 12 12:01:18 UTC 2018
> -----Original Message-----
> From: John Ferlan [mailto:jferlan at redhat.com]
> Sent: Wednesday, November 7, 2018 12:15 AM
> To: Wang, Huaqiang <huaqiang.wang at intel.com>; libvir-list at redhat.com
> Cc: Feng, Shaohe <shaohe.feng at intel.com>; bing.niu at intel.com; Ding, Jian-
> feng <jian-feng.ding at intel.com>; Zang, Rui <rui.zang at intel.com>
> Subject: Re: [PATCHv7 10/18] conf: Remove virDomainResctrlAppend and
> introduce virDomainResctrlNew
>
>
>
> On 11/6/18 4:51 AM, Huaqiang,Wang wrote:
> >
> >
> > On 2018年11月06日 01:26, John Ferlan wrote:
> >>
> >> On 10/22/18 4:01 AM, Wang Huaqiang wrote:
> >>> Introduced virDomainResctrlNew to do the most part of
> >>> virDomainResctrlAppend and move the operation of appending resctrl
> >>> to @def->resctrls out of function.
> >>>
> >>> Rather than rely on virDomainResctrlAppend to perform the
> >>> allocation, move the onus to the caller and make use of
> >>> virBitmapNewCopy for @vcpus and virObjectRef for @alloc, thus
> >>> removing the need to set each to NULL after the call.
> >>>
> >>> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
> >>> ---
> >>> src/conf/domain_conf.c | 60
> >>> +++++++++++++++++++++++++++++---------------------
> >>> 1 file changed, 35 insertions(+), 25 deletions(-)
> >>>
> >>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index
> >>> e8e0adc..39bd396 100644
> >>> --- a/src/conf/domain_conf.c
> >>> +++ b/src/conf/domain_conf.c
> >>> @@ -18920,26 +18920,22 @@
> >>> virDomainCachetuneDefParseCache(xmlXPathContextPtr ctxt,
> >>> }
> >>> -static int
> >>> -virDomainResctrlAppend(virDomainDefPtr def,
> >>> - xmlNodePtr node,
> >>> - virResctrlAllocPtr alloc,
> >>> - virBitmapPtr vcpus,
> >>> - unsigned int flags)
> >>> +static virDomainResctrlDefPtr
> >>> +virDomainResctrlNew(xmlNodePtr node,
> >>> + virResctrlAllocPtr *alloc,
> >>> + virBitmapPtr *vcpus,
> >> Because we're not "stealing" @*alloc and/or @*vcpus, they do not need
> >> to be passed by reference. I can change these. There's some minor
> >> merge impact in later patches too, but no big deal.
> >
> > Agree. Please help make change.
> >
> >
> >>
> >>> + unsigned int flags)
> >>> {
> >>> char *vcpus_str = NULL;
> >>> char *alloc_id = NULL;
> >>> - virDomainResctrlDefPtr tmp_resctrl = NULL;
> >>> - int ret = -1;
> >>> -
> >>> - if (VIR_ALLOC(tmp_resctrl) < 0)
> >>> - goto cleanup;
> >>> + virDomainResctrlDefPtr resctrl = NULL;
> >>> + virDomainResctrlDefPtr ret = NULL;
> >>> /* We need to format it back because we need to be
> >>> consistent in the naming
> >>> * even when users specify some "sub-optimal" string there. */
> >>> - vcpus_str = virBitmapFormat(vcpus);
> >>> + vcpus_str = virBitmapFormat(*vcpus);
> >>> if (!vcpus_str)
> >>> - goto cleanup;
> >>> + return NULL;
> >>> if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE))
> >>> alloc_id = virXMLPropString(node, "id"); @@ -18954,18
> >>> +18950,23 @@ virDomainResctrlAppend(virDomainDefPtr def,
> >>> goto cleanup;
> >>> }
> >>>
> >> /* NB: Callers assume new @alloc, need to fill in ID now */
> >>
> >> Not that it would prevent someone in the future from passing an
> >> @alloc w/ ->id already filled in and overwriting, but at least for
> >> now it's not the case.
> >
> > Yes, it might happen.
> > If @alloc->id is specified through XML and is not following the naming
> > convention
> > virAsprintf(&alloc_id, "vcpus_%s", vcpus_str)
> >
> > If you think it is necessary we might need to through a warning for
> > this case.
> >
>
> Let's see - virDomainResctrlNew has two callers:
>
> 1. virDomainCachetuneDefParse
>
> In this case, we "know" we have a new/empty @alloc because if
> virDomainResctrlVcpuMatch found one, then there'd be a failure.
>
> The virDomainCachetuneDefParseCache calls don't seem to fill in
> alloc->id, but virDomainResctrlNew will for the first time.
>
> 2. virDomainMemorytuneDefParse
>
> The virDomainResctrlVcpuMatch may find a preexisting @alloc, but
> @new_alloc is set to true. The virDomainMemorytuneDefParseMemory won't
> fill alloc->id. Then only if @new_alloc do we call virDomainResctrlNew
>
> So I think both are safe "for now".
Yes. Agree. Thanks for the analysis.
> If you want I could modify the
> virResctrlAllocSetID code to :
>
> if (alloc->id) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Attempt to overwrite alloc->id='%s' with id='%s'"),
> alloc->id, id);
> return -1;
> }
>
> Let me know.
>
virResctrlMonitorSetID should also do similar patch, right?
Then the body of two functions, virRresctrlAllocSetID and virResctrlMonitorSetID,
are very similar.
I will introduce two patches, the first patch will refactor virRresctrlAllocSetID
and the second patch will reuse the refactor for virResctrlMonitorSetID.
I know you have a solution solving this, my code is just for your reference.
> John
>
>
Thanks for review.
Huaqiang
> >>
> >> With the changes (that I can make),
> >>
> >> Reviewed-by: John Ferlan <jferlan at redhat.com>
> >>
> >> John
> >
> > Thanks for review.
> > Huaqiang
> >
> >>
> >> [...]
> >
More information about the libvir-list
mailing list