aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/perf_event.h1
-rw-r--r--kernel/perf_event.c5
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 */
524enum perf_event_active_state { 524enum 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);