History

Merge tag 'trace-v5.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull more tracing updates from Steven Rostedt: - Rename the staging files to give them some meaning. Just stage1,stag2,etc, does not show what they are for - Check for NULL from allocation in bootconfig - Hold event mutex for dyn_event call in user events - Mark user events to broken (to work on the API) - Remove eBPF updates from user events - Remove user events from uapi header to keep it from being installed. - Move ftrace_graph_is_dead() into inline as it is called from hot paths and also convert it into a static branch. * tag 'trace-v5.18-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: tracing: Move user_events.h temporarily out of include/uapi ftrace: Make ftrace_graph_is_dead() a static branch tracing: Set user_events to BROKEN tracing/user_events: Remove eBPF interfaces tracing/user_events: Hold event_mutex during dyn_event_add proc: bootconfig: Add null pointer check tracing: Rename the staging files for trace_events

Linus Torvalds committed 4 years ago

Commit 09bb8852 parents 34a53ff 5cfff5615 files · +44 −167Browse files

Unified · Split

15 files
  1. Documentation/trace/user_events.rst +3 −11
  2. fs/proc/bootconfig.c +2 −0
  3. include/linux/ftrace.h +15 −1
  4. include/linux/user_events.h +0 −53
  5. include/trace/stages/stage1_struct_define.h +0 −0
  6. include/trace/stages/stage2_data_offsets.h +0 −0
  7. include/trace/stages/stage3_trace_output.h +0 −0
  8. include/trace/stages/stage4_event_fields.h +0 −0
  9. include/trace/stages/stage5_get_offsets.h +0 −0
  10. include/trace/stages/stage6_event_callback.h +0 −0
  11. include/trace/stages/stage7_class_define.h +0 −0
  12. include/trace/trace_custom_events.h +7 −7
  13. include/trace/trace_events.h +7 −7
  14. kernel/trace/fgraph.c +3 −14
  15. kernel/trace/trace_events_user.c +7 −74
