mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-13 00:01:55 +00:00
util: Add helpers for getting resctrl group allocs
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
f46d6e22f2
commit
f6199295a9
@ -1041,6 +1041,55 @@ virResctrlAllocParse(virResctrlInfoPtr resctrl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virResctrlAllocGetGroup(virResctrlInfoPtr resctrl,
|
||||||
|
const char *groupname,
|
||||||
|
virResctrlAllocPtr *alloc)
|
||||||
|
{
|
||||||
|
char *schemata = NULL;
|
||||||
|
int rv = virFileReadValueString(&schemata,
|
||||||
|
SYSFS_RESCTRL_PATH
|
||||||
|
"/%s/schemata",
|
||||||
|
groupname);
|
||||||
|
|
||||||
|
*alloc = NULL;
|
||||||
|
|
||||||
|
if (rv < 0)
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
*alloc = virResctrlAllocNew();
|
||||||
|
if (!*alloc)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virResctrlAllocParse(resctrl, *alloc, schemata) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
VIR_FREE(schemata);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(schemata);
|
||||||
|
virObjectUnref(*alloc);
|
||||||
|
*alloc = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virResctrlAllocPtr
|
||||||
|
virResctrlAllocGetDefault(virResctrlInfoPtr resctrl)
|
||||||
|
{
|
||||||
|
virResctrlAllocPtr ret = NULL;
|
||||||
|
int rv = virResctrlAllocGetGroup(resctrl, ".", &ret);
|
||||||
|
|
||||||
|
if (rv == -2) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Could not read schemata file for the default group"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
virResctrlAllocSubtractPerType(virResctrlAllocPerTypePtr dst,
|
virResctrlAllocSubtractPerType(virResctrlAllocPerTypePtr dst,
|
||||||
virResctrlAllocPerTypePtr src)
|
virResctrlAllocPerTypePtr src)
|
||||||
@ -1141,7 +1190,6 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
virResctrlAllocPtr alloc = NULL;
|
virResctrlAllocPtr alloc = NULL;
|
||||||
struct dirent *ent = NULL;
|
struct dirent *ent = NULL;
|
||||||
DIR *dirp = NULL;
|
DIR *dirp = NULL;
|
||||||
char *schemata = NULL;
|
|
||||||
int rv = -1;
|
int rv = -1;
|
||||||
|
|
||||||
if (virResctrlInfoIsEmpty(resctrl)) {
|
if (virResctrlInfoIsEmpty(resctrl)) {
|
||||||
@ -1154,22 +1202,12 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (virFileReadValueString(&schemata,
|
alloc = virResctrlAllocGetDefault(resctrl);
|
||||||
SYSFS_RESCTRL_PATH
|
|
||||||
"/schemata") < 0) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Could not read schemata file for the default group"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
alloc = virResctrlAllocNew();
|
|
||||||
if (!alloc)
|
if (!alloc)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (virResctrlAllocParse(resctrl, alloc, schemata) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
virResctrlAllocSubtract(ret, alloc);
|
virResctrlAllocSubtract(ret, alloc);
|
||||||
|
virObjectUnref(alloc);
|
||||||
|
|
||||||
if (virDirOpen(&dirp, SYSFS_RESCTRL_PATH) < 0)
|
if (virDirOpen(&dirp, SYSFS_RESCTRL_PATH) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
@ -1178,11 +1216,7 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
if (STREQ(ent->d_name, "info"))
|
if (STREQ(ent->d_name, "info"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
VIR_FREE(schemata);
|
rv = virResctrlAllocGetGroup(resctrl, ent->d_name, &alloc);
|
||||||
rv = virFileReadValueString(&schemata,
|
|
||||||
SYSFS_RESCTRL_PATH
|
|
||||||
"/%s/schemata",
|
|
||||||
ent->d_name);
|
|
||||||
if (rv == -2)
|
if (rv == -2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1193,15 +1227,9 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virObjectUnref(alloc);
|
|
||||||
alloc = virResctrlAllocNew();
|
|
||||||
if (!alloc)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (virResctrlAllocParse(resctrl, alloc, schemata) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
virResctrlAllocSubtract(ret, alloc);
|
virResctrlAllocSubtract(ret, alloc);
|
||||||
|
virObjectUnref(alloc);
|
||||||
|
alloc = NULL;
|
||||||
}
|
}
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto error;
|
goto error;
|
||||||
@ -1209,7 +1237,6 @@ virResctrlAllocGetUnused(virResctrlInfoPtr resctrl)
|
|||||||
cleanup:
|
cleanup:
|
||||||
virObjectUnref(alloc);
|
virObjectUnref(alloc);
|
||||||
VIR_DIR_CLOSE(dirp);
|
VIR_DIR_CLOSE(dirp);
|
||||||
VIR_FREE(schemata);
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user