aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_pt.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel_pt.c b/arch/x86/kernel/cpu/perf_event_intel_pt.c
index f2770641c0fd..ffe666c2c6b5 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_pt.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_pt.c
@@ -988,39 +988,36 @@ static int pt_event_add(struct perf_event *event, int mode)
988 int ret = -EBUSY; 988 int ret = -EBUSY;
989 989
990 if (pt->handle.event) 990 if (pt->handle.event)
991 goto out; 991 goto fail;
992 992
993 buf = perf_aux_output_begin(&pt->handle, event); 993 buf = perf_aux_output_begin(&pt->handle, event);
994 if (!buf) { 994 ret = -EINVAL;
995 ret = -EINVAL; 995 if (!buf)
996 goto out; 996 goto fail_stop;
997 }
998 997
999 pt_buffer_reset_offsets(buf, pt->handle.head); 998 pt_buffer_reset_offsets(buf, pt->handle.head);
1000 if (!buf->snapshot) { 999 if (!buf->snapshot) {
1001 ret = pt_buffer_reset_markers(buf, &pt->handle); 1000 ret = pt_buffer_reset_markers(buf, &pt->handle);
1002 if (ret) { 1001 if (ret)
1003 perf_aux_output_end(&pt->handle, 0, true); 1002 goto fail_end_stop;
1004 goto out;
1005 }
1006 } 1003 }
1007 1004
1008 if (mode & PERF_EF_START) { 1005 if (mode & PERF_EF_START) {
1009 pt_event_start(event, 0); 1006 pt_event_start(event, 0);
1010 if (hwc->state == PERF_HES_STOPPED) { 1007 ret = -EBUSY;
1011 pt_event_del(event, 0); 1008 if (hwc->state == PERF_HES_STOPPED)
1012 ret = -EBUSY; 1009 goto fail_end_stop;
1013 }
1014 } else { 1010 } else {
1015 hwc->state = PERF_HES_STOPPED; 1011 hwc->state = PERF_HES_STOPPED;
1016 } 1012 }
1017 1013
1018 ret = 0; 1014 return 0;
1019out:
1020
1021 if (ret)
1022 hwc->state = PERF_HES_STOPPED;
1023 1015
1016fail_end_stop:
1017 perf_aux_output_end(&pt->handle, 0, true);
1018fail_stop:
1019 hwc->state = PERF_HES_STOPPED;
1020fail:
1024 return ret; 1021 return ret;
1025} 1022}
1026 1023