Documentation/trace/user_events.rst+3−11
@@ -7,7 +7,7 @@ user_events: User-based Event Tracing · 6 unmodified lines
77 Overview
88 --------
99 User based trace events allow user processes to create events and trace data
10−that can be viewed via existing tools, such as ftrace, perf and eBPF.
10+that can be viewed via existing tools, such as ftrace and perf.
1111 To enable this feature, build your kernel with CONFIG_USER_EVENTS=y.
1212
1313 Programs can view status of the events via
@@ -67,8 +67,7 @@ The command string format is as follows:: · 53 unmodified lines
6767
6868 Supported Flags
6969 ^^^^^^^^^^^^^^^
70−**BPF_ITER** - EBPF programs attached to this event will get the raw iovec
71−struct instead of any data copies for max performance.
70+None yet
7271
7372 Field Format
7473 ^^^^^^^^^^^^
@@ -160,7 +159,7 @@ The following values are defined to aid in checking what has been attached: · 85 unmodified lines
160159
161160 **EVENT_STATUS_FTRACE** - Bit set if ftrace has been attached (Bit 0).
162161
163−**EVENT_STATUS_PERF** - Bit set if perf/eBPF has been attached (Bit 1).
162+**EVENT_STATUS_PERF** - Bit set if perf has been attached (Bit 1).
164163
165164 Writing Data
166165 ------------
@@ -204,13 +203,6 @@ It's advised for user programs to do the following:: · 37 unmodified lines
204203
205204 **NOTE:** *The write_index is not emitted out into the trace being recorded.*
206205
207−EBPF
208−----
209−EBPF programs that attach to a user-based event tracepoint are given a pointer
210−to a struct user_bpf_context. The bpf context contains the data type (which can
211−be a user or kernel buffer, or can be a pointer to the iovec) and the data
212−length that was emitted (minus the write_index).
213−
214206 Example Code
215207 ------------
216208 See sample code in samples/user_events.
fs/proc/bootconfig.c+2−0
@@ -32,6 +32,8 @@ static int __init copy_xbc_key_value_list(char *dst, size_t size) · 31 unmodified lines
3232 int ret = 0;
3333
3434 key = kzalloc(XBC_KEYLEN_MAX, GFP_KERNEL);
35+ if (!key)
36+ return -ENOMEM;
3537
3638 xbc_for_each_key_value(leaf, val) {
3739 ret = xbc_node_compose_key(leaf, key, XBC_KEYLEN_MAX);
include/linux/ftrace.h+15−1
@@ -9,6 +9,7 @@ · 8 unmodified lines
99
1010 #include <linux/trace_recursion.h>
1111 #include <linux/trace_clock.h>
12+#include <linux/jump_label.h>
1213 #include <linux/kallsyms.h>
1314 #include <linux/linkage.h>
1415 #include <linux/bitops.h>
@@ -1018,7 +1019,20 @@ unsigned long ftrace_graph_ret_addr(struct task_struct *task, int *idx, · 1003 unmodified lines
10181019 extern int register_ftrace_graph(struct fgraph_ops *ops);
10191020 extern void unregister_ftrace_graph(struct fgraph_ops *ops);
10201021
1021−extern bool ftrace_graph_is_dead(void);
1022+/**
1023+ * ftrace_graph_is_dead - returns true if ftrace_graph_stop() was called
1024+ *
1025+ * ftrace_graph_stop() is called when a severe error is detected in
1026+ * the function graph tracing. This function is called by the critical
1027+ * paths of function graph to keep those paths from doing any more harm.
1028+ */
1029+DECLARE_STATIC_KEY_FALSE(kill_ftrace_graph);
1030+
1031+static inline bool ftrace_graph_is_dead(void)
1032+{
1033+ return static_branch_unlikely(&kill_ftrace_graph);
1034+}
1035+
10221036 extern void ftrace_graph_stop(void);
10231037
10241038 /* The current handlers in use */
include/linux/user_events.h+0−53
@@ -32,9 +32,6 @@ · 31 unmodified lines
3232 /* Create dynamic location entry within a 32-bit value */
3333 #define DYN_LOC(offset, size) ((size) << 16 | (offset))
3434
35−/* Use raw iterator for attached BPF program(s), no affect on ftrace/perf */
36−#define FLAG_BPF_ITER (1 << 0)
37−
3835 /*
3936 * Describes an event registration and stores the results of the registration.
4037 * This structure is passed to the DIAG_IOCSREG ioctl, callers at a minimum
@@ -63,54 +60,4 @@ struct user_reg { · 22 unmodified lines
6360 /* Requests to delete a user_event */
6461 #define DIAG_IOCSDEL _IOW(DIAG_IOC_MAGIC, 1, char*)
6562
66−/* Data type that was passed to the BPF program */
67−enum {
68− /* Data resides in kernel space */
69− USER_BPF_DATA_KERNEL,
70−
71− /* Data resides in user space */
72− USER_BPF_DATA_USER,
73−
74− /* Data is a pointer to a user_bpf_iter structure */
75− USER_BPF_DATA_ITER,
76−};
77−
78−/*
79− * Describes an iovec iterator that BPF programs can use to access data for
80− * a given user_event write() / writev() call.
81− */
82−struct user_bpf_iter {
83−
84− /* Offset of the data within the first iovec */
85− __u32 iov_offset;
86−
87− /* Number of iovec structures */
88− __u32 nr_segs;
89−
90− /* Pointer to iovec structures */
91− const struct iovec *iov;
92−};
93−
94−/* Context that BPF programs receive when attached to a user_event */
95−struct user_bpf_context {
96−
97− /* Data type being passed (see union below) */
98− __u32 data_type;
99−
100− /* Length of the data */
101− __u32 data_len;
102−
103− /* Pointer to data, varies by data type */
104− union {
105− /* Kernel data (data_type == USER_BPF_DATA_KERNEL) */
106− void *kdata;
107−
108− /* User data (data_type == USER_BPF_DATA_USER) */
109− void *udata;
110−
111− /* Direct iovec (data_type == USER_BPF_DATA_ITER) */
112− struct user_bpf_iter *iter;
113− };
114−};
115−
11663 #endif /* _UAPI_LINUX_USER_EVENTS_H */
include/trace/stages/stage1_struct_define.hrenamed from include/trace/stages/stage1_defines.h+0−0

File renamed without changes.

include/trace/stages/stage2_data_offsets.hrenamed from include/trace/stages/stage2_defines.h+0−0

File renamed without changes.

include/trace/stages/stage3_trace_output.hrenamed from include/trace/stages/stage3_defines.h+0−0

File renamed without changes.

include/trace/stages/stage4_event_fields.hrenamed from include/trace/stages/stage4_defines.h+0−0

File renamed without changes.

include/trace/stages/stage5_get_offsets.hrenamed from include/trace/stages/stage5_defines.h+0−0

File renamed without changes.

include/trace/stages/stage6_event_callback.hrenamed from include/trace/stages/stage6_defines.h+0−0

File renamed without changes.

include/trace/stages/stage7_class_define.hrenamed from include/trace/stages/stage7_defines.h+0−0

File renamed without changes.

include/trace/trace_custom_events.h+7−7
@@ -35,7 +35,7 @@ · 34 unmodified lines
3535
3636 /* Stage 1 creates the structure of the recorded event layout */
3737
38−#include "stages/stage1_defines.h"
38+#include "stages/stage1_struct_define.h"
3939
4040 #undef DECLARE_CUSTOM_EVENT_CLASS
4141 #define DECLARE_CUSTOM_EVENT_CLASS(name, proto, args, tstruct, assign, print) \
@@ -56,7 +56,7 @@ · 14 unmodified lines
5656
5757 /* Stage 2 creates the custom class */
5858
59−#include "stages/stage2_defines.h"
59+#include "stages/stage2_data_offsets.h"
6060
6161 #undef DECLARE_CUSTOM_EVENT_CLASS
6262 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -71,7 +71,7 @@ · 8 unmodified lines
7171
7272 /* Stage 3 create the way to print the custom event */
7373
74−#include "stages/stage3_defines.h"
74+#include "stages/stage3_trace_output.h"
7575
7676 #undef DECLARE_CUSTOM_EVENT_CLASS
7777 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -102,7 +102,7 @@ static struct trace_event_functions trace_custom_event_type_funcs_##call = { \ · 24 unmodified lines
102102
103103 /* Stage 4 creates the offset layout for the fields */
104104
105−#include "stages/stage4_defines.h"
105+#include "stages/stage4_event_fields.h"
106106
107107 #undef DECLARE_CUSTOM_EVENT_CLASS
108108 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, func, print) \
@@ -114,7 +114,7 @@ static struct trace_event_fields trace_custom_event_fields_##call[] = { \ · 5 unmodified lines
114114
115115 /* Stage 5 creates the helper function for dynamic fields */
116116
117−#include "stages/stage5_defines.h"
117+#include "stages/stage5_get_offsets.h"
118118
119119 #undef DECLARE_CUSTOM_EVENT_CLASS
120120 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -134,7 +134,7 @@ static inline notrace int trace_custom_event_get_offsets_##call( \ · 13 unmodified lines
134134
135135 /* Stage 6 creates the probe function that records the event */
136136
137−#include "stages/stage6_defines.h"
137+#include "stages/stage6_event_callback.h"
138138
139139 #undef DECLARE_CUSTOM_EVENT_CLASS
140140 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -182,7 +182,7 @@ static inline void ftrace_test_custom_probe_##call(void) \ · 41 unmodified lines
182182
183183 /* Stage 7 creates the actual class and event structure for the custom event */
184184
185−#include "stages/stage7_defines.h"
185+#include "stages/stage7_class_define.h"
186186
187187 #undef DECLARE_CUSTOM_EVENT_CLASS
188188 #define DECLARE_CUSTOM_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
include/trace/trace_events.h+7−7
@@ -45,7 +45,7 @@ · 44 unmodified lines
4545 PARAMS(print)); \
4646 DEFINE_EVENT(name, name, PARAMS(proto), PARAMS(args));
4747
48−#include "stages/stage1_defines.h"
48+#include "stages/stage1_struct_define.h"
4949
5050 #undef DECLARE_EVENT_CLASS
5151 #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print) \
@@ -109,7 +109,7 @@ · 57 unmodified lines
109109 * The size of an array is also encoded, in the higher 16 bits of <item>.
110110 */
111111
112−#include "stages/stage2_defines.h"
112+#include "stages/stage2_data_offsets.h"
113113
114114 #undef DECLARE_EVENT_CLASS
115115 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -181,7 +181,7 @@ · 65 unmodified lines
181181 * in binary.
182182 */
183183
184−#include "stages/stage3_defines.h"
184+#include "stages/stage3_trace_output.h"
185185
186186 #undef DECLARE_EVENT_CLASS
187187 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -236,7 +236,7 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \ · 48 unmodified lines
236236
237237 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
238238
239−#include "stages/stage4_defines.h"
239+#include "stages/stage4_event_fields.h"
240240
241241 #undef DECLARE_EVENT_CLASS
242242 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \
@@ -249,7 +249,7 @@ static struct trace_event_fields trace_event_fields_##call[] = { \ · 6 unmodified lines
249249
250250 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
251251
252−#include "stages/stage5_defines.h"
252+#include "stages/stage5_get_offsets.h"
253253
254254 #undef DECLARE_EVENT_CLASS
255255 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -372,7 +372,7 @@ static inline notrace int trace_event_get_offsets_##call( \ · 116 unmodified lines
372372 #define _TRACE_PERF_INIT(call)
373373 #endif /* CONFIG_PERF_EVENTS */
374374
375−#include "stages/stage6_defines.h"
375+#include "stages/stage6_event_callback.h"
376376
377377 #undef DECLARE_EVENT_CLASS
378378 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
@@ -418,7 +418,7 @@ static inline void ftrace_test_probe_##call(void) \ · 39 unmodified lines
418418
419419 #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
420420
421−#include "stages/stage7_defines.h"
421+#include "stages/stage7_class_define.h"
422422
423423 #undef DECLARE_EVENT_CLASS
424424 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
kernel/trace/fgraph.c+3−14
@@ -7,6 +7,7 @@ · 6 unmodified lines
77 *
88 * Highly modified by Steven Rostedt (VMware).
99 */
10+#include <linux/jump_label.h>
1011 #include <linux/suspend.h>
1112 #include <linux/ftrace.h>
1213 #include <linux/slab.h>
@@ -23,24 +24,12 @@ · 10 unmodified lines
2324 #define ASSIGN_OPS_HASH(opsname, val)
2425 #endif
2526
26−static bool kill_ftrace_graph;
27+DEFINE_STATIC_KEY_FALSE(kill_ftrace_graph);
2728 int ftrace_graph_active;
2829
2930 /* Both enabled by default (can be cleared by function_graph tracer flags */
3031 static bool fgraph_sleep_time = true;
3132
32−/**
33− * ftrace_graph_is_dead - returns true if ftrace_graph_stop() was called
34− *
35− * ftrace_graph_stop() is called when a severe error is detected in
36− * the function graph tracing. This function is called by the critical
37− * paths of function graph to keep those paths from doing any more harm.
38− */
39−bool ftrace_graph_is_dead(void)
40−{
41− return kill_ftrace_graph;
42−}
43−
4433 /**
4534 * ftrace_graph_stop - set to permanently disable function graph tracing
4635 *
@@ -51,7 +40,7 @@ bool ftrace_graph_is_dead(void) · 4 unmodified lines
5140 */
5241 void ftrace_graph_stop(void)
5342 {
54− kill_ftrace_graph = true;
43+ static_branch_enable(&kill_ftrace_graph);
5544 }
5645
5746 /* Add a function return address to the trace stack on thread info.*/
kernel/trace/trace_events_user.c+7−74
@@ -47,9 +47,6 @@ · 46 unmodified lines
4747 #define MAX_FIELD_ARRAY_SIZE 1024
4848 #define MAX_FIELD_ARG_NAME 256
4949
50−#define MAX_BPF_COPY_SIZE PAGE_SIZE
51−#define MAX_STACK_BPF_DATA 512
52−
5350 static char *register_page_data;
5451
5552 static DEFINE_MUTEX(reg_mutex);
@@ -410,19 +407,6 @@ parse: · 354 unmodified lines
410407 type[0] != 'u', FILTER_OTHER);
411408 }
412409
413−static void user_event_parse_flags(struct user_event *user, char *flags)
414−{
415− char *flag;
416−
417− if (flags == NULL)
418− return;
419−
420− while ((flag = strsep(&flags, ",")) != NULL) {
421− if (strcmp(flag, "BPF_ITER") == 0)
422− user->flags |= FLAG_BPF_ITER;
423− }
424−}
425−
426410 static int user_event_parse_fields(struct user_event *user, char *args)
427411 {
428412 char *field;
@@ -718,64 +702,14 @@ discard: · 289 unmodified lines
718702 }
719703
720704 #ifdef CONFIG_PERF_EVENTS
721−static void user_event_bpf(struct user_event *user, struct iov_iter *i)
722−{
723− struct user_bpf_context context;
724− struct user_bpf_iter bpf_i;
725− char fast_data[MAX_STACK_BPF_DATA];
726− void *temp = NULL;
727−
728− if ((user->flags & FLAG_BPF_ITER) && iter_is_iovec(i)) {
729− /* Raw iterator */
730− context.data_type = USER_BPF_DATA_ITER;
731− context.data_len = i->count;
732− context.iter = &bpf_i;
733−
734− bpf_i.iov_offset = i->iov_offset;
735− bpf_i.iov = i->iov;
736− bpf_i.nr_segs = i->nr_segs;
737− } else if (i->nr_segs == 1 && iter_is_iovec(i)) {
738− /* Single buffer from user */
739− context.data_type = USER_BPF_DATA_USER;
740− context.data_len = i->count;
741− context.udata = i->iov->iov_base + i->iov_offset;
742− } else {
743− /* Multi buffer from user */
744− struct iov_iter copy = *i;
745− size_t copy_size = min_t(size_t, i->count, MAX_BPF_COPY_SIZE);
746−
747− context.data_type = USER_BPF_DATA_KERNEL;
748− context.kdata = fast_data;
749−
750− if (unlikely(copy_size > sizeof(fast_data))) {
751− temp = kmalloc(copy_size, GFP_NOWAIT);
752−
753− if (temp)
754− context.kdata = temp;
755− else
756− copy_size = sizeof(fast_data);
757− }
758−
759− context.data_len = copy_nofault(context.kdata,
760− copy_size, &copy);
761− }
762−
763− trace_call_bpf(&user->call, &context);
764−
765− kfree(temp);
766−}
767−
768705 /*
769− * Writes the user supplied payload out to perf ring buffer or eBPF program.
706+ * Writes the user supplied payload out to perf ring buffer.
770707 */
771708 static void user_event_perf(struct user_event *user, struct iov_iter *i,
772709 void *tpdata, bool *faulted)
773710 {
774711 struct hlist_head *perf_head;
775712
776− if (bpf_prog_array_valid(&user->call))
777− user_event_bpf(user, i);
778−
779713 perf_head = this_cpu_ptr(user->call.perf_events);
780714
781715 if (perf_head && !hlist_empty(perf_head)) {
@@ -1141,8 +1075,6 @@ static int user_event_parse(char *name, char *args, char *flags, · 359 unmodified lines
11411075
11421076 user->tracepoint.name = name;
11431077
1144− user_event_parse_flags(user, flags);
1145−
11461078 ret = user_event_parse_fields(user, args);
11471079
11481080 if (ret)
@@ -1170,11 +1102,11 @@ static int user_event_parse(char *name, char *args, char *flags, · 21 unmodified lines
11701102 #endif
11711103
11721104 mutex_lock(&event_mutex);
1105+
11731106 ret = user_event_trace_register(user);
1174− mutex_unlock(&event_mutex);
11751107
11761108 if (ret)
1177− goto put_user;
1109+ goto put_user_lock;
11781110
11791111 user->index = index;
11801112
@@ -1186,8 +1118,12 @@ static int user_event_parse(char *name, char *args, char *flags, · 5 unmodified lines
11861118 set_bit(user->index, page_bitmap);
11871119 hash_add(register_table, &user->node, key);
11881120
1121+ mutex_unlock(&event_mutex);
1122+
11891123 *newuser = user;
11901124 return 0;
1125+put_user_lock:
1126+ mutex_unlock(&event_mutex);
11911127 put_user:
11921128 user_event_destroy_fields(user);
11931129 user_event_destroy_validators(user);
@@ -1580,9 +1516,6 @@ static int user_seq_show(struct seq_file *m, void *p) · 386 unmodified lines
15801516 busy++;
15811517 }
15821518
1583− if (flags & FLAG_BPF_ITER)
1584− seq_puts(m, " FLAG:BPF_ITER");
1585−
15861519 seq_puts(m, "\n");
15871520 active++;
15881521 }