summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-08-24 16:19:27 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-24 16:19:27 -0400
commit596766102a3a37ba20c4d9a4130a8a4b42b34646 (patch)
tree52208e97359079e345b3d9b6750bc17d545c6c8c /kernel
parent9022ada8ab6f1f1a932a3c93815061042e6548a5 (diff)
parente4f8d81c738db6d3ffdabfb8329aa2feaa310699 (diff)
Merge branch 'for-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo: "Just one commit from Steven to take out spin lock from trace event handlers" * 'for-4.19' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: cgroup/tracing: Move taking of spin lock out of trace event handlers
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cgroup/cgroup-internal.h26
-rw-r--r--kernel/cgroup/cgroup-v1.c4
-rw-r--r--kernel/cgroup/cgroup.c12
3 files changed, 35 insertions, 7 deletions
diff --git a/kernel/cgroup/cgroup-internal.h b/kernel/cgroup/cgroup-internal.h
index 77ff1cd6a252..75568fcf2180 100644
--- a/kernel/cgroup/cgroup-internal.h
+++ b/kernel/cgroup/cgroup-internal.h
@@ -8,6 +8,32 @@
8#include <linux/list.h> 8#include <linux/list.h>
9#include <linux/refcount.h> 9#include <linux/refcount.h>
10 10
11#define TRACE_CGROUP_PATH_LEN 1024
12extern spinlock_t trace_cgroup_path_lock;
13extern char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
14
15/*
16 * cgroup_path() takes a spin lock. It is good practice not to take
17 * spin locks within trace point handlers, as they are mostly hidden
18 * from normal view. As cgroup_path() can take the kernfs_rename_lock
19 * spin lock, it is best to not call that function from the trace event
20 * handler.
21 *
22 * Note: trace_cgroup_##type##_enabled() is a static branch that will only
23 * be set when the trace event is enabled.
24 */
25#define TRACE_CGROUP_PATH(type, cgrp, ...) \
26 do { \
27 if (trace_cgroup_##type##_enabled()) { \
28 spin_lock(&trace_cgroup_path_lock); \
29 cgroup_path(cgrp, trace_cgroup_path, \
30 TRACE_CGROUP_PATH_LEN); \
31 trace_cgroup_##type(cgrp, trace_cgroup_path, \
32 ##__VA_ARGS__); \
33 spin_unlock(&trace_cgroup_path_lock); \
34 } \
35 } while (0)
36
11/* 37/*
12 * A cgroup can be associated with multiple css_sets as different tasks may 38 * A cgroup can be associated with multiple css_sets as different tasks may
13 * belong to different cgroups on different hierarchies. In the other 39 * belong to different cgroups on different hierarchies. In the other
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 8b4f0768efd6..51063e7a93c2 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -135,7 +135,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
135 if (task) { 135 if (task) {
136 ret = cgroup_migrate(task, false, &mgctx); 136 ret = cgroup_migrate(task, false, &mgctx);
137 if (!ret) 137 if (!ret)
138 trace_cgroup_transfer_tasks(to, task, false); 138 TRACE_CGROUP_PATH(transfer_tasks, to, task, false);
139 put_task_struct(task); 139 put_task_struct(task);
140 } 140 }
141 } while (task && !ret); 141 } while (task && !ret);
@@ -865,7 +865,7 @@ static int cgroup1_rename(struct kernfs_node *kn, struct kernfs_node *new_parent
865 865
866 ret = kernfs_rename(kn, new_parent, new_name_str); 866 ret = kernfs_rename(kn, new_parent, new_name_str);
867 if (!ret) 867 if (!ret)
868 trace_cgroup_rename(cgrp); 868 TRACE_CGROUP_PATH(rename, cgrp);
869 869
870 mutex_unlock(&cgroup_mutex); 870 mutex_unlock(&cgroup_mutex);
871 871
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 35cf3d71f8aa..aae10baf1902 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -83,6 +83,9 @@ EXPORT_SYMBOL_GPL(cgroup_mutex);
83EXPORT_SYMBOL_GPL(css_set_lock); 83EXPORT_SYMBOL_GPL(css_set_lock);
84#endif 84#endif
85 85
86DEFINE_SPINLOCK(trace_cgroup_path_lock);
87char trace_cgroup_path[TRACE_CGROUP_PATH_LEN];
88
86/* 89/*
87 * Protects cgroup_idr and css_idr so that IDs can be released without 90 * Protects cgroup_idr and css_idr so that IDs can be released without
88 * grabbing cgroup_mutex. 91 * grabbing cgroup_mutex.
@@ -2638,7 +2641,7 @@ int cgroup_attach_task(struct cgroup *dst_cgrp, struct task_struct *leader,
2638 cgroup_migrate_finish(&mgctx); 2641 cgroup_migrate_finish(&mgctx);
2639 2642
2640 if (!ret) 2643 if (!ret)
2641 trace_cgroup_attach_task(dst_cgrp, leader, threadgroup); 2644 TRACE_CGROUP_PATH(attach_task, dst_cgrp, leader, threadgroup);
2642 2645
2643 return ret; 2646 return ret;
2644} 2647}
@@ -4636,7 +4639,7 @@ static void css_release_work_fn(struct work_struct *work)
4636 struct cgroup *tcgrp; 4639 struct cgroup *tcgrp;
4637 4640
4638 /* cgroup release path */ 4641 /* cgroup release path */
4639 trace_cgroup_release(cgrp); 4642 TRACE_CGROUP_PATH(release, cgrp);
4640 4643
4641 if (cgroup_on_dfl(cgrp)) 4644 if (cgroup_on_dfl(cgrp))
4642 cgroup_rstat_flush(cgrp); 4645 cgroup_rstat_flush(cgrp);
@@ -4979,7 +4982,7 @@ int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, umode_t mode)
4979 if (ret) 4982 if (ret)
4980 goto out_destroy; 4983 goto out_destroy;
4981 4984
4982 trace_cgroup_mkdir(cgrp); 4985 TRACE_CGROUP_PATH(mkdir, cgrp);
4983 4986
4984 /* let's create and online css's */ 4987 /* let's create and online css's */
4985 kernfs_activate(kn); 4988 kernfs_activate(kn);
@@ -5167,9 +5170,8 @@ int cgroup_rmdir(struct kernfs_node *kn)
5167 return 0; 5170 return 0;
5168 5171
5169 ret = cgroup_destroy_locked(cgrp); 5172 ret = cgroup_destroy_locked(cgrp);
5170
5171 if (!ret) 5173 if (!ret)
5172 trace_cgroup_rmdir(cgrp); 5174 TRACE_CGROUP_PATH(rmdir, cgrp);
5173 5175
5174 cgroup_kn_unlock(kn); 5176 cgroup_kn_unlock(kn);
5175 return ret; 5177 return ret;