[libvirt] [PATCHv5 08/19] util: Add interface for creating monitor group
Wang, Huaqiang
huaqiang.wang at intel.com
Thu Oct 11 08:48:15 UTC 2018
On 10/11/2018 3:13 AM, John Ferlan wrote:
>
> On 10/9/18 6:30 AM, Wang Huaqiang wrote:
>> Add interface for creating the resource monitoring group according
>> to '@virResctrlMonitor->path'.
>>
>> Signed-off-by: Wang Huaqiang <huaqiang.wang at intel.com>
>> ---
>> src/libvirt_private.syms | 1 +
>> src/util/virresctrl.c | 28 ++++++++++++++++++++++++++++
>> src/util/virresctrl.h | 6 ++++++
>> 3 files changed, 35 insertions(+)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index e175c8b..a878083 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -2681,6 +2681,7 @@ virResctrlInfoGetMonitorPrefix;
>> virResctrlInfoMonFree;
>> virResctrlInfoNew;
>> virResctrlMonitorAddPID;
>> +virResctrlMonitorCreate;
>> virResctrlMonitorDeterminePath;
>> virResctrlMonitorNew;
>>
>> diff --git a/src/util/virresctrl.c b/src/util/virresctrl.c
>> index 8b617a6..b3d20cc 100644
>> --- a/src/util/virresctrl.c
>> +++ b/src/util/virresctrl.c
>> @@ -2475,6 +2475,7 @@ virResctrlMonitorAddPID(virResctrlMonitorPtr monitor,
>> return virResctrlAddPID(monitor->path, pid);
>> }
>>
>> +
> This should have been squashed into patch6
OK. Two lines between each function.
>
>> int
>> virResctrlMonitorDeterminePath(virResctrlMonitorPtr monitor,
>> const char *machinename)
>> @@ -2506,3 +2507,30 @@ virResctrlMonitorDeterminePath(virResctrlMonitorPtr monitor,
>>
>> return 0;
>> }
>> +
>> +
>> +int
>> +virResctrlMonitorCreate(virResctrlAllocPtr alloc,
>> + virResctrlMonitorPtr monitor,
>> + const char *machinename)
>> +{
>> + int lockfd = -1;
>> + int ret = -1;
>> +
>> + if (!monitor)
>> + return 0;
>> +
>> + monitor->alloc = virObjectRef(alloc);
> Can @alloc be NULL here? I see that the eventual caller from
> qemuProcessResctrlCreate would pass vm->def->resctrls[i]->alloc after a
> virResctrlAllocCreate, but that API can return 0 immediately "if
> (!alloc)"?
@alloc could be NULL.
In virResctrlAllocCreate, if the passed in @alloc is NULL, the virResctrlAllocCreate
function will return 0, this is not considered as an error.
Following the code invoking virResctrlMonitorCreate, if @vm->def->resctrls[i]->alloc
is NULL, then the virResctrlAllocCreate function will return 0, this is not an error,
code going on, then virResctrlMonitorCreate will be invoked if @nmonitors is not 0,
in this case, the first argument,the @alloc, of virResctrlMonitorCreate is NULL.
2613 for (i = 0; i < vm->def->nresctrls; i++) {
2614 size_t j = 0;
2615 if (virResctrlAllocCreate(caps->host.resctrl,
2616 vm->def->resctrls[i]->alloc,
2617 priv->machineName) < 0)
2618 goto cleanup;
2619
2620 for (j = 0; j < vm->def->resctrls[i]->nmonitors; j++) {
2621 virDomainResctrlMonDefPtr mon = NULL;
2622
2623 mon = vm->def->resctrls[i]->monitors[j];
2624 if (virResctrlMonitorCreate(vm->def->resctrls[i]->alloc,
2625 mon->instance,
2626 priv->machineName) < 0)
2627 goto cleanup;
2628
2629 }
2630 }
>
>
> Furthermore, if we Ref it here, but return -1 in the subsequent steps
> are we sure that the Unref gets done.
If in later steps error happens and returns a -1, then it will go through the resource
releasing functions by calling virResctrlMonitorDispose and virResctrlAllocDispose.
The unref of @monitor->alloc is done in virResctrlMonitorDispose (function
introduced in patch2):
401 static void
402 virResctrlMonitorDispose(void *obj)
403 {
404 virResctrlMonitorPtr monitor = obj;
405
406 virObjectUnref(monitor->alloc);
407 VIR_FREE(monitor->id);
408 VIR_FREE(monitor->path);
409 }
>
> The one "thing" about the order of patches here is that it forces me to
> look forward to ensure decisions made in previous patches will be
> handled in the future.
Maybe combine virResctrlMonitorDispose and virResctrlMonitorCreate in one
patch? Will that make you look better for understanding how @monitor->alloc
is used.
>
>
>> +
>> + if (virResctrlMonitorDeterminePath(monitor, machinename) < 0)
>> + return -1;
> At least for now virResctrlMonitorDeterminePath can handle a NULL
> monitor->alloc...
>
> John
Thanks for review.
Huaqiang
>
>
>> +
>> + lockfd = virResctrlLockWrite();
>> + if (lockfd < 0)
>> + return -1;
>> +
>> + ret = virResctrlCreateGroupPath(monitor->path);
>> +
>> + virResctrlUnlock(lockfd);
>> + return ret;
>> +}
>> diff --git a/src/util/virresctrl.h b/src/util/virresctrl.h
>> index 69b6b1d..1efe394 100644
>> --- a/src/util/virresctrl.h
>> +++ b/src/util/virresctrl.h
>> @@ -196,7 +196,13 @@ virResctrlMonitorNew(void);
>> int
>> virResctrlMonitorAddPID(virResctrlMonitorPtr monitor,
>> pid_t pid);
>> +
>> int
>> virResctrlMonitorDeterminePath(virResctrlMonitorPtr monitor,
>> const char *machinename);
>> +
>> +int
>> +virResctrlMonitorCreate(virResctrlAllocPtr alloc,
>> + virResctrlMonitorPtr monitor,
>> + const char *machinename);
>> #endif /* __VIR_RESCTRL_H__ */
>>
More information about the libvir-list
mailing list