[libvirt] [PATCH 01/11] qemu: extract helper to get the current balloon
Francesco Romani
fromani at redhat.com
Wed Sep 3 06:41:13 UTC 2014
----- Original Message -----
> From: "Eric Blake" <eblake at redhat.com>
> To: "Francesco Romani" <fromani at redhat.com>, libvir-list at redhat.com
> Sent: Tuesday, September 2, 2014 11:01:25 PM
> Subject: Re: [libvirt] [PATCH 01/11] qemu: extract helper to get the current balloon
Hi Eric, thanks for the review(s).
> On 09/02/2014 06:31 AM, Francesco Romani wrote:
> > Refactor the code to extract an helper method
> > to get the current balloon settings.
> >
> > Signed-off-by: Francesco Romani <fromani at redhat.com>
> > ---
> > src/qemu/qemu_driver.c | 98
> > ++++++++++++++++++++++++++++++--------------------
> > 1 file changed, 60 insertions(+), 38 deletions(-)
> >
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 239a300..bbd16ed 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -168,6 +168,9 @@ static int qemuOpenFileAs(uid_t fallback_uid, gid_t
> > fallback_gid,
> > const char *path, int oflags,
> > bool *needUnlink, bool *bypassSecurityDriver);
> >
> > +static int qemuDomainGetBalloonMemory(virQEMUDriverPtr driver,
> > + virDomainObjPtr vm,
> > + unsigned long *memory);
>
> Forward declarations of non-recursive static functions is usually a sign
> that you didn't topologically sort your code correctly. Just implement
> the function here, instead of later on.
Will do.
>
> >
> > virQEMUDriverPtr qemu_driver = NULL;
> >
> > @@ -2519,6 +2522,60 @@ static int qemuDomainSendKey(virDomainPtr domain,
> > return ret;
> > }
> >
> > +static int qemuDomainGetBalloonMemory(virQEMUDriverPtr driver,
> > + virDomainObjPtr vm,
> > + unsigned long *memory)
>
> Libvirt style is tending towards two blank lines between functions,
My mistake. I did run 'make syntax-check', I wonder if that was supposed to catch
this.
> and return type on separate line (although we don't enforce either of these
> yet, due to the large existing code base that used other styles), as in:
> static int
> qemuDomainGetBalloonMemory(virQEMUDriverPtr driver, ...
I was a bit confused by the mixed styles found in the code.
Will stick with the one you pointed out in this and in future patches.
>
> > +{
> > + int ret = -1;
> > + int err = 0;
> > + qemuDomainObjPrivatePtr priv = vm->privateData;
> > +
> > + if ((vm->def->memballoon != NULL) &&
> > + (vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE))
> > {
>
> [1] Over-parenthesized. Sufficient to write:
>
> if (vm->def->memballoon &&
> vm->def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_NONE) {
Will change.
>
> > + *memory = vm->def->mem.max_balloon;
> > + } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BALLOON_EVENT)) {
> > + *memory = vm->def->mem.cur_balloon;
> > + } else if (qemuDomainJobAllowed(priv, QEMU_JOB_QUERY)) {
> > + unsigned long long balloon;
> > +
> > + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> > + goto cleanup;
> > + if (!virDomainObjIsActive(vm))
> > + err = 0;
> > + else {
>
> [2] If one leg of if-else has {}, both legs must have it. This is
> documented in HACKING (and I really ought to add a syntax check that
> forbids obvious cases of unbalanced braces).
I must have missed. Will fix.
> >
> > +
> > + cleanup:
> > + if (vm)
> > + virObjectUnlock(vm);
> > + return ret;
> > +}
>
> [3] Ouch. This function is unlocking vm, even though it did not obtain
> the lock. Which it kind of has to do because of the way that
> qemuDomainObjEndJob may end up invalidating vm. While transfer
> semantics are workable, they require good comments at the start of the
> function, and making sure that the caller doesn't duplicate the efforts,
> nor forget anything else.
Will add comment documenting this. Is this sufficient or there is something
better I could do?
>
> > @@ -2526,7 +2583,6 @@ static int qemuDomainGetInfo(virDomainPtr dom,
> > virDomainObjPtr vm;
> > int ret = -1;
> > int err;
> > - unsigned long long balloon;
> >
> > if (!(vm = qemuDomObjFromDomain(dom)))
> > goto cleanup;
> > @@ -2549,43 +2605,9 @@ static int qemuDomainGetInfo(virDomainPtr dom,
> > info->maxMem = vm->def->mem.max_balloon;
> >
> > if (virDomainObjIsActive(vm)) {
> > - qemuDomainObjPrivatePtr priv = vm->privateData;
> > -
> > - if ((vm->def->memballoon != NULL) &&
> > - (vm->def->memballoon->model ==
> > VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) {
>
> [1] Then again, your parenthesis...
>
> > - info->memory = vm->def->mem.max_balloon;
> > - } else if (virQEMUCapsGet(priv->qemuCaps,
> > QEMU_CAPS_BALLOON_EVENT)) {
> > - info->memory = vm->def->mem.cur_balloon;
> > - } else if (qemuDomainJobAllowed(priv, QEMU_JOB_QUERY)) {
> > - if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> > - goto cleanup;
> > - if (!virDomainObjIsActive(vm))
> > - err = 0;
> > - else {
>
> [2] ...and broken if-else bracing is just code motion. So I could
> overlook those (although cleaning them up at some point in the series,
> even if in a separate patch, would still be nice). But
No need to overlook. Will fix.
>
>
> > - if (!qemuDomainObjEndJob(driver, vm)) {
> > - vm = NULL;
> > - goto cleanup;
> > - }
> > -
> > - if (err < 0) {
> > - /* We couldn't get current memory allocation but that's
> > not
> > - * a show stopper; we wouldn't get it if there was a job
> > - * active either
> > - */
> > - info->memory = vm->def->mem.cur_balloon;
> > - } else if (err == 0) {
> > - /* Balloon not supported, so maxmem is always the
> > allocation */
> > - info->memory = vm->def->mem.max_balloon;
> > - } else {
> > - info->memory = balloon;
> > - }
> > - } else {
> > - info->memory = vm->def->mem.cur_balloon;
> > - }
> > + err = qemuDomainGetBalloonMemory(driver, vm, &info->memory);
> > + if (err)
> > + return err;
>
> [3] the fact that you don't use 'goto cleanup' here, but rely on the
> awkward transfer semantics, is just confusing the situation. I'd rather
> avoid transfer semantics, but understand why you used them. But I'd
> still rewrite this as:
>
> err = qemuDomainGetBalloonMemory(...);
> vm = NULL;
>
> and fall through to the cleanup label, rather than doing an early
> return, to make it obvious that the call did a transfer of vm.
Looks better to me. Will change in this direction.
Thanks,
--
Francesco Romani
RedHat Engineering Virtualization R & D
Phone: 8261328
IRC: fromani
More information about the libvir-list
mailing list