diff options
-rw-r--r-- | kernel/trace/trace_uprobe.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index c4cf0abd60ba..3c9b97e6b1f4 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c | |||
@@ -911,26 +911,33 @@ probe_event_enable(struct trace_uprobe *tu, struct ftrace_event_file *file, | |||
911 | tu->tp.flags |= TP_FLAG_PROFILE; | 911 | tu->tp.flags |= TP_FLAG_PROFILE; |
912 | } | 912 | } |
913 | 913 | ||
914 | ret = uprobe_buffer_enable(); | ||
915 | if (ret < 0) | ||
916 | return ret; | ||
917 | |||
918 | WARN_ON(!uprobe_filter_is_empty(&tu->filter)); | 914 | WARN_ON(!uprobe_filter_is_empty(&tu->filter)); |
919 | 915 | ||
920 | if (enabled) | 916 | if (enabled) |
921 | return 0; | 917 | return 0; |
922 | 918 | ||
919 | ret = uprobe_buffer_enable(); | ||
920 | if (ret) | ||
921 | goto err_flags; | ||
922 | |||
923 | tu->consumer.filter = filter; | 923 | tu->consumer.filter = filter; |
924 | ret = uprobe_register(tu->inode, tu->offset, &tu->consumer); | 924 | ret = uprobe_register(tu->inode, tu->offset, &tu->consumer); |
925 | if (ret) { | 925 | if (ret) |
926 | if (file) { | 926 | goto err_buffer; |
927 | list_del(&link->list); | ||
928 | kfree(link); | ||
929 | tu->tp.flags &= ~TP_FLAG_TRACE; | ||
930 | } else | ||
931 | tu->tp.flags &= ~TP_FLAG_PROFILE; | ||
932 | } | ||
933 | 927 | ||
928 | return 0; | ||
929 | |||
930 | err_buffer: | ||
931 | uprobe_buffer_disable(); | ||
932 | |||
933 | err_flags: | ||
934 | if (file) { | ||
935 | list_del(&link->list); | ||
936 | kfree(link); | ||
937 | tu->tp.flags &= ~TP_FLAG_TRACE; | ||
938 | } else { | ||
939 | tu->tp.flags &= ~TP_FLAG_PROFILE; | ||
940 | } | ||
934 | return ret; | 941 | return ret; |
935 | } | 942 | } |
936 | 943 | ||