From e82e9fc48ce0eeaa0874bf089bf0c7b37b922260 Mon Sep 17 00:00:00 2001 From: Stephane Eranian Date: Wed, 23 Mar 2011 16:03:06 +0100 Subject: [PATCH] --- yaml --- r: 242518 b: refs/heads/master c: 68cacd29167b1926d237bd1b153aa2a990201729 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/perf_event.h | 2 -- trunk/kernel/perf_event.c | 12 +++++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index dc3a0259dbfa..bd7c2b9e8bd1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ce2d17ca7f85dcade62cd608601a0d52ccdaf0e6 +refs/heads/master: 68cacd29167b1926d237bd1b153aa2a990201729 diff --git a/trunk/include/linux/perf_event.h b/trunk/include/linux/perf_event.h index f495c0147240..311b4dc785a1 100644 --- a/trunk/include/linux/perf_event.h +++ b/trunk/include/linux/perf_event.h @@ -938,9 +938,7 @@ struct perf_cpu_context { struct list_head rotation_list; int jiffies_interval; struct pmu *active_pmu; -#ifdef CONFIG_CGROUP_PERF struct perf_cgroup *cgrp; -#endif }; struct perf_output_handle { diff --git a/trunk/kernel/perf_event.c b/trunk/kernel/perf_event.c index 3472bb1a070c..0c714226ae0c 100644 --- a/trunk/kernel/perf_event.c +++ b/trunk/kernel/perf_event.c @@ -941,6 +941,7 @@ static void perf_group_attach(struct perf_event *event) static void list_del_event(struct perf_event *event, struct perf_event_context *ctx) { + struct perf_cpu_context *cpuctx; /* * We can have double detach due to exit/hot-unplug + close. */ @@ -949,8 +950,17 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx) event->attach_state &= ~PERF_ATTACH_CONTEXT; - if (is_cgroup_event(event)) + if (is_cgroup_event(event)) { ctx->nr_cgroups--; + cpuctx = __get_cpu_context(ctx); + /* + * if there are no more cgroup events + * then cler cgrp to avoid stale pointer + * in update_cgrp_time_from_cpuctx() + */ + if (!ctx->nr_cgroups) + cpuctx->cgrp = NULL; + } ctx->nr_events--; if (event->attr.inherit_stat)