diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/perf_counter.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 0a45490f4029..c2b19c111718 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1508,11 +1508,13 @@ static void free_counter(struct perf_counter *counter) | |||
1508 | { | 1508 | { |
1509 | perf_pending_sync(counter); | 1509 | perf_pending_sync(counter); |
1510 | 1510 | ||
1511 | atomic_dec(&nr_counters); | 1511 | if (!counter->parent) { |
1512 | if (counter->attr.mmap) | 1512 | atomic_dec(&nr_counters); |
1513 | atomic_dec(&nr_mmap_counters); | 1513 | if (counter->attr.mmap) |
1514 | if (counter->attr.comm) | 1514 | atomic_dec(&nr_mmap_counters); |
1515 | atomic_dec(&nr_comm_counters); | 1515 | if (counter->attr.comm) |
1516 | atomic_dec(&nr_comm_counters); | ||
1517 | } | ||
1516 | 1518 | ||
1517 | if (counter->destroy) | 1519 | if (counter->destroy) |
1518 | counter->destroy(counter); | 1520 | counter->destroy(counter); |
@@ -3515,6 +3517,8 @@ static void sw_perf_counter_destroy(struct perf_counter *counter) | |||
3515 | { | 3517 | { |
3516 | u64 event = counter->attr.config; | 3518 | u64 event = counter->attr.config; |
3517 | 3519 | ||
3520 | WARN_ON(counter->parent); | ||
3521 | |||
3518 | atomic_dec(&perf_swcounter_enabled[event]); | 3522 | atomic_dec(&perf_swcounter_enabled[event]); |
3519 | } | 3523 | } |
3520 | 3524 | ||
@@ -3551,8 +3555,10 @@ static const struct pmu *sw_perf_counter_init(struct perf_counter *counter) | |||
3551 | case PERF_COUNT_SW_PAGE_FAULTS_MAJ: | 3555 | case PERF_COUNT_SW_PAGE_FAULTS_MAJ: |
3552 | case PERF_COUNT_SW_CONTEXT_SWITCHES: | 3556 | case PERF_COUNT_SW_CONTEXT_SWITCHES: |
3553 | case PERF_COUNT_SW_CPU_MIGRATIONS: | 3557 | case PERF_COUNT_SW_CPU_MIGRATIONS: |
3554 | atomic_inc(&perf_swcounter_enabled[event]); | 3558 | if (!counter->parent) { |
3555 | counter->destroy = sw_perf_counter_destroy; | 3559 | atomic_inc(&perf_swcounter_enabled[event]); |
3560 | counter->destroy = sw_perf_counter_destroy; | ||
3561 | } | ||
3556 | pmu = &perf_ops_generic; | 3562 | pmu = &perf_ops_generic; |
3557 | break; | 3563 | break; |
3558 | } | 3564 | } |
@@ -3663,11 +3669,13 @@ done: | |||
3663 | 3669 | ||
3664 | counter->pmu = pmu; | 3670 | counter->pmu = pmu; |
3665 | 3671 | ||
3666 | atomic_inc(&nr_counters); | 3672 | if (!counter->parent) { |
3667 | if (counter->attr.mmap) | 3673 | atomic_inc(&nr_counters); |
3668 | atomic_inc(&nr_mmap_counters); | 3674 | if (counter->attr.mmap) |
3669 | if (counter->attr.comm) | 3675 | atomic_inc(&nr_mmap_counters); |
3670 | atomic_inc(&nr_comm_counters); | 3676 | if (counter->attr.comm) |
3677 | atomic_inc(&nr_comm_counters); | ||
3678 | } | ||
3671 | 3679 | ||
3672 | return counter; | 3680 | return counter; |
3673 | } | 3681 | } |