diff options
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r-- | kernel/events/core.c | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 661951ab8ae7..f83a71a3e46d 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -361,7 +361,7 @@ struct perf_cgroup { | |||
361 | static inline struct perf_cgroup * | 361 | static inline struct perf_cgroup * |
362 | perf_cgroup_from_task(struct task_struct *task) | 362 | perf_cgroup_from_task(struct task_struct *task) |
363 | { | 363 | { |
364 | return container_of(task_css(task, perf_subsys_id), | 364 | return container_of(task_css(task, perf_event_cgrp_id), |
365 | struct perf_cgroup, css); | 365 | struct perf_cgroup, css); |
366 | } | 366 | } |
367 | 367 | ||
@@ -389,11 +389,6 @@ perf_cgroup_match(struct perf_event *event) | |||
389 | event->cgrp->css.cgroup); | 389 | event->cgrp->css.cgroup); |
390 | } | 390 | } |
391 | 391 | ||
392 | static inline bool perf_tryget_cgroup(struct perf_event *event) | ||
393 | { | ||
394 | return css_tryget(&event->cgrp->css); | ||
395 | } | ||
396 | |||
397 | static inline void perf_put_cgroup(struct perf_event *event) | 392 | static inline void perf_put_cgroup(struct perf_event *event) |
398 | { | 393 | { |
399 | css_put(&event->cgrp->css); | 394 | css_put(&event->cgrp->css); |
@@ -612,9 +607,7 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event, | |||
612 | if (!f.file) | 607 | if (!f.file) |
613 | return -EBADF; | 608 | return -EBADF; |
614 | 609 | ||
615 | rcu_read_lock(); | 610 | css = css_tryget_from_dir(f.file->f_dentry, &perf_event_cgrp_subsys); |
616 | |||
617 | css = css_from_dir(f.file->f_dentry, &perf_subsys); | ||
618 | if (IS_ERR(css)) { | 611 | if (IS_ERR(css)) { |
619 | ret = PTR_ERR(css); | 612 | ret = PTR_ERR(css); |
620 | goto out; | 613 | goto out; |
@@ -623,13 +616,6 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event, | |||
623 | cgrp = container_of(css, struct perf_cgroup, css); | 616 | cgrp = container_of(css, struct perf_cgroup, css); |
624 | event->cgrp = cgrp; | 617 | event->cgrp = cgrp; |
625 | 618 | ||
626 | /* must be done before we fput() the file */ | ||
627 | if (!perf_tryget_cgroup(event)) { | ||
628 | event->cgrp = NULL; | ||
629 | ret = -ENOENT; | ||
630 | goto out; | ||
631 | } | ||
632 | |||
633 | /* | 619 | /* |
634 | * all events in a group must monitor | 620 | * all events in a group must monitor |
635 | * the same cgroup because a task belongs | 621 | * the same cgroup because a task belongs |
@@ -640,7 +626,6 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event, | |||
640 | ret = -EINVAL; | 626 | ret = -EINVAL; |
641 | } | 627 | } |
642 | out: | 628 | out: |
643 | rcu_read_unlock(); | ||
644 | fdput(f); | 629 | fdput(f); |
645 | return ret; | 630 | return ret; |
646 | } | 631 | } |
@@ -8053,7 +8038,7 @@ static void perf_cgroup_attach(struct cgroup_subsys_state *css, | |||
8053 | { | 8038 | { |
8054 | struct task_struct *task; | 8039 | struct task_struct *task; |
8055 | 8040 | ||
8056 | cgroup_taskset_for_each(task, css, tset) | 8041 | cgroup_taskset_for_each(task, tset) |
8057 | task_function_call(task, __perf_cgroup_move, task); | 8042 | task_function_call(task, __perf_cgroup_move, task); |
8058 | } | 8043 | } |
8059 | 8044 | ||
@@ -8072,9 +8057,7 @@ static void perf_cgroup_exit(struct cgroup_subsys_state *css, | |||
8072 | task_function_call(task, __perf_cgroup_move, task); | 8057 | task_function_call(task, __perf_cgroup_move, task); |
8073 | } | 8058 | } |
8074 | 8059 | ||
8075 | struct cgroup_subsys perf_subsys = { | 8060 | struct cgroup_subsys perf_event_cgrp_subsys = { |
8076 | .name = "perf_event", | ||
8077 | .subsys_id = perf_subsys_id, | ||
8078 | .css_alloc = perf_cgroup_css_alloc, | 8061 | .css_alloc = perf_cgroup_css_alloc, |
8079 | .css_free = perf_cgroup_css_free, | 8062 | .css_free = perf_cgroup_css_free, |
8080 | .exit = perf_cgroup_exit, | 8063 | .exit = perf_cgroup_exit, |