cgroup, perf_event: Fix perf cgroup hierarchy support
PATCH 1/1 cgroup, perf_event: Fix perf cgroup hierarchy support
864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups") made list_update_cgroup_event() skip setting cpuctx->cgrp if no cgroup event targets %current's cgroup. This breaks perf_event's hierarchical support because events which target one of the ancestors get ignored.
Fix it by using cgroup_is_descendant() test instead of equality.
--- kernel/events/core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/events/core.c +5 -2
@@ -901,9 +901,12 @@ list_update_cgroup_event(struct perf_event *event, cpuctx_entry = &cpuctx->cgrp_cpuctx_entry;/* cpuctx->cgrp is NULL unless a cgroup event is active in this CPU .*/ if (add) { +struct perf_cgroup *cgrp =perf_cgroup_from_task (current, ctx); +list_add (cpuctx_entry,this_cpu_ptr (&cgrp_cpuctx_list)); -if (perf_cgroup_from_task (current, ctx) == event->cgrp) - cpuctx->cgrp = event->cgrp; +if (cgroup_is_descendant (cgrp->css.cgroup, + event->cgrp->css.cgroup)) + cpuctx->cgrp = cgrp; }else {list_del (cpuctx_entry); cpuctx->cgrp =NULL ;
Quoted 7 lines · Tejun Heo
864c2357ca89("perf/core: Do not setcpuctx->cgrpfor unscheduled cgroups") madelist_update_cgroup_event()skip settingcpuctx->cgrpif no cgroup event targets %current's cgroup. This breaks perf_event's hierarchical support because events which target one of the ancestors get ignored.Fix it by using
cgroup_is_descendant()test instead of equality.
Right similar to:
e6a5203399d1 ("perf/core: Fix cgroup time when scheduling descendants")
Quoted 4 lines
Signed-off-by Tejun Heo <[email protected]>Fixes 864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups")Cc [email protected] # v4.9+Cc David Carrillo-Cisneros <[email protected]>
I think David left Google (I've had this email bounce), lets add Stephane.
Quoted 23 lines
--- kernel/events/core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)kernel/events/core.c +5
-2@@ -901,9 +901,12 @@ list_update_cgroup_event(struct perf_event *event, cpuctx_entry = &cpuctx->cgrp_cpuctx_entry;/* cpuctx->cgrp is NULL unless a cgroup event is active in this CPU .*/ if (add) { +struct perf_cgroup *cgrp =perf_cgroup_from_task (current, ctx); +list_add (cpuctx_entry,this_cpu_ptr (&cgrp_cpuctx_list)); -if (perf_cgroup_from_task (current, ctx) == event->cgrp) - cpuctx->cgrp = event->cgrp; +if (cgroup_is_descendant (cgrp->css.cgroup, + event->cgrp->css.cgroup)) + cpuctx->cgrp = cgrp; }else {list_del (cpuctx_entry); cpuctx->cgrp =NULL ;
tip-bot for Tejun Heo
merge bot[tip:perf/urgent] perf/cgroup: Fix perf cgroup hierarchy support
In reply to Tejun Heoperf/cgroup: Fix perf cgroup hierarchy support
Commit-ID: be96b316deff35e119760982c43af74e606fa143 Gitweb: https://git.kernel.org/tip/be96b316deff35e119760982c43af74e606fa143 Author: Tejun Heo <[email protected]> AuthorDate: Sat, 28 Oct 2017 09:49:37 -0700 Committer: Ingo Molnar <[email protected]> CommitDate: Mon, 30 Oct 2017 11:58:51 +0100
perf/cgroup: Fix perf cgroup hierarchy support
The following commit:
864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups")
made list_update_cgroup_event() skip setting cpuctx->cgrp if no cgroup event targets %current's cgroup.
This breaks perf_event's hierarchical support because events which target one of the ancestors get ignored.
Fix it by using cgroup_is_descendant() test instead of equality.
--- kernel/events/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/events/core.c +4 -2
@@ -901,9 +901,11 @@ list_update_cgroup_event(struct perf_event *event, cpuctx_entry = &cpuctx->cgrp_cpuctx_entry;/* cpuctx->cgrp is NULL unless a cgroup event is active in this CPU .*/ if (add) { +struct perf_cgroup *cgrp =perf_cgroup_from_task (current, ctx); +list_add (cpuctx_entry,this_cpu_ptr (&cgrp_cpuctx_list)); -if (perf_cgroup_from_task (current, ctx) == event->cgrp) - cpuctx->cgrp = event->cgrp; +if (cgroup_is_descendant (cgrp->css.cgroup, event->cgrp->css.cgroup)) + cpuctx->cgrp = cgrp; }else {list_del (cpuctx_entry); cpuctx->cgrp =NULL ;