cgroup: add tracepoints for basic operations
Debugging what goes wrong with cgroup setup can get hairy. Add tracepoints for cgroup hierarchy mount, cgroup creation/destruction and task migration operations for better visibility. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
@@ -64,6 +64,9 @@
|
||||
#include <linux/file.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/cgroup.h>
|
||||
|
||||
/*
|
||||
* pidlists linger the following amount before being destroyed. The goal
|
||||
* is avoiding frequent destruction in the middle of consecutive read calls
|
||||
@@ -1176,6 +1179,8 @@ static void cgroup_destroy_root(struct cgroup_root *root)
|
||||
struct cgroup *cgrp = &root->cgrp;
|
||||
struct cgrp_cset_link *link, *tmp_link;
|
||||
|
||||
trace_cgroup_destroy_root(root);
|
||||
|
||||
cgroup_lock_and_drain_offline(&cgrp_dfl_root.cgrp);
|
||||
|
||||
BUG_ON(atomic_read(&root->nr_cgrps));
|
||||
@@ -1874,6 +1879,9 @@ static int cgroup_remount(struct kernfs_root *kf_root, int *flags, char *data)
|
||||
strcpy(root->release_agent_path, opts.release_agent);
|
||||
spin_unlock(&release_agent_path_lock);
|
||||
}
|
||||
|
||||
trace_cgroup_remount(root);
|
||||
|
||||
out_unlock:
|
||||
kfree(opts.release_agent);
|
||||
kfree(opts.name);
|
||||
@@ -2031,6 +2039,8 @@ static int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask)
|
||||
if (ret)
|
||||
goto destroy_root;
|
||||
|
||||
trace_cgroup_setup_root(root);
|
||||
|
||||
/*
|
||||
* There must be no failure case after here, since rebinding takes
|
||||
* care of subsystems' refcounts, which are explicitly dropped in
|
||||
@@ -2825,6 +2835,10 @@ static int cgroup_attach_task(struct cgroup *dst_cgrp,
|
||||
ret = cgroup_migrate(leader, threadgroup, dst_cgrp->root);
|
||||
|
||||
cgroup_migrate_finish(&preloaded_csets);
|
||||
|
||||
if (!ret)
|
||||
trace_cgroup_attach_task(dst_cgrp, leader, threadgroup);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3587,6 +3601,8 @@ static int cgroup_rename(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
||||
mutex_lock(&cgroup_mutex);
|
||||
|
||||
ret = kernfs_rename(kn, new_parent, new_name_str);
|
||||
if (!ret)
|
||||
trace_cgroup_rename(cgrp);
|
||||
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
|
||||
@@ -4355,6 +4371,8 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
|
||||
|
||||
if (task) {
|
||||
ret = cgroup_migrate(task, false, to->root);
|
||||
if (!ret)
|
||||
trace_cgroup_transfer_tasks(to, task, false);
|
||||
put_task_struct(task);
|
||||
}
|
||||
} while (task && !ret);
|
||||
@@ -5020,6 +5038,8 @@ static void css_release_work_fn(struct work_struct *work)
|
||||
ss->css_released(css);
|
||||
} else {
|
||||
/* cgroup release path */
|
||||
trace_cgroup_release(cgrp);
|
||||
|
||||
cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
|
||||
cgrp->id = -1;
|
||||
|
||||
@@ -5306,6 +5326,8 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
|
||||
if (ret)
|
||||
goto out_destroy;
|
||||
|
||||
trace_cgroup_mkdir(cgrp);
|
||||
|
||||
/* let's create and online css's */
|
||||
kernfs_activate(kn);
|
||||
|
||||
@@ -5481,6 +5503,9 @@ static int cgroup_rmdir(struct kernfs_node *kn)
|
||||
|
||||
ret = cgroup_destroy_locked(cgrp);
|
||||
|
||||
if (!ret)
|
||||
trace_cgroup_rmdir(cgrp);
|
||||
|
||||
cgroup_kn_unlock(kn);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user