diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_pt.c | 33 |
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; |
1019 | out: | ||
1020 | |||
1021 | if (ret) | ||
1022 | hwc->state = PERF_HES_STOPPED; | ||
1023 | 1015 | ||
1016 | fail_end_stop: | ||
1017 | perf_aux_output_end(&pt->handle, 0, true); | ||
1018 | fail_stop: | ||
1019 | hwc->state = PERF_HES_STOPPED; | ||
1020 | fail: | ||
1024 | return ret; | 1021 | return ret; |
1025 | } | 1022 | } |
1026 | 1023 | ||