Skip to contentSkip to conversation

cgroup, perf_event: Fix perf cgroup hierarchy support

PATCH In review Tejun Heo 3 participants 3 messages Oct 28, 2017 – Oct 30, 2017 perf events

lore
Share & tools
lore

Tejun Heo

author
#0 lore raw

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.

Fixes 864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups")
Cc David Carrillo-Cisneros <[email protected]>
---
 kernel/events/core.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/events/core.c +5 -2
index 9d93db8..db2e630 100644
@@ -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;
maintainer Acked-by on v1 1/1
#1 lore raw
Quoted 7 lines · Tejun Heo

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.

Right similar to:

e6a5203399d1 ("perf/core: Fix cgroup time when scheduling descendants")

Quoted 4 lines
Fixes 864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups")
Cc David Carrillo-Cisneros <[email protected]>

I think David left Google (I've had this email bounce), lets add Stephane.

Cc Stephane Eranian <[email protected]>
Quoted 23 lines
---
 kernel/events/core.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/events/core.c +5 -2
index 9d93db8..db2e630 100644
@@ -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;
#2 lore raw

[tip:perf/urgent] perf/cgroup: Fix perf cgroup hierarchy support

In reply to Tejun Heo
perf/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.

Cc Arnaldo Carvalho de Melo <[email protected]>
Cc David Carrillo-Cisneros <[email protected]>
Cc Linus Torvalds <[email protected]>
Cc Peter Zijlstra <[email protected]>
Fixes 864c2357ca89 ("perf/core: Do not set cpuctx->cgrp for unscheduled cgroups")
---
 kernel/events/core.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/events/core.c +4 -2
index 9d93db8..10cdb9c 100644
@@ -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;