mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 07:59:00 +00:00
Introduce the function virCgroupMoveTask
Introduce a new API to move tasks of one controller from a cgroup to another cgroup Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
This commit is contained in:
parent
92741ef3ee
commit
910282960f
@ -60,6 +60,7 @@ virCapabilitiesSetMacPrefix;
|
|||||||
|
|
||||||
# cgroup.h
|
# cgroup.h
|
||||||
virCgroupAddTask;
|
virCgroupAddTask;
|
||||||
|
virCgroupAddTaskController;
|
||||||
virCgroupAllowDevice;
|
virCgroupAllowDevice;
|
||||||
virCgroupAllowDeviceMajor;
|
virCgroupAllowDeviceMajor;
|
||||||
virCgroupAllowDevicePath;
|
virCgroupAllowDevicePath;
|
||||||
@ -91,6 +92,7 @@ virCgroupKill;
|
|||||||
virCgroupKillPainfully;
|
virCgroupKillPainfully;
|
||||||
virCgroupKillRecursive;
|
virCgroupKillRecursive;
|
||||||
virCgroupMounted;
|
virCgroupMounted;
|
||||||
|
virCgroupMoveTask;
|
||||||
virCgroupPathOfController;
|
virCgroupPathOfController;
|
||||||
virCgroupRemove;
|
virCgroupRemove;
|
||||||
virCgroupSetBlkioDeviceWeight;
|
virCgroupSetBlkioDeviceWeight;
|
||||||
|
@ -802,6 +802,115 @@ int virCgroupAddTask(virCgroupPtr group, pid_t pid)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virCgroupAddTaskController:
|
||||||
|
*
|
||||||
|
* @group: The cgroup to add a task to
|
||||||
|
* @pid: The pid of the task to add
|
||||||
|
* @controller: The cgroup controller to be operated on
|
||||||
|
*
|
||||||
|
* Returns: 0 on success or -errno on failure
|
||||||
|
*/
|
||||||
|
int virCgroupAddTaskController(virCgroupPtr group, pid_t pid, int controller)
|
||||||
|
{
|
||||||
|
if (controller < 0 || controller > VIR_CGROUP_CONTROLLER_LAST)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!group->controllers[controller].mountPoint)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return virCgroupSetValueU64(group, controller, "tasks",
|
||||||
|
(unsigned long long)pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int virCgroupAddTaskStrController(virCgroupPtr group,
|
||||||
|
const char *pidstr,
|
||||||
|
int controller)
|
||||||
|
{
|
||||||
|
char *str = NULL, *cur = NULL, *next = NULL;
|
||||||
|
unsigned long long p = 0;
|
||||||
|
int rc = 0;
|
||||||
|
char *endp;
|
||||||
|
|
||||||
|
if (virAsprintf(&str, "%s", pidstr) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
cur = str;
|
||||||
|
while (*cur != '\0') {
|
||||||
|
rc = virStrToLong_ull(cur, &endp, 10, &p);
|
||||||
|
if (rc != 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rc = virCgroupAddTaskController(group, p, controller);
|
||||||
|
if (rc != 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
next = strchr(cur, '\n');
|
||||||
|
if (next) {
|
||||||
|
cur = next + 1;
|
||||||
|
*next = '\0';
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(str);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virCgroupMoveTask:
|
||||||
|
*
|
||||||
|
* @src_group: The source cgroup where all tasks are removed from
|
||||||
|
* @dest_group: The destination where all tasks are added to
|
||||||
|
* @controller: The cgroup controller to be operated on
|
||||||
|
*
|
||||||
|
* Returns: 0 on success or -errno on failure
|
||||||
|
*/
|
||||||
|
int virCgroupMoveTask(virCgroupPtr src_group, virCgroupPtr dest_group,
|
||||||
|
int controller)
|
||||||
|
{
|
||||||
|
int rc = 0, err = 0;
|
||||||
|
char *content = NULL;
|
||||||
|
|
||||||
|
if (controller < VIR_CGROUP_CONTROLLER_CPU ||
|
||||||
|
controller > VIR_CGROUP_CONTROLLER_BLKIO)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!src_group->controllers[controller].mountPoint ||
|
||||||
|
!dest_group->controllers[controller].mountPoint) {
|
||||||
|
VIR_WARN("no vm cgroup in controller %d", controller);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = virCgroupGetValueStr(src_group, controller, "tasks", &content);
|
||||||
|
if (rc != 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = virCgroupAddTaskStrController(dest_group, content, controller);
|
||||||
|
if (rc != 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
VIR_FREE(content);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
/*
|
||||||
|
* We don't need to recover dest_cgroup because cgroup will make sure
|
||||||
|
* that one task only resides in one cgroup of the same controller.
|
||||||
|
*/
|
||||||
|
err = virCgroupAddTaskStrController(src_group, content, controller);
|
||||||
|
if (err != 0)
|
||||||
|
VIR_ERROR(_("Cannot recover cgroup %s from %s"),
|
||||||
|
src_group->controllers[controller].mountPoint,
|
||||||
|
dest_group->controllers[controller].mountPoint);
|
||||||
|
VIR_FREE(content);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virCgroupForDriver:
|
* virCgroupForDriver:
|
||||||
|
@ -70,6 +70,14 @@ int virCgroupPathOfController(virCgroupPtr group,
|
|||||||
|
|
||||||
int virCgroupAddTask(virCgroupPtr group, pid_t pid);
|
int virCgroupAddTask(virCgroupPtr group, pid_t pid);
|
||||||
|
|
||||||
|
int virCgroupAddTaskController(virCgroupPtr group,
|
||||||
|
pid_t pid,
|
||||||
|
int controller);
|
||||||
|
|
||||||
|
int virCgroupMoveTask(virCgroupPtr src_group,
|
||||||
|
virCgroupPtr dest_group,
|
||||||
|
int controller);
|
||||||
|
|
||||||
int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned int weight);
|
int virCgroupSetBlkioWeight(virCgroupPtr group, unsigned int weight);
|
||||||
int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight);
|
int virCgroupGetBlkioWeight(virCgroupPtr group, unsigned int *weight);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user