diff options
-rw-r--r-- | include/linux/perf_event.h | 1 | ||||
-rw-r--r-- | kernel/perf_event.c | 5 |
2 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index c8e375440403..bf8f3c003297 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -522,6 +522,7 @@ struct pmu { | |||
522 | * enum perf_event_active_state - the states of a event | 522 | * enum perf_event_active_state - the states of a event |
523 | */ | 523 | */ |
524 | enum perf_event_active_state { | 524 | enum perf_event_active_state { |
525 | PERF_EVENT_STATE_FREE = -3, | ||
525 | PERF_EVENT_STATE_ERROR = -2, | 526 | PERF_EVENT_STATE_ERROR = -2, |
526 | PERF_EVENT_STATE_OFF = -1, | 527 | PERF_EVENT_STATE_OFF = -1, |
527 | PERF_EVENT_STATE_INACTIVE = 0, | 528 | PERF_EVENT_STATE_INACTIVE = 0, |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 3d1552d3c12b..f13c3db765f4 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -341,6 +341,9 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx) | |||
341 | if (event->state > PERF_EVENT_STATE_OFF) | 341 | if (event->state > PERF_EVENT_STATE_OFF) |
342 | event->state = PERF_EVENT_STATE_OFF; | 342 | event->state = PERF_EVENT_STATE_OFF; |
343 | 343 | ||
344 | if (event->state > PERF_EVENT_STATE_FREE) | ||
345 | return; | ||
346 | |||
344 | /* | 347 | /* |
345 | * If this was a group event with sibling events then | 348 | * If this was a group event with sibling events then |
346 | * upgrade the siblings to singleton events by adding them | 349 | * upgrade the siblings to singleton events by adding them |
@@ -1856,6 +1859,8 @@ int perf_event_release_kernel(struct perf_event *event) | |||
1856 | { | 1859 | { |
1857 | struct perf_event_context *ctx = event->ctx; | 1860 | struct perf_event_context *ctx = event->ctx; |
1858 | 1861 | ||
1862 | event->state = PERF_EVENT_STATE_FREE; | ||
1863 | |||
1859 | WARN_ON_ONCE(ctx->parent_ctx); | 1864 | WARN_ON_ONCE(ctx->parent_ctx); |
1860 | mutex_lock(&ctx->mutex); | 1865 | mutex_lock(&ctx->mutex); |
1861 | perf_event_remove_from_context(event); | 1866 | perf_event_remove_from_context(event); |