From 0628d71685fec2309991ef129566a92fe6b88ad5 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 22 Jun 2009 13:58:35 +0200 Subject: [PATCH] --- yaml --- r: 154623 b: refs/heads/master c: f344011ccb85469445369153c3d27c4ee4bc2ac8 h: refs/heads/master i: 154621: d24dba3d5a0d2cdb7e53411f714f44a42b5cad09 154619: 95d1798cafafc6db47e71d12d2a0ad9fc43cce3b 154615: d63d54fa3622c594136c7b884eefaa14e3ae4564 154607: 77c6737f4ed94e63decd5137f52d36dc1e78c30c 154591: 05c9aaed2f15b910d95127d8a92e2beb923f6fbd 154559: d66d186666838ad841f6274779121744e8103475 154495: 2ed8e33278894b59baca61f3cad06d573d07810f 154367: 07a40233bfcdaedb1435dc7318105717ee00abe7 154111: 51a4ebf1ce62f2681a7a73c1373fd125a609a339 153599: 031ff737217cc98f495183e2ac2b039a8cc148bd v: v3 --- [refs] | 2 +- trunk/kernel/perf_counter.c | 32 ++++++++++++++++++++------------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 1a113798cfb0..821844ea6842 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b84fbc9fb1d943e2c5f4efe52ed0e3c93a4bdb6a +refs/heads/master: f344011ccb85469445369153c3d27c4ee4bc2ac8 diff --git a/trunk/kernel/perf_counter.c b/trunk/kernel/perf_counter.c index 0a45490f4029..c2b19c111718 100644 --- a/trunk/kernel/perf_counter.c +++ b/trunk/kernel/perf_counter.c @@ -1508,11 +1508,13 @@ static void free_counter(struct perf_counter *counter) { perf_pending_sync(counter); - atomic_dec(&nr_counters); - if (counter->attr.mmap) - atomic_dec(&nr_mmap_counters); - if (counter->attr.comm) - atomic_dec(&nr_comm_counters); + if (!counter->parent) { + atomic_dec(&nr_counters); + if (counter->attr.mmap) + atomic_dec(&nr_mmap_counters); + if (counter->attr.comm) + atomic_dec(&nr_comm_counters); + } if (counter->destroy) counter->destroy(counter); @@ -3515,6 +3517,8 @@ static void sw_perf_counter_destroy(struct perf_counter *counter) { u64 event = counter->attr.config; + WARN_ON(counter->parent); + atomic_dec(&perf_swcounter_enabled[event]); } @@ -3551,8 +3555,10 @@ static const struct pmu *sw_perf_counter_init(struct perf_counter *counter) case PERF_COUNT_SW_PAGE_FAULTS_MAJ: case PERF_COUNT_SW_CONTEXT_SWITCHES: case PERF_COUNT_SW_CPU_MIGRATIONS: - atomic_inc(&perf_swcounter_enabled[event]); - counter->destroy = sw_perf_counter_destroy; + if (!counter->parent) { + atomic_inc(&perf_swcounter_enabled[event]); + counter->destroy = sw_perf_counter_destroy; + } pmu = &perf_ops_generic; break; } @@ -3663,11 +3669,13 @@ perf_counter_alloc(struct perf_counter_attr *attr, counter->pmu = pmu; - atomic_inc(&nr_counters); - if (counter->attr.mmap) - atomic_inc(&nr_mmap_counters); - if (counter->attr.comm) - atomic_inc(&nr_comm_counters); + if (!counter->parent) { + atomic_inc(&nr_counters); + if (counter->attr.mmap) + atomic_inc(&nr_mmap_counters); + if (counter->attr.comm) + atomic_inc(&nr_comm_counters); + } return counter; }