1 // SPDX-License-Identifier: GPL-2.0
3 * trace_events_synth - synthetic trace events
5 * Copyright (C) 2015, 2020 Tom Zanussi <tom.zanussi@linux.intel.com>
8 #include <linux/module.h>
9 #include <linux/kallsyms.h>
10 #include <linux/security.h>
11 #include <linux/mutex.h>
12 #include <linux/slab.h>
13 #include <linux/stacktrace.h>
14 #include <linux/rculist.h>
15 #include <linux/tracefs.h>
17 /* for gfp flag names */
18 #include <linux/trace_events.h>
19 #include <trace/events/mmflags.h>
21 #include "trace_synth.h"
23 static int create_synth_event(int argc
, const char **argv
);
24 static int synth_event_show(struct seq_file
*m
, struct dyn_event
*ev
);
25 static int synth_event_release(struct dyn_event
*ev
);
26 static bool synth_event_is_busy(struct dyn_event
*ev
);
27 static bool synth_event_match(const char *system
, const char *event
,
28 int argc
, const char **argv
, struct dyn_event
*ev
);
30 static struct dyn_event_operations synth_event_ops
= {
31 .create
= create_synth_event
,
32 .show
= synth_event_show
,
33 .is_busy
= synth_event_is_busy
,
34 .free
= synth_event_release
,
35 .match
= synth_event_match
,
38 static bool is_synth_event(struct dyn_event
*ev
)
40 return ev
->ops
== &synth_event_ops
;
43 static struct synth_event
*to_synth_event(struct dyn_event
*ev
)
45 return container_of(ev
, struct synth_event
, devent
);
48 static bool synth_event_is_busy(struct dyn_event
*ev
)
50 struct synth_event
*event
= to_synth_event(ev
);
52 return event
->ref
!= 0;
55 static bool synth_event_match(const char *system
, const char *event
,
56 int argc
, const char **argv
, struct dyn_event
*ev
)
58 struct synth_event
*sev
= to_synth_event(ev
);
60 return strcmp(sev
->name
, event
) == 0 &&
61 (!system
|| strcmp(system
, SYNTH_SYSTEM
) == 0);
64 struct synth_trace_event
{
65 struct trace_entry ent
;
69 static int synth_event_define_fields(struct trace_event_call
*call
)
71 struct synth_trace_event trace
;
72 int offset
= offsetof(typeof(trace
), fields
);
73 struct synth_event
*event
= call
->data
;
74 unsigned int i
, size
, n_u64
;
79 for (i
= 0, n_u64
= 0; i
< event
->n_fields
; i
++) {
80 size
= event
->fields
[i
]->size
;
81 is_signed
= event
->fields
[i
]->is_signed
;
82 type
= event
->fields
[i
]->type
;
83 name
= event
->fields
[i
]->name
;
84 ret
= trace_define_field(call
, type
, name
, offset
, size
,
85 is_signed
, FILTER_OTHER
);
89 event
->fields
[i
]->offset
= n_u64
;
91 if (event
->fields
[i
]->is_string
) {
92 offset
+= STR_VAR_LEN_MAX
;
93 n_u64
+= STR_VAR_LEN_MAX
/ sizeof(u64
);
95 offset
+= sizeof(u64
);
100 event
->n_u64
= n_u64
;
105 static bool synth_field_signed(char *type
)
107 if (str_has_prefix(type
, "u"))
109 if (strcmp(type
, "gfp_t") == 0)
115 static int synth_field_is_string(char *type
)
117 if (strstr(type
, "char[") != NULL
)
123 static int synth_field_string_size(char *type
)
125 char buf
[4], *end
, *start
;
129 start
= strstr(type
, "char[");
132 start
+= sizeof("char[") - 1;
134 end
= strchr(type
, ']');
135 if (!end
|| end
< start
)
142 strncpy(buf
, start
, len
);
145 err
= kstrtouint(buf
, 0, &size
);
149 if (size
> STR_VAR_LEN_MAX
)
155 static int synth_field_size(char *type
)
159 if (strcmp(type
, "s64") == 0)
161 else if (strcmp(type
, "u64") == 0)
163 else if (strcmp(type
, "s32") == 0)
165 else if (strcmp(type
, "u32") == 0)
167 else if (strcmp(type
, "s16") == 0)
169 else if (strcmp(type
, "u16") == 0)
171 else if (strcmp(type
, "s8") == 0)
173 else if (strcmp(type
, "u8") == 0)
175 else if (strcmp(type
, "char") == 0)
177 else if (strcmp(type
, "unsigned char") == 0)
178 size
= sizeof(unsigned char);
179 else if (strcmp(type
, "int") == 0)
181 else if (strcmp(type
, "unsigned int") == 0)
182 size
= sizeof(unsigned int);
183 else if (strcmp(type
, "long") == 0)
185 else if (strcmp(type
, "unsigned long") == 0)
186 size
= sizeof(unsigned long);
187 else if (strcmp(type
, "pid_t") == 0)
188 size
= sizeof(pid_t
);
189 else if (strcmp(type
, "gfp_t") == 0)
190 size
= sizeof(gfp_t
);
191 else if (synth_field_is_string(type
))
192 size
= synth_field_string_size(type
);
197 static const char *synth_field_fmt(char *type
)
199 const char *fmt
= "%llu";
201 if (strcmp(type
, "s64") == 0)
203 else if (strcmp(type
, "u64") == 0)
205 else if (strcmp(type
, "s32") == 0)
207 else if (strcmp(type
, "u32") == 0)
209 else if (strcmp(type
, "s16") == 0)
211 else if (strcmp(type
, "u16") == 0)
213 else if (strcmp(type
, "s8") == 0)
215 else if (strcmp(type
, "u8") == 0)
217 else if (strcmp(type
, "char") == 0)
219 else if (strcmp(type
, "unsigned char") == 0)
221 else if (strcmp(type
, "int") == 0)
223 else if (strcmp(type
, "unsigned int") == 0)
225 else if (strcmp(type
, "long") == 0)
227 else if (strcmp(type
, "unsigned long") == 0)
229 else if (strcmp(type
, "pid_t") == 0)
231 else if (strcmp(type
, "gfp_t") == 0)
233 else if (synth_field_is_string(type
))
239 static void print_synth_event_num_val(struct trace_seq
*s
,
240 char *print_fmt
, char *name
,
241 int size
, u64 val
, char *space
)
245 trace_seq_printf(s
, print_fmt
, name
, (u8
)val
, space
);
249 trace_seq_printf(s
, print_fmt
, name
, (u16
)val
, space
);
253 trace_seq_printf(s
, print_fmt
, name
, (u32
)val
, space
);
257 trace_seq_printf(s
, print_fmt
, name
, val
, space
);
262 static enum print_line_t
print_synth_event(struct trace_iterator
*iter
,
264 struct trace_event
*event
)
266 struct trace_array
*tr
= iter
->tr
;
267 struct trace_seq
*s
= &iter
->seq
;
268 struct synth_trace_event
*entry
;
269 struct synth_event
*se
;
270 unsigned int i
, n_u64
;
274 entry
= (struct synth_trace_event
*)iter
->ent
;
275 se
= container_of(event
, struct synth_event
, call
.event
);
277 trace_seq_printf(s
, "%s: ", se
->name
);
279 for (i
= 0, n_u64
= 0; i
< se
->n_fields
; i
++) {
280 if (trace_seq_has_overflowed(s
))
283 fmt
= synth_field_fmt(se
->fields
[i
]->type
);
285 /* parameter types */
286 if (tr
&& tr
->trace_flags
& TRACE_ITER_VERBOSE
)
287 trace_seq_printf(s
, "%s ", fmt
);
289 snprintf(print_fmt
, sizeof(print_fmt
), "%%s=%s%%s", fmt
);
291 /* parameter values */
292 if (se
->fields
[i
]->is_string
) {
293 trace_seq_printf(s
, print_fmt
, se
->fields
[i
]->name
,
294 (char *)&entry
->fields
[n_u64
],
295 i
== se
->n_fields
- 1 ? "" : " ");
296 n_u64
+= STR_VAR_LEN_MAX
/ sizeof(u64
);
298 struct trace_print_flags __flags
[] = {
299 __def_gfpflag_names
, {-1, NULL
} };
300 char *space
= (i
== se
->n_fields
- 1 ? "" : " ");
302 print_synth_event_num_val(s
, print_fmt
,
305 entry
->fields
[n_u64
],
308 if (strcmp(se
->fields
[i
]->type
, "gfp_t") == 0) {
309 trace_seq_puts(s
, " (");
310 trace_print_flags_seq(s
, "|",
311 entry
->fields
[n_u64
],
313 trace_seq_putc(s
, ')');
319 trace_seq_putc(s
, '\n');
321 return trace_handle_return(s
);
324 static struct trace_event_functions synth_event_funcs
= {
325 .trace
= print_synth_event
328 static notrace
void trace_event_raw_event_synth(void *__data
,
330 unsigned int *var_ref_idx
)
332 struct trace_event_file
*trace_file
= __data
;
333 struct synth_trace_event
*entry
;
334 struct trace_event_buffer fbuffer
;
335 struct trace_buffer
*buffer
;
336 struct synth_event
*event
;
337 unsigned int i
, n_u64
, val_idx
;
340 event
= trace_file
->event_call
->data
;
342 if (trace_trigger_soft_disabled(trace_file
))
345 fields_size
= event
->n_u64
* sizeof(u64
);
348 * Avoid ring buffer recursion detection, as this event
349 * is being performed within another event.
351 buffer
= trace_file
->tr
->array_buffer
.buffer
;
352 ring_buffer_nest_start(buffer
);
354 entry
= trace_event_buffer_reserve(&fbuffer
, trace_file
,
355 sizeof(*entry
) + fields_size
);
359 for (i
= 0, n_u64
= 0; i
< event
->n_fields
; i
++) {
360 val_idx
= var_ref_idx
[i
];
361 if (event
->fields
[i
]->is_string
) {
362 char *str_val
= (char *)(long)var_ref_vals
[val_idx
];
363 char *str_field
= (char *)&entry
->fields
[n_u64
];
365 strscpy(str_field
, str_val
, STR_VAR_LEN_MAX
);
366 n_u64
+= STR_VAR_LEN_MAX
/ sizeof(u64
);
368 struct synth_field
*field
= event
->fields
[i
];
369 u64 val
= var_ref_vals
[val_idx
];
371 switch (field
->size
) {
373 *(u8
*)&entry
->fields
[n_u64
] = (u8
)val
;
377 *(u16
*)&entry
->fields
[n_u64
] = (u16
)val
;
381 *(u32
*)&entry
->fields
[n_u64
] = (u32
)val
;
385 entry
->fields
[n_u64
] = val
;
392 trace_event_buffer_commit(&fbuffer
);
394 ring_buffer_nest_end(buffer
);
397 static void free_synth_event_print_fmt(struct trace_event_call
*call
)
400 kfree(call
->print_fmt
);
401 call
->print_fmt
= NULL
;
405 static int __set_synth_event_print_fmt(struct synth_event
*event
,
412 /* When len=0, we just calculate the needed length */
413 #define LEN_OR_ZERO (len ? len - pos : 0)
415 pos
+= snprintf(buf
+ pos
, LEN_OR_ZERO
, "\"");
416 for (i
= 0; i
< event
->n_fields
; i
++) {
417 fmt
= synth_field_fmt(event
->fields
[i
]->type
);
418 pos
+= snprintf(buf
+ pos
, LEN_OR_ZERO
, "%s=%s%s",
419 event
->fields
[i
]->name
, fmt
,
420 i
== event
->n_fields
- 1 ? "" : ", ");
422 pos
+= snprintf(buf
+ pos
, LEN_OR_ZERO
, "\"");
424 for (i
= 0; i
< event
->n_fields
; i
++) {
425 pos
+= snprintf(buf
+ pos
, LEN_OR_ZERO
,
426 ", REC->%s", event
->fields
[i
]->name
);
431 /* return the length of print_fmt */
435 static int set_synth_event_print_fmt(struct trace_event_call
*call
)
437 struct synth_event
*event
= call
->data
;
441 /* First: called with 0 length to calculate the needed length */
442 len
= __set_synth_event_print_fmt(event
, NULL
, 0);
444 print_fmt
= kmalloc(len
+ 1, GFP_KERNEL
);
448 /* Second: actually write the @print_fmt */
449 __set_synth_event_print_fmt(event
, print_fmt
, len
+ 1);
450 call
->print_fmt
= print_fmt
;
455 static void free_synth_field(struct synth_field
*field
)
462 static struct synth_field
*parse_synth_field(int argc
, const char **argv
,
465 struct synth_field
*field
;
466 const char *prefix
= NULL
, *field_type
= argv
[0], *field_name
, *array
;
469 if (field_type
[0] == ';')
472 if (!strcmp(field_type
, "unsigned")) {
474 return ERR_PTR(-EINVAL
);
475 prefix
= "unsigned ";
476 field_type
= argv
[1];
477 field_name
= argv
[2];
480 field_name
= argv
[1];
484 field
= kzalloc(sizeof(*field
), GFP_KERNEL
);
486 return ERR_PTR(-ENOMEM
);
488 len
= strlen(field_name
);
489 array
= strchr(field_name
, '[');
491 len
-= strlen(array
);
492 else if (field_name
[len
- 1] == ';')
495 field
->name
= kmemdup_nul(field_name
, len
, GFP_KERNEL
);
501 if (field_type
[0] == ';')
503 len
= strlen(field_type
) + 1;
505 len
+= strlen(array
);
507 len
+= strlen(prefix
);
509 field
->type
= kzalloc(len
, GFP_KERNEL
);
515 strcat(field
->type
, prefix
);
516 strcat(field
->type
, field_type
);
518 strcat(field
->type
, array
);
519 if (field
->type
[len
- 1] == ';')
520 field
->type
[len
- 1] = '\0';
523 field
->size
= synth_field_size(field
->type
);
529 if (synth_field_is_string(field
->type
))
530 field
->is_string
= true;
532 field
->is_signed
= synth_field_signed(field
->type
);
537 free_synth_field(field
);
538 field
= ERR_PTR(ret
);
542 static void free_synth_tracepoint(struct tracepoint
*tp
)
551 static struct tracepoint
*alloc_synth_tracepoint(char *name
)
553 struct tracepoint
*tp
;
555 tp
= kzalloc(sizeof(*tp
), GFP_KERNEL
);
557 return ERR_PTR(-ENOMEM
);
559 tp
->name
= kstrdup(name
, GFP_KERNEL
);
562 return ERR_PTR(-ENOMEM
);
568 struct synth_event
*find_synth_event(const char *name
)
570 struct dyn_event
*pos
;
571 struct synth_event
*event
;
573 for_each_dyn_event(pos
) {
574 if (!is_synth_event(pos
))
576 event
= to_synth_event(pos
);
577 if (strcmp(event
->name
, name
) == 0)
584 static struct trace_event_fields synth_event_fields_array
[] = {
585 { .type
= TRACE_FUNCTION_TYPE
,
586 .define_fields
= synth_event_define_fields
},
590 static int register_synth_event(struct synth_event
*event
)
592 struct trace_event_call
*call
= &event
->call
;
595 event
->call
.class = &event
->class;
596 event
->class.system
= kstrdup(SYNTH_SYSTEM
, GFP_KERNEL
);
597 if (!event
->class.system
) {
602 event
->tp
= alloc_synth_tracepoint(event
->name
);
603 if (IS_ERR(event
->tp
)) {
604 ret
= PTR_ERR(event
->tp
);
609 INIT_LIST_HEAD(&call
->class->fields
);
610 call
->event
.funcs
= &synth_event_funcs
;
611 call
->class->fields_array
= synth_event_fields_array
;
613 ret
= register_trace_event(&call
->event
);
618 call
->flags
= TRACE_EVENT_FL_TRACEPOINT
;
619 call
->class->reg
= trace_event_reg
;
620 call
->class->probe
= trace_event_raw_event_synth
;
622 call
->tp
= event
->tp
;
624 ret
= trace_add_event_call(call
);
626 pr_warn("Failed to register synthetic event: %s\n",
627 trace_event_name(call
));
631 ret
= set_synth_event_print_fmt(call
);
633 trace_remove_event_call(call
);
639 unregister_trace_event(&call
->event
);
643 static int unregister_synth_event(struct synth_event
*event
)
645 struct trace_event_call
*call
= &event
->call
;
648 ret
= trace_remove_event_call(call
);
653 static void free_synth_event(struct synth_event
*event
)
660 for (i
= 0; i
< event
->n_fields
; i
++)
661 free_synth_field(event
->fields
[i
]);
663 kfree(event
->fields
);
665 kfree(event
->class.system
);
666 free_synth_tracepoint(event
->tp
);
667 free_synth_event_print_fmt(&event
->call
);
671 static struct synth_event
*alloc_synth_event(const char *name
, int n_fields
,
672 struct synth_field
**fields
)
674 struct synth_event
*event
;
677 event
= kzalloc(sizeof(*event
), GFP_KERNEL
);
679 event
= ERR_PTR(-ENOMEM
);
683 event
->name
= kstrdup(name
, GFP_KERNEL
);
686 event
= ERR_PTR(-ENOMEM
);
690 event
->fields
= kcalloc(n_fields
, sizeof(*event
->fields
), GFP_KERNEL
);
691 if (!event
->fields
) {
692 free_synth_event(event
);
693 event
= ERR_PTR(-ENOMEM
);
697 dyn_event_init(&event
->devent
, &synth_event_ops
);
699 for (i
= 0; i
< n_fields
; i
++)
700 event
->fields
[i
] = fields
[i
];
702 event
->n_fields
= n_fields
;
707 static int synth_event_check_arg_fn(void *data
)
709 struct dynevent_arg_pair
*arg_pair
= data
;
712 size
= synth_field_size((char *)arg_pair
->lhs
);
714 return size
? 0 : -EINVAL
;
718 * synth_event_add_field - Add a new field to a synthetic event cmd
719 * @cmd: A pointer to the dynevent_cmd struct representing the new event
720 * @type: The type of the new field to add
721 * @name: The name of the new field to add
723 * Add a new field to a synthetic event cmd object. Field ordering is in
724 * the same order the fields are added.
726 * See synth_field_size() for available types. If field_name contains
727 * [n] the field is considered to be an array.
729 * Return: 0 if successful, error otherwise.
731 int synth_event_add_field(struct dynevent_cmd
*cmd
, const char *type
,
734 struct dynevent_arg_pair arg_pair
;
737 if (cmd
->type
!= DYNEVENT_TYPE_SYNTH
)
743 dynevent_arg_pair_init(&arg_pair
, 0, ';');
748 ret
= dynevent_arg_pair_add(cmd
, &arg_pair
, synth_event_check_arg_fn
);
752 if (++cmd
->n_fields
> SYNTH_FIELDS_MAX
)
757 EXPORT_SYMBOL_GPL(synth_event_add_field
);
760 * synth_event_add_field_str - Add a new field to a synthetic event cmd
761 * @cmd: A pointer to the dynevent_cmd struct representing the new event
762 * @type_name: The type and name of the new field to add, as a single string
764 * Add a new field to a synthetic event cmd object, as a single
765 * string. The @type_name string is expected to be of the form 'type
766 * name', which will be appended by ';'. No sanity checking is done -
767 * what's passed in is assumed to already be well-formed. Field
768 * ordering is in the same order the fields are added.
770 * See synth_field_size() for available types. If field_name contains
771 * [n] the field is considered to be an array.
773 * Return: 0 if successful, error otherwise.
775 int synth_event_add_field_str(struct dynevent_cmd
*cmd
, const char *type_name
)
777 struct dynevent_arg arg
;
780 if (cmd
->type
!= DYNEVENT_TYPE_SYNTH
)
786 dynevent_arg_init(&arg
, ';');
790 ret
= dynevent_arg_add(cmd
, &arg
, NULL
);
794 if (++cmd
->n_fields
> SYNTH_FIELDS_MAX
)
799 EXPORT_SYMBOL_GPL(synth_event_add_field_str
);
802 * synth_event_add_fields - Add multiple fields to a synthetic event cmd
803 * @cmd: A pointer to the dynevent_cmd struct representing the new event
804 * @fields: An array of type/name field descriptions
805 * @n_fields: The number of field descriptions contained in the fields array
807 * Add a new set of fields to a synthetic event cmd object. The event
808 * fields that will be defined for the event should be passed in as an
809 * array of struct synth_field_desc, and the number of elements in the
810 * array passed in as n_fields. Field ordering will retain the
811 * ordering given in the fields array.
813 * See synth_field_size() for available types. If field_name contains
814 * [n] the field is considered to be an array.
816 * Return: 0 if successful, error otherwise.
818 int synth_event_add_fields(struct dynevent_cmd
*cmd
,
819 struct synth_field_desc
*fields
,
820 unsigned int n_fields
)
825 for (i
= 0; i
< n_fields
; i
++) {
826 if (fields
[i
].type
== NULL
|| fields
[i
].name
== NULL
) {
831 ret
= synth_event_add_field(cmd
, fields
[i
].type
, fields
[i
].name
);
838 EXPORT_SYMBOL_GPL(synth_event_add_fields
);
841 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
842 * @cmd: A pointer to the dynevent_cmd struct representing the new event
843 * @name: The name of the synthetic event
844 * @mod: The module creating the event, NULL if not created from a module
845 * @args: Variable number of arg (pairs), one pair for each field
847 * NOTE: Users normally won't want to call this function directly, but
848 * rather use the synth_event_gen_cmd_start() wrapper, which
849 * automatically adds a NULL to the end of the arg list. If this
850 * function is used directly, make sure the last arg in the variable
853 * Generate a synthetic event command to be executed by
854 * synth_event_gen_cmd_end(). This function can be used to generate
855 * the complete command or only the first part of it; in the latter
856 * case, synth_event_add_field(), synth_event_add_field_str(), or
857 * synth_event_add_fields() can be used to add more fields following
860 * There should be an even number variable args, each pair consisting
861 * of a type followed by a field name.
863 * See synth_field_size() for available types. If field_name contains
864 * [n] the field is considered to be an array.
866 * Return: 0 if successful, error otherwise.
868 int __synth_event_gen_cmd_start(struct dynevent_cmd
*cmd
, const char *name
,
869 struct module
*mod
, ...)
871 struct dynevent_arg arg
;
875 cmd
->event_name
= name
;
876 cmd
->private_data
= mod
;
878 if (cmd
->type
!= DYNEVENT_TYPE_SYNTH
)
881 dynevent_arg_init(&arg
, 0);
883 ret
= dynevent_arg_add(cmd
, &arg
, NULL
);
889 const char *type
, *name
;
891 type
= va_arg(args
, const char *);
894 name
= va_arg(args
, const char *);
898 if (++cmd
->n_fields
> SYNTH_FIELDS_MAX
) {
903 ret
= synth_event_add_field(cmd
, type
, name
);
911 EXPORT_SYMBOL_GPL(__synth_event_gen_cmd_start
);
914 * synth_event_gen_cmd_array_start - Start synthetic event command from an array
915 * @cmd: A pointer to the dynevent_cmd struct representing the new event
916 * @name: The name of the synthetic event
917 * @fields: An array of type/name field descriptions
918 * @n_fields: The number of field descriptions contained in the fields array
920 * Generate a synthetic event command to be executed by
921 * synth_event_gen_cmd_end(). This function can be used to generate
922 * the complete command or only the first part of it; in the latter
923 * case, synth_event_add_field(), synth_event_add_field_str(), or
924 * synth_event_add_fields() can be used to add more fields following
927 * The event fields that will be defined for the event should be
928 * passed in as an array of struct synth_field_desc, and the number of
929 * elements in the array passed in as n_fields. Field ordering will
930 * retain the ordering given in the fields array.
932 * See synth_field_size() for available types. If field_name contains
933 * [n] the field is considered to be an array.
935 * Return: 0 if successful, error otherwise.
937 int synth_event_gen_cmd_array_start(struct dynevent_cmd
*cmd
, const char *name
,
939 struct synth_field_desc
*fields
,
940 unsigned int n_fields
)
942 struct dynevent_arg arg
;
946 cmd
->event_name
= name
;
947 cmd
->private_data
= mod
;
949 if (cmd
->type
!= DYNEVENT_TYPE_SYNTH
)
952 if (n_fields
> SYNTH_FIELDS_MAX
)
955 dynevent_arg_init(&arg
, 0);
957 ret
= dynevent_arg_add(cmd
, &arg
, NULL
);
961 for (i
= 0; i
< n_fields
; i
++) {
962 if (fields
[i
].type
== NULL
|| fields
[i
].name
== NULL
)
965 ret
= synth_event_add_field(cmd
, fields
[i
].type
, fields
[i
].name
);
972 EXPORT_SYMBOL_GPL(synth_event_gen_cmd_array_start
);
974 static int __create_synth_event(int argc
, const char *name
, const char **argv
)
976 struct synth_field
*field
, *fields
[SYNTH_FIELDS_MAX
];
977 struct synth_event
*event
= NULL
;
978 int i
, consumed
= 0, n_fields
= 0, ret
= 0;
982 * - Add synthetic event: <event_name> field[;field] ...
983 * - Remove synthetic event: !<event_name> field[;field] ...
984 * where 'field' = type field_name
987 if (name
[0] == '\0' || argc
< 1)
990 mutex_lock(&event_mutex
);
992 event
= find_synth_event(name
);
998 for (i
= 0; i
< argc
- 1; i
++) {
999 if (strcmp(argv
[i
], ";") == 0)
1001 if (n_fields
== SYNTH_FIELDS_MAX
) {
1006 field
= parse_synth_field(argc
- i
, &argv
[i
], &consumed
);
1007 if (IS_ERR(field
)) {
1008 ret
= PTR_ERR(field
);
1011 fields
[n_fields
++] = field
;
1015 if (i
< argc
&& strcmp(argv
[i
], ";") != 0) {
1020 event
= alloc_synth_event(name
, n_fields
, fields
);
1021 if (IS_ERR(event
)) {
1022 ret
= PTR_ERR(event
);
1026 ret
= register_synth_event(event
);
1028 dyn_event_add(&event
->devent
);
1030 free_synth_event(event
);
1032 mutex_unlock(&event_mutex
);
1036 for (i
= 0; i
< n_fields
; i
++)
1037 free_synth_field(fields
[i
]);
1043 * synth_event_create - Create a new synthetic event
1044 * @name: The name of the new sythetic event
1045 * @fields: An array of type/name field descriptions
1046 * @n_fields: The number of field descriptions contained in the fields array
1047 * @mod: The module creating the event, NULL if not created from a module
1049 * Create a new synthetic event with the given name under the
1050 * trace/events/synthetic/ directory. The event fields that will be
1051 * defined for the event should be passed in as an array of struct
1052 * synth_field_desc, and the number elements in the array passed in as
1053 * n_fields. Field ordering will retain the ordering given in the
1056 * If the new synthetic event is being created from a module, the mod
1057 * param must be non-NULL. This will ensure that the trace buffer
1058 * won't contain unreadable events.
1060 * The new synth event should be deleted using synth_event_delete()
1061 * function. The new synthetic event can be generated from modules or
1062 * other kernel code using trace_synth_event() and related functions.
1064 * Return: 0 if successful, error otherwise.
1066 int synth_event_create(const char *name
, struct synth_field_desc
*fields
,
1067 unsigned int n_fields
, struct module
*mod
)
1069 struct dynevent_cmd cmd
;
1073 buf
= kzalloc(MAX_DYNEVENT_CMD_LEN
, GFP_KERNEL
);
1077 synth_event_cmd_init(&cmd
, buf
, MAX_DYNEVENT_CMD_LEN
);
1079 ret
= synth_event_gen_cmd_array_start(&cmd
, name
, mod
,
1084 ret
= synth_event_gen_cmd_end(&cmd
);
1090 EXPORT_SYMBOL_GPL(synth_event_create
);
1092 static int destroy_synth_event(struct synth_event
*se
)
1099 ret
= unregister_synth_event(se
);
1101 dyn_event_remove(&se
->devent
);
1102 free_synth_event(se
);
1110 * synth_event_delete - Delete a synthetic event
1111 * @event_name: The name of the new sythetic event
1113 * Delete a synthetic event that was created with synth_event_create().
1115 * Return: 0 if successful, error otherwise.
1117 int synth_event_delete(const char *event_name
)
1119 struct synth_event
*se
= NULL
;
1120 struct module
*mod
= NULL
;
1123 mutex_lock(&event_mutex
);
1124 se
= find_synth_event(event_name
);
1127 ret
= destroy_synth_event(se
);
1129 mutex_unlock(&event_mutex
);
1132 mutex_lock(&trace_types_lock
);
1134 * It is safest to reset the ring buffer if the module
1135 * being unloaded registered any events that were
1136 * used. The only worry is if a new module gets
1137 * loaded, and takes on the same id as the events of
1138 * this module. When printing out the buffer, traced
1139 * events left over from this module may be passed to
1140 * the new module events and unexpected results may
1143 tracing_reset_all_online_cpus();
1144 mutex_unlock(&trace_types_lock
);
1149 EXPORT_SYMBOL_GPL(synth_event_delete
);
1151 static int create_or_delete_synth_event(int argc
, char **argv
)
1153 const char *name
= argv
[0];
1156 /* trace_run_command() ensures argc != 0 */
1157 if (name
[0] == '!') {
1158 ret
= synth_event_delete(name
+ 1);
1162 ret
= __create_synth_event(argc
- 1, name
, (const char **)argv
+ 1);
1163 return ret
== -ECANCELED
? -EINVAL
: ret
;
1166 static int synth_event_run_command(struct dynevent_cmd
*cmd
)
1168 struct synth_event
*se
;
1171 ret
= trace_run_command(cmd
->seq
.buffer
, create_or_delete_synth_event
);
1175 se
= find_synth_event(cmd
->event_name
);
1179 se
->mod
= cmd
->private_data
;
1185 * synth_event_cmd_init - Initialize a synthetic event command object
1186 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1187 * @buf: A pointer to the buffer used to build the command
1188 * @maxlen: The length of the buffer passed in @buf
1190 * Initialize a synthetic event command object. Use this before
1191 * calling any of the other dyenvent_cmd functions.
1193 void synth_event_cmd_init(struct dynevent_cmd
*cmd
, char *buf
, int maxlen
)
1195 dynevent_cmd_init(cmd
, buf
, maxlen
, DYNEVENT_TYPE_SYNTH
,
1196 synth_event_run_command
);
1198 EXPORT_SYMBOL_GPL(synth_event_cmd_init
);
1201 __synth_event_trace_start(struct trace_event_file
*file
,
1202 struct synth_event_trace_state
*trace_state
)
1204 int entry_size
, fields_size
= 0;
1207 memset(trace_state
, '\0', sizeof(*trace_state
));
1210 * Normal event tracing doesn't get called at all unless the
1211 * ENABLED bit is set (which attaches the probe thus allowing
1212 * this code to be called, etc). Because this is called
1213 * directly by the user, we don't have that but we still need
1214 * to honor not logging when disabled. For the the iterated
1215 * trace case, we save the enabed state upon start and just
1216 * ignore the following data calls.
1218 if (!(file
->flags
& EVENT_FILE_FL_ENABLED
) ||
1219 trace_trigger_soft_disabled(file
)) {
1220 trace_state
->disabled
= true;
1225 trace_state
->event
= file
->event_call
->data
;
1227 fields_size
= trace_state
->event
->n_u64
* sizeof(u64
);
1230 * Avoid ring buffer recursion detection, as this event
1231 * is being performed within another event.
1233 trace_state
->buffer
= file
->tr
->array_buffer
.buffer
;
1234 ring_buffer_nest_start(trace_state
->buffer
);
1236 entry_size
= sizeof(*trace_state
->entry
) + fields_size
;
1237 trace_state
->entry
= trace_event_buffer_reserve(&trace_state
->fbuffer
,
1240 if (!trace_state
->entry
) {
1241 ring_buffer_nest_end(trace_state
->buffer
);
1249 __synth_event_trace_end(struct synth_event_trace_state
*trace_state
)
1251 trace_event_buffer_commit(&trace_state
->fbuffer
);
1253 ring_buffer_nest_end(trace_state
->buffer
);
1257 * synth_event_trace - Trace a synthetic event
1258 * @file: The trace_event_file representing the synthetic event
1259 * @n_vals: The number of values in vals
1260 * @args: Variable number of args containing the event values
1262 * Trace a synthetic event using the values passed in the variable
1265 * The argument list should be a list 'n_vals' u64 values. The number
1266 * of vals must match the number of field in the synthetic event, and
1267 * must be in the same order as the synthetic event fields.
1269 * All vals should be cast to u64, and string vals are just pointers
1270 * to strings, cast to u64. Strings will be copied into space
1271 * reserved in the event for the string, using these pointers.
1273 * Return: 0 on success, err otherwise.
1275 int synth_event_trace(struct trace_event_file
*file
, unsigned int n_vals
, ...)
1277 struct synth_event_trace_state state
;
1278 unsigned int i
, n_u64
;
1282 ret
= __synth_event_trace_start(file
, &state
);
1285 ret
= 0; /* just disabled, not really an error */
1289 if (n_vals
!= state
.event
->n_fields
) {
1294 va_start(args
, n_vals
);
1295 for (i
= 0, n_u64
= 0; i
< state
.event
->n_fields
; i
++) {
1298 val
= va_arg(args
, u64
);
1300 if (state
.event
->fields
[i
]->is_string
) {
1301 char *str_val
= (char *)(long)val
;
1302 char *str_field
= (char *)&state
.entry
->fields
[n_u64
];
1304 strscpy(str_field
, str_val
, STR_VAR_LEN_MAX
);
1305 n_u64
+= STR_VAR_LEN_MAX
/ sizeof(u64
);
1307 struct synth_field
*field
= state
.event
->fields
[i
];
1309 switch (field
->size
) {
1311 *(u8
*)&state
.entry
->fields
[n_u64
] = (u8
)val
;
1315 *(u16
*)&state
.entry
->fields
[n_u64
] = (u16
)val
;
1319 *(u32
*)&state
.entry
->fields
[n_u64
] = (u32
)val
;
1323 state
.entry
->fields
[n_u64
] = val
;
1331 __synth_event_trace_end(&state
);
1335 EXPORT_SYMBOL_GPL(synth_event_trace
);
1338 * synth_event_trace_array - Trace a synthetic event from an array
1339 * @file: The trace_event_file representing the synthetic event
1340 * @vals: Array of values
1341 * @n_vals: The number of values in vals
1343 * Trace a synthetic event using the values passed in as 'vals'.
1345 * The 'vals' array is just an array of 'n_vals' u64. The number of
1346 * vals must match the number of field in the synthetic event, and
1347 * must be in the same order as the synthetic event fields.
1349 * All vals should be cast to u64, and string vals are just pointers
1350 * to strings, cast to u64. Strings will be copied into space
1351 * reserved in the event for the string, using these pointers.
1353 * Return: 0 on success, err otherwise.
1355 int synth_event_trace_array(struct trace_event_file
*file
, u64
*vals
,
1356 unsigned int n_vals
)
1358 struct synth_event_trace_state state
;
1359 unsigned int i
, n_u64
;
1362 ret
= __synth_event_trace_start(file
, &state
);
1365 ret
= 0; /* just disabled, not really an error */
1369 if (n_vals
!= state
.event
->n_fields
) {
1374 for (i
= 0, n_u64
= 0; i
< state
.event
->n_fields
; i
++) {
1375 if (state
.event
->fields
[i
]->is_string
) {
1376 char *str_val
= (char *)(long)vals
[i
];
1377 char *str_field
= (char *)&state
.entry
->fields
[n_u64
];
1379 strscpy(str_field
, str_val
, STR_VAR_LEN_MAX
);
1380 n_u64
+= STR_VAR_LEN_MAX
/ sizeof(u64
);
1382 struct synth_field
*field
= state
.event
->fields
[i
];
1385 switch (field
->size
) {
1387 *(u8
*)&state
.entry
->fields
[n_u64
] = (u8
)val
;
1391 *(u16
*)&state
.entry
->fields
[n_u64
] = (u16
)val
;
1395 *(u32
*)&state
.entry
->fields
[n_u64
] = (u32
)val
;
1399 state
.entry
->fields
[n_u64
] = val
;
1406 __synth_event_trace_end(&state
);
1410 EXPORT_SYMBOL_GPL(synth_event_trace_array
);
1413 * synth_event_trace_start - Start piecewise synthetic event trace
1414 * @file: The trace_event_file representing the synthetic event
1415 * @trace_state: A pointer to object tracking the piecewise trace state
1417 * Start the trace of a synthetic event field-by-field rather than all
1420 * This function 'opens' an event trace, which means space is reserved
1421 * for the event in the trace buffer, after which the event's
1422 * individual field values can be set through either
1423 * synth_event_add_next_val() or synth_event_add_val().
1425 * A pointer to a trace_state object is passed in, which will keep
1426 * track of the current event trace state until the event trace is
1427 * closed (and the event finally traced) using
1428 * synth_event_trace_end().
1430 * Note that synth_event_trace_end() must be called after all values
1431 * have been added for each event trace, regardless of whether adding
1432 * all field values succeeded or not.
1434 * Note also that for a given event trace, all fields must be added
1435 * using either synth_event_add_next_val() or synth_event_add_val()
1436 * but not both together or interleaved.
1438 * Return: 0 on success, err otherwise.
1440 int synth_event_trace_start(struct trace_event_file
*file
,
1441 struct synth_event_trace_state
*trace_state
)
1448 ret
= __synth_event_trace_start(file
, trace_state
);
1450 ret
= 0; /* just disabled, not really an error */
1454 EXPORT_SYMBOL_GPL(synth_event_trace_start
);
1456 static int __synth_event_add_val(const char *field_name
, u64 val
,
1457 struct synth_event_trace_state
*trace_state
)
1459 struct synth_field
*field
= NULL
;
1460 struct synth_trace_event
*entry
;
1461 struct synth_event
*event
;
1469 /* can't mix add_next_synth_val() with add_synth_val() */
1471 if (trace_state
->add_next
) {
1475 trace_state
->add_name
= true;
1477 if (trace_state
->add_name
) {
1481 trace_state
->add_next
= true;
1484 if (trace_state
->disabled
)
1487 event
= trace_state
->event
;
1488 if (trace_state
->add_name
) {
1489 for (i
= 0; i
< event
->n_fields
; i
++) {
1490 field
= event
->fields
[i
];
1491 if (strcmp(field
->name
, field_name
) == 0)
1499 if (trace_state
->cur_field
>= event
->n_fields
) {
1503 field
= event
->fields
[trace_state
->cur_field
++];
1506 entry
= trace_state
->entry
;
1507 if (field
->is_string
) {
1508 char *str_val
= (char *)(long)val
;
1516 str_field
= (char *)&entry
->fields
[field
->offset
];
1517 strscpy(str_field
, str_val
, STR_VAR_LEN_MAX
);
1519 switch (field
->size
) {
1521 *(u8
*)&trace_state
->entry
->fields
[field
->offset
] = (u8
)val
;
1525 *(u16
*)&trace_state
->entry
->fields
[field
->offset
] = (u16
)val
;
1529 *(u32
*)&trace_state
->entry
->fields
[field
->offset
] = (u32
)val
;
1533 trace_state
->entry
->fields
[field
->offset
] = val
;
1542 * synth_event_add_next_val - Add the next field's value to an open synth trace
1543 * @val: The value to set the next field to
1544 * @trace_state: A pointer to object tracking the piecewise trace state
1546 * Set the value of the next field in an event that's been opened by
1547 * synth_event_trace_start().
1549 * The val param should be the value cast to u64. If the value points
1550 * to a string, the val param should be a char * cast to u64.
1552 * This function assumes all the fields in an event are to be set one
1553 * after another - successive calls to this function are made, one for
1554 * each field, in the order of the fields in the event, until all
1555 * fields have been set. If you'd rather set each field individually
1556 * without regard to ordering, synth_event_add_val() can be used
1559 * Note however that synth_event_add_next_val() and
1560 * synth_event_add_val() can't be intermixed for a given event trace -
1561 * one or the other but not both can be used at the same time.
1563 * Note also that synth_event_trace_end() must be called after all
1564 * values have been added for each event trace, regardless of whether
1565 * adding all field values succeeded or not.
1567 * Return: 0 on success, err otherwise.
1569 int synth_event_add_next_val(u64 val
,
1570 struct synth_event_trace_state
*trace_state
)
1572 return __synth_event_add_val(NULL
, val
, trace_state
);
1574 EXPORT_SYMBOL_GPL(synth_event_add_next_val
);
1577 * synth_event_add_val - Add a named field's value to an open synth trace
1578 * @field_name: The name of the synthetic event field value to set
1579 * @val: The value to set the next field to
1580 * @trace_state: A pointer to object tracking the piecewise trace state
1582 * Set the value of the named field in an event that's been opened by
1583 * synth_event_trace_start().
1585 * The val param should be the value cast to u64. If the value points
1586 * to a string, the val param should be a char * cast to u64.
1588 * This function looks up the field name, and if found, sets the field
1589 * to the specified value. This lookup makes this function more
1590 * expensive than synth_event_add_next_val(), so use that or the
1591 * none-piecewise synth_event_trace() instead if efficiency is more
1594 * Note however that synth_event_add_next_val() and
1595 * synth_event_add_val() can't be intermixed for a given event trace -
1596 * one or the other but not both can be used at the same time.
1598 * Note also that synth_event_trace_end() must be called after all
1599 * values have been added for each event trace, regardless of whether
1600 * adding all field values succeeded or not.
1602 * Return: 0 on success, err otherwise.
1604 int synth_event_add_val(const char *field_name
, u64 val
,
1605 struct synth_event_trace_state
*trace_state
)
1607 return __synth_event_add_val(field_name
, val
, trace_state
);
1609 EXPORT_SYMBOL_GPL(synth_event_add_val
);
1612 * synth_event_trace_end - End piecewise synthetic event trace
1613 * @trace_state: A pointer to object tracking the piecewise trace state
1615 * End the trace of a synthetic event opened by
1616 * synth_event_trace__start().
1618 * This function 'closes' an event trace, which basically means that
1619 * it commits the reserved event and cleans up other loose ends.
1621 * A pointer to a trace_state object is passed in, which will keep
1622 * track of the current event trace state opened with
1623 * synth_event_trace_start().
1625 * Note that this function must be called after all values have been
1626 * added for each event trace, regardless of whether adding all field
1627 * values succeeded or not.
1629 * Return: 0 on success, err otherwise.
1631 int synth_event_trace_end(struct synth_event_trace_state
*trace_state
)
1636 __synth_event_trace_end(trace_state
);
1640 EXPORT_SYMBOL_GPL(synth_event_trace_end
);
1642 static int create_synth_event(int argc
, const char **argv
)
1644 const char *name
= argv
[0];
1647 if (name
[0] != 's' || name
[1] != ':')
1651 /* This interface accepts group name prefix */
1652 if (strchr(name
, '/')) {
1653 len
= str_has_prefix(name
, SYNTH_SYSTEM
"/");
1658 return __create_synth_event(argc
- 1, name
, argv
+ 1);
1661 static int synth_event_release(struct dyn_event
*ev
)
1663 struct synth_event
*event
= to_synth_event(ev
);
1669 ret
= unregister_synth_event(event
);
1673 dyn_event_remove(ev
);
1674 free_synth_event(event
);
1678 static int __synth_event_show(struct seq_file
*m
, struct synth_event
*event
)
1680 struct synth_field
*field
;
1683 seq_printf(m
, "%s\t", event
->name
);
1685 for (i
= 0; i
< event
->n_fields
; i
++) {
1686 field
= event
->fields
[i
];
1688 /* parameter values */
1689 seq_printf(m
, "%s %s%s", field
->type
, field
->name
,
1690 i
== event
->n_fields
- 1 ? "" : "; ");
1698 static int synth_event_show(struct seq_file
*m
, struct dyn_event
*ev
)
1700 struct synth_event
*event
= to_synth_event(ev
);
1702 seq_printf(m
, "s:%s/", event
->class.system
);
1704 return __synth_event_show(m
, event
);
1707 static int synth_events_seq_show(struct seq_file
*m
, void *v
)
1709 struct dyn_event
*ev
= v
;
1711 if (!is_synth_event(ev
))
1714 return __synth_event_show(m
, to_synth_event(ev
));
1717 static const struct seq_operations synth_events_seq_op
= {
1718 .start
= dyn_event_seq_start
,
1719 .next
= dyn_event_seq_next
,
1720 .stop
= dyn_event_seq_stop
,
1721 .show
= synth_events_seq_show
,
1724 static int synth_events_open(struct inode
*inode
, struct file
*file
)
1728 ret
= security_locked_down(LOCKDOWN_TRACEFS
);
1732 if ((file
->f_mode
& FMODE_WRITE
) && (file
->f_flags
& O_TRUNC
)) {
1733 ret
= dyn_events_release_all(&synth_event_ops
);
1738 return seq_open(file
, &synth_events_seq_op
);
1741 static ssize_t
synth_events_write(struct file
*file
,
1742 const char __user
*buffer
,
1743 size_t count
, loff_t
*ppos
)
1745 return trace_parse_run_command(file
, buffer
, count
, ppos
,
1746 create_or_delete_synth_event
);
1749 static const struct file_operations synth_events_fops
= {
1750 .open
= synth_events_open
,
1751 .write
= synth_events_write
,
1753 .llseek
= seq_lseek
,
1754 .release
= seq_release
,
1757 static __init
int trace_events_synth_init(void)
1759 struct dentry
*entry
= NULL
;
1760 struct dentry
*d_tracer
;
1763 err
= dyn_event_register(&synth_event_ops
);
1765 pr_warn("Could not register synth_event_ops\n");
1769 d_tracer
= tracing_init_dentry();
1770 if (IS_ERR(d_tracer
)) {
1771 err
= PTR_ERR(d_tracer
);
1775 entry
= tracefs_create_file("synthetic_events", 0644, d_tracer
,
1776 NULL
, &synth_events_fops
);
1784 pr_warn("Could not create tracefs 'synthetic_events' entry\n");
1789 fs_initcall(trace_events_synth_init
);