mirror of https://gitee.com/openkylin/libvirt.git
util: use g_autoptr for virCgroup
Signed-off-by: Pavel Hrdina <phrdina@redhat.com> Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
parent
e4a8bbfaf2
commit
cfbd7befba
|
@ -662,28 +662,26 @@ virCgroupNew(pid_t pid,
|
||||||
int controllers,
|
int controllers,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
|
|
||||||
VIR_DEBUG("pid=%lld path=%s parent=%p controllers=%d group=%p",
|
VIR_DEBUG("pid=%lld path=%s parent=%p controllers=%d group=%p",
|
||||||
(long long) pid, path, parent, controllers, group);
|
(long long) pid, path, parent, controllers, group);
|
||||||
|
|
||||||
*group = g_new0(virCgroup, 1);
|
*group = NULL;
|
||||||
|
newGroup = g_new0(virCgroup, 1);
|
||||||
|
|
||||||
if (path[0] == '/' || !parent) {
|
if (path[0] == '/' || !parent) {
|
||||||
(*group)->path = g_strdup(path);
|
newGroup->path = g_strdup(path);
|
||||||
} else {
|
} else {
|
||||||
(*group)->path = g_strdup_printf("%s%s%s", parent->path,
|
newGroup->path = g_strdup_printf("%s%s%s", parent->path,
|
||||||
STREQ(parent->path, "") ? "" : "/", path);
|
STREQ(parent->path, "") ? "" : "/", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupDetect(*group, pid, controllers, path, parent) < 0)
|
if (virCgroupDetect(newGroup, pid, controllers, path, parent) < 0)
|
||||||
goto error;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
*group = g_steal_pointer(&newGroup);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -821,13 +819,16 @@ virCgroupNewPartition(const char *path,
|
||||||
int controllers,
|
int controllers,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
|
||||||
g_autofree char *parentPath = NULL;
|
g_autofree char *parentPath = NULL;
|
||||||
g_autofree char *newPath = NULL;
|
g_autofree char *newPath = NULL;
|
||||||
virCgroupPtr parent = NULL;
|
g_autoptr(virCgroup) parent = NULL;
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
|
|
||||||
VIR_DEBUG("path=%s create=%d controllers=%x",
|
VIR_DEBUG("path=%s create=%d controllers=%x",
|
||||||
path, create, controllers);
|
path, create, controllers);
|
||||||
|
|
||||||
|
*group = NULL;
|
||||||
|
|
||||||
if (path[0] != '/') {
|
if (path[0] != '/') {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Partition path '%s' must start with '/'"),
|
_("Partition path '%s' must start with '/'"),
|
||||||
|
@ -836,7 +837,7 @@ virCgroupNewPartition(const char *path,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupSetPartitionSuffix(path, &newPath) < 0)
|
if (virCgroupSetPartitionSuffix(path, &newPath) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
if (STRNEQ(newPath, "/")) {
|
if (STRNEQ(newPath, "/")) {
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
@ -847,25 +848,19 @@ virCgroupNewPartition(const char *path,
|
||||||
*tmp = '\0';
|
*tmp = '\0';
|
||||||
|
|
||||||
if (virCgroupNew(-1, parentPath, NULL, controllers, &parent) < 0)
|
if (virCgroupNew(-1, parentPath, NULL, controllers, &parent) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupNew(-1, newPath, parent, controllers, group) < 0)
|
if (virCgroupNew(-1, newPath, parent, controllers, &newGroup) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
if (parent) {
|
if (parent) {
|
||||||
if (virCgroupMakeGroup(parent, *group, create, VIR_CGROUP_NONE) < 0)
|
if (virCgroupMakeGroup(parent, newGroup, create, VIR_CGROUP_NONE) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
*group = g_steal_pointer(&newGroup);
|
||||||
cleanup:
|
return 0;
|
||||||
if (ret != 0) {
|
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
}
|
|
||||||
virCgroupFree(parent);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -904,13 +899,14 @@ virCgroupNewDomainPartition(virCgroupPtr partition,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
g_autofree char *grpname = NULL;
|
g_autofree char *grpname = NULL;
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
|
|
||||||
grpname = g_strdup_printf("%s.libvirt-%s", name, driver);
|
grpname = g_strdup_printf("%s.libvirt-%s", name, driver);
|
||||||
|
|
||||||
if (virCgroupPartitionEscape(&grpname) < 0)
|
if (virCgroupPartitionEscape(&grpname) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (virCgroupNew(-1, grpname, partition, -1, group) < 0)
|
if (virCgroupNew(-1, grpname, partition, -1, &newGroup) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -923,13 +919,12 @@ virCgroupNewDomainPartition(virCgroupPtr partition,
|
||||||
* a group for driver, is to avoid overhead to track
|
* a group for driver, is to avoid overhead to track
|
||||||
* cumulative usage that we don't need.
|
* cumulative usage that we don't need.
|
||||||
*/
|
*/
|
||||||
if (virCgroupMakeGroup(partition, *group, create,
|
if (virCgroupMakeGroup(partition, newGroup, create,
|
||||||
VIR_CGROUP_MEM_HIERACHY) < 0) {
|
VIR_CGROUP_MEM_HIERACHY) < 0) {
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*group = g_steal_pointer(&newGroup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -953,8 +948,11 @@ virCgroupNewThread(virCgroupPtr domain,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
g_autofree char *name = NULL;
|
g_autofree char *name = NULL;
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
int controllers;
|
int controllers;
|
||||||
|
|
||||||
|
*group = NULL;
|
||||||
|
|
||||||
switch (nameval) {
|
switch (nameval) {
|
||||||
case VIR_CGROUP_THREAD_VCPU:
|
case VIR_CGROUP_THREAD_VCPU:
|
||||||
name = g_strdup_printf("vcpu%d", id);
|
name = g_strdup_printf("vcpu%d", id);
|
||||||
|
@ -975,15 +973,13 @@ virCgroupNewThread(virCgroupPtr domain,
|
||||||
(1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
|
(1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
|
||||||
(1 << VIR_CGROUP_CONTROLLER_CPUSET));
|
(1 << VIR_CGROUP_CONTROLLER_CPUSET));
|
||||||
|
|
||||||
if (virCgroupNew(-1, name, domain, controllers, group) < 0)
|
if (virCgroupNew(-1, name, domain, controllers, &newGroup) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (virCgroupMakeGroup(domain, *group, create, VIR_CGROUP_THREAD) < 0) {
|
if (virCgroupMakeGroup(domain, newGroup, create, VIR_CGROUP_THREAD) < 0)
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
|
*group = g_steal_pointer(&newGroup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1009,26 +1005,28 @@ virCgroupNewDetectMachine(const char *name,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
|
|
||||||
if (virCgroupNewDetect(pid, controllers, group) < 0) {
|
*group = NULL;
|
||||||
|
|
||||||
|
if (virCgroupNewDetect(pid, controllers, &newGroup) < 0) {
|
||||||
if (virCgroupNewIgnoreError())
|
if (virCgroupNewIgnoreError())
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
|
for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
|
||||||
if ((*group)->backends[i] &&
|
if (newGroup->backends[i] &&
|
||||||
!(*group)->backends[i]->validateMachineGroup(*group, name,
|
!newGroup->backends[i]->validateMachineGroup(newGroup, name,
|
||||||
drivername,
|
drivername,
|
||||||
machinename)) {
|
machinename)) {
|
||||||
VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'",
|
VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'",
|
||||||
name, drivername);
|
name, drivername);
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*group = g_steal_pointer(&newGroup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1039,19 +1037,18 @@ virCgroupEnableMissingControllers(char *path,
|
||||||
int controllers,
|
int controllers,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
virCgroupPtr parent = NULL;
|
g_autoptr(virCgroup) parent = NULL;
|
||||||
char *offset = path;
|
char *offset = path;
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (virCgroupNew(pidleader,
|
if (virCgroupNew(pidleader,
|
||||||
"/",
|
"/",
|
||||||
NULL,
|
NULL,
|
||||||
controllers,
|
controllers,
|
||||||
&parent) < 0)
|
&parent) < 0)
|
||||||
return ret;
|
return -1;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
virCgroupPtr tmp;
|
g_autoptr(virCgroup) tmp = NULL;
|
||||||
char *t = strchr(offset + 1, '/');
|
char *t = strchr(offset + 1, '/');
|
||||||
if (t)
|
if (t)
|
||||||
*t = '\0';
|
*t = '\0';
|
||||||
|
@ -1061,27 +1058,23 @@ virCgroupEnableMissingControllers(char *path,
|
||||||
parent,
|
parent,
|
||||||
controllers,
|
controllers,
|
||||||
&tmp) < 0)
|
&tmp) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
|
if (virCgroupMakeGroup(parent, tmp, true, VIR_CGROUP_SYSTEMD) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (virCgroupMakeGroup(parent, tmp, true, VIR_CGROUP_SYSTEMD) < 0) {
|
|
||||||
virCgroupFree(tmp);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (t) {
|
if (t) {
|
||||||
*t = '/';
|
*t = '/';
|
||||||
offset = t;
|
offset = t;
|
||||||
virCgroupFree(parent);
|
virCgroupFree(parent);
|
||||||
parent = tmp;
|
parent = g_steal_pointer(&tmp);
|
||||||
} else {
|
} else {
|
||||||
*group = tmp;
|
*group = g_steal_pointer(&tmp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
return 0;
|
||||||
cleanup:
|
|
||||||
virCgroupFree(parent);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1103,7 +1096,8 @@ virCgroupNewMachineSystemd(const char *name,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
virCgroupPtr init;
|
g_autoptr(virCgroup) init = NULL;
|
||||||
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
g_autofree char *path = NULL;
|
g_autofree char *path = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -1135,7 +1129,6 @@ virCgroupNewMachineSystemd(const char *name,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virCgroupFree(init);
|
|
||||||
|
|
||||||
if (!path || STREQ(path, "/") || path[0] != '/') {
|
if (!path || STREQ(path, "/") || path[0] != '/') {
|
||||||
VIR_DEBUG("Systemd didn't setup its controller, path=%s",
|
VIR_DEBUG("Systemd didn't setup its controller, path=%s",
|
||||||
|
@ -1144,20 +1137,20 @@ virCgroupNewMachineSystemd(const char *name,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupEnableMissingControllers(path, pidleader,
|
if (virCgroupEnableMissingControllers(path, pidleader,
|
||||||
controllers, group) < 0) {
|
controllers, &newGroup) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupAddProcess(*group, pidleader) < 0) {
|
if (virCgroupAddProcess(newGroup, pidleader) < 0) {
|
||||||
virErrorPtr saved;
|
virErrorPtr saved;
|
||||||
|
|
||||||
virErrorPreserveLast(&saved);
|
virErrorPreserveLast(&saved);
|
||||||
virCgroupRemove(*group);
|
virCgroupRemove(newGroup);
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
virErrorRestore(&saved);
|
virErrorRestore(&saved);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*group = g_steal_pointer(&newGroup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1179,8 +1172,8 @@ virCgroupNewMachineManual(const char *name,
|
||||||
int controllers,
|
int controllers,
|
||||||
virCgroupPtr *group)
|
virCgroupPtr *group)
|
||||||
{
|
{
|
||||||
virCgroupPtr parent = NULL;
|
g_autoptr(virCgroup) parent = NULL;
|
||||||
int ret = -1;
|
g_autoptr(virCgroup) newGroup = NULL;
|
||||||
|
|
||||||
VIR_DEBUG("Fallback to non-systemd setup");
|
VIR_DEBUG("Fallback to non-systemd setup");
|
||||||
if (virCgroupNewPartition(partition,
|
if (virCgroupNewPartition(partition,
|
||||||
|
@ -1188,34 +1181,28 @@ virCgroupNewMachineManual(const char *name,
|
||||||
controllers,
|
controllers,
|
||||||
&parent) < 0) {
|
&parent) < 0) {
|
||||||
if (virCgroupNewIgnoreError())
|
if (virCgroupNewIgnoreError())
|
||||||
goto done;
|
return 0;
|
||||||
|
|
||||||
goto cleanup;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virCgroupNewDomainPartition(parent,
|
if (virCgroupNewDomainPartition(parent,
|
||||||
drivername,
|
drivername,
|
||||||
name,
|
name,
|
||||||
true,
|
true,
|
||||||
group) < 0)
|
&newGroup) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
if (virCgroupAddProcess(*group, pidleader) < 0) {
|
if (virCgroupAddProcess(newGroup, pidleader) < 0) {
|
||||||
virErrorPtr saved;
|
virErrorPtr saved;
|
||||||
|
|
||||||
virErrorPreserveLast(&saved);
|
virErrorPreserveLast(&saved);
|
||||||
virCgroupRemove(*group);
|
virCgroupRemove(newGroup);
|
||||||
virCgroupFree(*group);
|
|
||||||
*group = NULL;
|
|
||||||
virErrorRestore(&saved);
|
virErrorRestore(&saved);
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
*group = g_steal_pointer(&newGroup);
|
||||||
ret = 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virCgroupFree(parent);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2037,22 +2024,21 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
|
||||||
size_t nsum,
|
size_t nsum,
|
||||||
virBitmapPtr cpumap)
|
virBitmapPtr cpumap)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
|
||||||
ssize_t i = -1;
|
ssize_t i = -1;
|
||||||
virCgroupPtr group_vcpu = NULL;
|
|
||||||
|
|
||||||
while ((i = virBitmapNextSetBit(guestvcpus, i)) >= 0) {
|
while ((i = virBitmapNextSetBit(guestvcpus, i)) >= 0) {
|
||||||
g_autofree char *buf = NULL;
|
g_autofree char *buf = NULL;
|
||||||
|
g_autoptr(virCgroup) group_vcpu = NULL;
|
||||||
char *pos;
|
char *pos;
|
||||||
unsigned long long tmp;
|
unsigned long long tmp;
|
||||||
ssize_t j;
|
ssize_t j;
|
||||||
|
|
||||||
if (virCgroupNewThread(group, VIR_CGROUP_THREAD_VCPU, i,
|
if (virCgroupNewThread(group, VIR_CGROUP_THREAD_VCPU, i,
|
||||||
false, &group_vcpu) < 0)
|
false, &group_vcpu) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
if (virCgroupGetCpuacctPercpuUsage(group_vcpu, &buf) < 0)
|
if (virCgroupGetCpuacctPercpuUsage(group_vcpu, &buf) < 0)
|
||||||
goto cleanup;
|
return -1;
|
||||||
|
|
||||||
pos = buf;
|
pos = buf;
|
||||||
for (j = virBitmapNextSetBit(cpumap, -1);
|
for (j = virBitmapNextSetBit(cpumap, -1);
|
||||||
|
@ -2061,19 +2047,13 @@ virCgroupGetPercpuVcpuSum(virCgroupPtr group,
|
||||||
if (virStrToLong_ull(pos, &pos, 10, &tmp) < 0) {
|
if (virStrToLong_ull(pos, &pos, 10, &tmp) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("cpuacct parse error"));
|
_("cpuacct parse error"));
|
||||||
goto cleanup;
|
return -1;
|
||||||
}
|
}
|
||||||
sum_cpu_time[j] += tmp;
|
sum_cpu_time[j] += tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
virCgroupFree(group_vcpu);
|
|
||||||
group_vcpu = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
return 0;
|
||||||
cleanup:
|
|
||||||
virCgroupFree(group_vcpu);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2520,7 +2500,6 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
|
||||||
bool killedAny = false;
|
bool killedAny = false;
|
||||||
g_autofree char *keypath = NULL;
|
g_autofree char *keypath = NULL;
|
||||||
DIR *dp = NULL;
|
DIR *dp = NULL;
|
||||||
virCgroupPtr subgroup = NULL;
|
|
||||||
struct dirent *ent;
|
struct dirent *ent;
|
||||||
int direrr;
|
int direrr;
|
||||||
VIR_DEBUG("group=%p path=%s signum=%d pids=%p",
|
VIR_DEBUG("group=%p path=%s signum=%d pids=%p",
|
||||||
|
@ -2547,6 +2526,8 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((direrr = virDirRead(dp, &ent, keypath)) > 0) {
|
while ((direrr = virDirRead(dp, &ent, keypath)) > 0) {
|
||||||
|
g_autoptr(virCgroup) subgroup = NULL;
|
||||||
|
|
||||||
if (ent->d_type != DT_DIR)
|
if (ent->d_type != DT_DIR)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -2563,9 +2544,6 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
|
||||||
|
|
||||||
if (dormdir)
|
if (dormdir)
|
||||||
virCgroupRemove(subgroup);
|
virCgroupRemove(subgroup);
|
||||||
|
|
||||||
virCgroupFree(subgroup);
|
|
||||||
subgroup = NULL;
|
|
||||||
}
|
}
|
||||||
if (direrr < 0)
|
if (direrr < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -2574,7 +2552,6 @@ virCgroupKillRecursiveInternal(virCgroupPtr group,
|
||||||
ret = killedAny ? 1 : 0;
|
ret = killedAny ? 1 : 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virCgroupFree(subgroup);
|
|
||||||
VIR_DIR_CLOSE(dp);
|
VIR_DIR_CLOSE(dp);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2769,15 +2746,12 @@ virCgroupHasEmptyTasks(virCgroupPtr cgroup, int controller)
|
||||||
bool
|
bool
|
||||||
virCgroupControllerAvailable(int controller)
|
virCgroupControllerAvailable(int controller)
|
||||||
{
|
{
|
||||||
virCgroupPtr cgroup;
|
g_autoptr(virCgroup) cgroup = NULL;
|
||||||
bool ret = false;
|
|
||||||
|
|
||||||
if (virCgroupNewSelf(&cgroup) < 0)
|
if (virCgroupNewSelf(&cgroup) < 0)
|
||||||
return ret;
|
return false;
|
||||||
|
|
||||||
ret = virCgroupHasController(cgroup, controller);
|
return virCgroupHasController(cgroup, controller);
|
||||||
virCgroupFree(cgroup);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !__linux__ */
|
#else /* !__linux__ */
|
||||||
|
@ -3569,7 +3543,7 @@ virCgroupDelThread(virCgroupPtr cgroup,
|
||||||
virCgroupThreadName nameval,
|
virCgroupThreadName nameval,
|
||||||
int idx)
|
int idx)
|
||||||
{
|
{
|
||||||
virCgroupPtr new_cgroup = NULL;
|
g_autoptr(virCgroup) new_cgroup = NULL;
|
||||||
|
|
||||||
if (cgroup) {
|
if (cgroup) {
|
||||||
if (virCgroupNewThread(cgroup, nameval, idx, false, &new_cgroup) < 0)
|
if (virCgroupNewThread(cgroup, nameval, idx, false, &new_cgroup) < 0)
|
||||||
|
@ -3577,7 +3551,6 @@ virCgroupDelThread(virCgroupPtr cgroup,
|
||||||
|
|
||||||
/* Remove the offlined cgroup */
|
/* Remove the offlined cgroup */
|
||||||
virCgroupRemove(new_cgroup);
|
virCgroupRemove(new_cgroup);
|
||||||
virCgroupFree(new_cgroup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1470,21 +1470,20 @@ static virOnceControl virCgroupV1MemoryOnce = VIR_ONCE_CONTROL_INITIALIZER;
|
||||||
static void
|
static void
|
||||||
virCgroupV1MemoryOnceInit(void)
|
virCgroupV1MemoryOnceInit(void)
|
||||||
{
|
{
|
||||||
virCgroupPtr group;
|
g_autoptr(virCgroup) group = NULL;
|
||||||
unsigned long long int mem_unlimited = 0ULL;
|
unsigned long long int mem_unlimited = 0ULL;
|
||||||
|
|
||||||
if (virCgroupNew(-1, "/", NULL, -1, &group) < 0)
|
if (virCgroupNew(-1, "/", NULL, -1, &group) < 0)
|
||||||
goto cleanup;
|
return;
|
||||||
|
|
||||||
if (!virCgroupV1HasController(group, VIR_CGROUP_CONTROLLER_MEMORY))
|
if (!virCgroupV1HasController(group, VIR_CGROUP_CONTROLLER_MEMORY))
|
||||||
goto cleanup;
|
return;
|
||||||
|
|
||||||
ignore_value(virCgroupGetValueU64(group,
|
ignore_value(virCgroupGetValueU64(group,
|
||||||
VIR_CGROUP_CONTROLLER_MEMORY,
|
VIR_CGROUP_CONTROLLER_MEMORY,
|
||||||
"memory.limit_in_bytes",
|
"memory.limit_in_bytes",
|
||||||
&mem_unlimited));
|
&mem_unlimited));
|
||||||
cleanup:
|
|
||||||
virCgroupFree(group);
|
|
||||||
virCgroupV1MemoryUnlimitedKB = mem_unlimited >> 10;
|
virCgroupV1MemoryUnlimitedKB = mem_unlimited >> 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue