[libvirt] [PATCH 16/21] resctrl: Add functions to work with resctrl allocations

John Ferlan jferlan at redhat.com
Wed Nov 15 18:17:56 UTC 2017


[...]

>>
>> Two blank lines (multiple instances in new functions)
>>
> 
> I tried keeping this one more organized, two lines between groups of
> functions, one line between functions in the same group.  But I can do
> two everywhere, the fact that I don't fully agree is irrelevant
> (unfortunately), but I'd rather get this in instead of arguing over
> the amount of whitespace =D
> 

I guess I'm just going by other reviews I've done and received where the
2 lines was requested for anything "new"...  Not everyone follows it and
I'm sure I've missed a few along the way.

>>> +static int virResctrlAllocOnceInit(void)
>>
>> static int
>> virResctrlAllocOnceInit(void)
>>
> 
> Oh, missed this one.
> 
>>> +{
>>> +    if (!(virResctrlAllocClass = virClassNew(virClassForObject(),
>>> +                                             "virResctrlAlloc",
>>> +                                             sizeof(virResctrlAlloc),
>>> +                                             virResctrlAllocDispose)))
>>> +        return -1;
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +VIR_ONCE_GLOBAL_INIT(virResctrlAlloc)
>>> +
>>> +static virResctrlAllocPtr
>>> +virResctrlAllocNew(void)
>>> +{
>>> +    if (virResctrlAllocInitialize() < 0)
>>> +        return NULL;
>>> +
>>> +    return virObjectNew(virResctrlAllocClass);
>>> +}
>>> +
>>> +
>>> +/* Common functions */
>>> +static int
>>> +virResctrlLockInternal(int op)
>>> +{
>>> +    int fd = open(SYSFS_RESCTRL_PATH, O_DIRECTORY | O_CLOEXEC);
>>> +
>>> +    if (fd < 0) {
>>> +        virReportSystemError(errno, "%s", _("Cannot open resctrlfs"));
>>> +        return -1;
>>> +    }
>>> +
>>> +    if (flock(fd, op) < 0) {
>>
>> So only ever used on a local file system right?  Linux file locking
>> functions are confounding...
>>
> 
> Yes, only local filesystem.
> 
>> Why not use virFile{Lock|Unlock}?
>>
> 
> Because that uses fcnlt(2) which is different lock which might not
> interactl with flock(2), so all programs working with resctrlfs must use
> the same type of lock.  And resctrlfs should specifically use flock(2)
> according to the docs:
> 
>  https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/x86/intel_rdt_ui.txt
> 


[...]

> 
>>> +    if (fd == -1)
>>> +        return 0;
>>> +
>>> +    /* The lock gets unlocked by closing the fd, which we need to do
>>> anyway in
>>> +     * order to clean up properly */
>>> +    if (VIR_CLOSE(fd) < 0) {
>>> +        virReportSystemError(errno, "%s", _("Cannot close resctrlfs"));
>>> +
>>> +        /* Trying to save the already broken */
>>
>> So if close unlocks too, then why the unlock?
>>
> 
> Only if the close failed, I figured we might as well try to safe the
> already broken, right?  I can remove it if you want.
> 

oh right - no, it's fine here. "Eye" think I missed the on failure part!

>>> +        if (flock(fd, LOCK_UN) < 0)
>>> +            virReportSystemError(errno, "%s", _("Cannot unlock
>>> resctrlfs"));
>>> +        return -1;
>>> +    }
>>> +
>>> +    return ret;
>>> +}
>>> +
>>> +

[...]

>>> +/* This checks if the directory for the alloc exists.  If not it
>>> tries to create
>>> + * it and apply appropriate alloc settings. */
>>> +int
>>> +virResctrlAllocCreate(virResctrlInfoPtr r_info,
>>> +                      virResctrlAllocPtr alloc,
>>> +                      const char *drivername,
>>> +                      const char *machinename)
>>> +{
>>> +    char *alloc_path = NULL;
>>> +    char *schemata_path = NULL;
>>> +    bool dir_created = false;
>>> +    char *alloc_str = NULL;
>>> +    int ret = -1;
>>> +    int lockfd = -1;
>>> +
>>> +    if (!alloc)
>>> +        return 0;
>>> +
>>> +    if (!alloc->path &&
>>> +        virAsprintf(&alloc->path, "%s/%s-%s-%s",
>>> +                    SYSFS_RESCTRL_PATH, drivername, machinename,
>>> alloc->id) < 0)
>>
>> This is being created in /sys/fs... and theoretically nothing will
>> change for @drivername and @machinename
>>
>>> +        return -1;
>>> +
>>> +    /* Check if this allocation was already created */
>>> +    if (virFileIsDir(alloc->path)) {
>>> +        VIR_FREE(alloc_path);
>>
>> dead code ;-)   "alloc_path" is never allocated...
>>
> 
> s/alloc_path/alloc->path/ =)
> 
>> Any concern over the guest being killed without running through
>> virResctrlAllocRemove and the rmdir?
>>
> 
> Yes, where do you see that?  The remove will be done in
> qemuProcessStop().  I can remove this one puny directory here, but
> proper cleanup needs to be done for all anyway.
> 

No where in particular - there's so much code to wade through and
attempt to remember. I do see the call for Stop - just trying to think
if there was some other way for guest death that could cause problems.

The only other thought I had along the lines here was writing into
/sys/fs - not just the privilege but the size/number of files being
created in /sys, but perhaps other things distracted those (beer?)
thoughts...   I was going to ask if output such as this should be
something like ->libDir which could be deleted "for free"...

If not should the rmdir(alloc->path) be a virDeleteTree(alloc->path)
since you're creating "schemata" and "tasks"

John

[...]




More information about the libvir-list mailing list