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:
Pavel Hrdina 2020-10-09 16:09:46 +02:00
parent e4a8bbfaf2
commit cfbd7befba
2 changed files with 81 additions and 109 deletions

View File

@ -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;

View File

@ -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;
} }