mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
vircgroup: extract virCgroupV1AddTask
Reviewed-by: Fabiano Fidêncio <fidencio@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
b148d08049
commit
064024e70a
@ -540,7 +540,7 @@ virCgroupSetValueU64(virCgroupPtr group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
int
|
||||||
virCgroupSetValueI64(virCgroupPtr group,
|
virCgroupSetValueI64(virCgroupPtr group,
|
||||||
int controller,
|
int controller,
|
||||||
const char *key,
|
const char *key,
|
||||||
@ -668,50 +668,6 @@ virCgroupNew(pid_t pid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
/* Adds a whole process with all threads to specific cgroup except
|
|
||||||
* to systemd named controller. */
|
|
||||||
VIR_CGROUP_TASK_PROCESS = 1 << 0,
|
|
||||||
|
|
||||||
/* Same as VIR_CGROUP_TASK_PROCESS but it also adds the task to systemd
|
|
||||||
* named controller. */
|
|
||||||
VIR_CGROUP_TASK_SYSTEMD = 1 << 1,
|
|
||||||
|
|
||||||
/* Moves only specific thread into cgroup except to systemd
|
|
||||||
* named controller. */
|
|
||||||
VIR_CGROUP_TASK_THREAD = 1 << 2,
|
|
||||||
} virCgroupTaskFlags;
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
virCgroupAddTaskInternal(virCgroupPtr group,
|
|
||||||
pid_t pid,
|
|
||||||
unsigned int flags)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
|
|
||||||
/* Skip over controllers not mounted */
|
|
||||||
if (!group->controllers[i].mountPoint)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* We must never add tasks in systemd's hierarchy
|
|
||||||
* unless we're intentionally trying to move a
|
|
||||||
* task into a systemd machine scope */
|
|
||||||
if (i == VIR_CGROUP_CONTROLLER_SYSTEMD &&
|
|
||||||
!(flags & VIR_CGROUP_TASK_SYSTEMD))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (virCgroupSetValueI64(group, i, "tasks", pid) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virCgroupAddProcess:
|
* virCgroupAddProcess:
|
||||||
*
|
*
|
||||||
@ -726,7 +682,7 @@ virCgroupAddTaskInternal(virCgroupPtr group,
|
|||||||
int
|
int
|
||||||
virCgroupAddProcess(virCgroupPtr group, pid_t pid)
|
virCgroupAddProcess(virCgroupPtr group, pid_t pid)
|
||||||
{
|
{
|
||||||
return virCgroupAddTaskInternal(group, pid, VIR_CGROUP_TASK_PROCESS);
|
return group->backend->addTask(group, pid, VIR_CGROUP_TASK_PROCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -743,9 +699,9 @@ virCgroupAddProcess(virCgroupPtr group, pid_t pid)
|
|||||||
int
|
int
|
||||||
virCgroupAddMachineProcess(virCgroupPtr group, pid_t pid)
|
virCgroupAddMachineProcess(virCgroupPtr group, pid_t pid)
|
||||||
{
|
{
|
||||||
return virCgroupAddTaskInternal(group, pid,
|
return group->backend->addTask(group, pid,
|
||||||
VIR_CGROUP_TASK_PROCESS |
|
VIR_CGROUP_TASK_PROCESS |
|
||||||
VIR_CGROUP_TASK_SYSTEMD);
|
VIR_CGROUP_TASK_SYSTEMD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -763,7 +719,7 @@ int
|
|||||||
virCgroupAddThread(virCgroupPtr group,
|
virCgroupAddThread(virCgroupPtr group,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
return virCgroupAddTaskInternal(group, pid, VIR_CGROUP_TASK_THREAD);
|
return group->backend->addTask(group, pid, VIR_CGROUP_TASK_THREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,6 +35,20 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
} virCgroupBackendFlags;
|
} virCgroupBackendFlags;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* Adds a whole process with all threads to specific cgroup except
|
||||||
|
* to systemd named controller. */
|
||||||
|
VIR_CGROUP_TASK_PROCESS = 1 << 0,
|
||||||
|
|
||||||
|
/* Same as VIR_CGROUP_TASK_PROCESS but it also adds the task to systemd
|
||||||
|
* named controller. */
|
||||||
|
VIR_CGROUP_TASK_SYSTEMD = 1 << 1,
|
||||||
|
|
||||||
|
/* Moves only specific thread into cgroup except to systemd
|
||||||
|
* named controller. */
|
||||||
|
VIR_CGROUP_TASK_THREAD = 1 << 2,
|
||||||
|
} virCgroupBackendTaskFlags;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
VIR_CGROUP_BACKEND_TYPE_V1 = 0,
|
VIR_CGROUP_BACKEND_TYPE_V1 = 0,
|
||||||
VIR_CGROUP_BACKEND_TYPE_LAST,
|
VIR_CGROUP_BACKEND_TYPE_LAST,
|
||||||
@ -103,6 +117,11 @@ typedef int
|
|||||||
typedef int
|
typedef int
|
||||||
(*virCgroupRemoveCB)(virCgroupPtr group);
|
(*virCgroupRemoveCB)(virCgroupPtr group);
|
||||||
|
|
||||||
|
typedef int
|
||||||
|
(*virCgroupAddTaskCB)(virCgroupPtr group,
|
||||||
|
pid_t pid,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
struct _virCgroupBackend {
|
struct _virCgroupBackend {
|
||||||
virCgroupBackendType type;
|
virCgroupBackendType type;
|
||||||
|
|
||||||
@ -121,6 +140,7 @@ struct _virCgroupBackend {
|
|||||||
virCgroupPathOfControllerCB pathOfController;
|
virCgroupPathOfControllerCB pathOfController;
|
||||||
virCgroupMakeGroupCB makeGroup;
|
virCgroupMakeGroupCB makeGroup;
|
||||||
virCgroupRemoveCB remove;
|
virCgroupRemoveCB remove;
|
||||||
|
virCgroupAddTaskCB addTask;
|
||||||
};
|
};
|
||||||
typedef struct _virCgroupBackend virCgroupBackend;
|
typedef struct _virCgroupBackend virCgroupBackend;
|
||||||
typedef virCgroupBackend *virCgroupBackendPtr;
|
typedef virCgroupBackend *virCgroupBackendPtr;
|
||||||
|
@ -73,6 +73,11 @@ int virCgroupGetValueU64(virCgroupPtr group,
|
|||||||
const char *key,
|
const char *key,
|
||||||
unsigned long long int *value);
|
unsigned long long int *value);
|
||||||
|
|
||||||
|
int virCgroupSetValueI64(virCgroupPtr group,
|
||||||
|
int controller,
|
||||||
|
const char *key,
|
||||||
|
long long int value);
|
||||||
|
|
||||||
int virCgroupPartitionEscape(char **path);
|
int virCgroupPartitionEscape(char **path);
|
||||||
|
|
||||||
int virCgroupNewPartition(const char *path,
|
int virCgroupNewPartition(const char *path,
|
||||||
|
@ -705,6 +705,36 @@ virCgroupV1Remove(virCgroupPtr group)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virCgroupV1AddTask(virCgroupPtr group,
|
||||||
|
pid_t pid,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
|
||||||
|
/* Skip over controllers not mounted */
|
||||||
|
if (!group->controllers[i].mountPoint)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* We must never add tasks in systemd's hierarchy
|
||||||
|
* unless we're intentionally trying to move a
|
||||||
|
* task into a systemd machine scope */
|
||||||
|
if (i == VIR_CGROUP_CONTROLLER_SYSTEMD &&
|
||||||
|
!(flags & VIR_CGROUP_TASK_SYSTEMD))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (virCgroupSetValueI64(group, i, "tasks", pid) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virCgroupBackend virCgroupV1Backend = {
|
virCgroupBackend virCgroupV1Backend = {
|
||||||
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
||||||
|
|
||||||
@ -722,6 +752,7 @@ virCgroupBackend virCgroupV1Backend = {
|
|||||||
.pathOfController = virCgroupV1PathOfController,
|
.pathOfController = virCgroupV1PathOfController,
|
||||||
.makeGroup = virCgroupV1MakeGroup,
|
.makeGroup = virCgroupV1MakeGroup,
|
||||||
.remove = virCgroupV1Remove,
|
.remove = virCgroupV1Remove,
|
||||||
|
.addTask = virCgroupV1AddTask,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user