Lines Matching +full:event +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
3 * trace_events_synth - synthetic trace events
25 C(BAD_NAME, "Illegal name"), \
26 C(INVALID_CMD, "Command must be of the form: <name> field[;field] ..."),\
27 C(INVALID_DYN_CMD, "Command must be of the form: s or -:[synthetic/]<name> field[;field] ..."),\
28 C(EVENT_EXISTS, "Event already exists"), \
57 strncpy(last_cmd, str, MAX_FILTER_STR_VAL - 1); in last_cmd_set()
70 static bool synth_event_match(const char *system, const char *event,
83 return ev->ops == &synth_event_ops; in is_synth_event()
93 struct synth_event *event = to_synth_event(ev); in synth_event_is_busy() local
95 return event->ref != 0; in synth_event_is_busy()
98 static bool synth_event_match(const char *system, const char *event, in synth_event_match() argument
103 return strcmp(sev->name, event) == 0 && in synth_event_match()
116 struct synth_event *event = call->data; in synth_event_define_fields() local
118 char *name, *type; in synth_event_define_fields() local
122 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in synth_event_define_fields()
123 size = event->fields[i]->size; in synth_event_define_fields()
124 is_signed = event->fields[i]->is_signed; in synth_event_define_fields()
125 type = event->fields[i]->type; in synth_event_define_fields()
126 name = event->fields[i]->name; in synth_event_define_fields()
127 ret = trace_define_field(call, type, name, offset, size, in synth_event_define_fields()
132 event->fields[i]->offset = n_u64; in synth_event_define_fields()
134 if (event->fields[i]->is_string && !event->fields[i]->is_dynamic) { in synth_event_define_fields()
143 event->n_u64 = n_u64; in synth_event_define_fields()
174 return -EINVAL; in synth_field_string_size()
175 start += sizeof("char[") - 1; in synth_field_string_size()
179 return -EINVAL; in synth_field_string_size()
181 len = end - start; in synth_field_string_size()
183 return -EINVAL; in synth_field_string_size()
186 return 0; /* variable-length string */ in synth_field_string_size()
196 return -EINVAL; in synth_field_string_size()
290 char *print_fmt, char *name, in print_synth_event_num_val() argument
295 trace_seq_printf(s, print_fmt, name, (u8)val, space); in print_synth_event_num_val()
299 trace_seq_printf(s, print_fmt, name, (u16)val, space); in print_synth_event_num_val()
303 trace_seq_printf(s, print_fmt, name, (u32)val, space); in print_synth_event_num_val()
307 trace_seq_printf(s, print_fmt, name, val, space); in print_synth_event_num_val()
314 struct trace_event *event) in print_synth_event() argument
316 struct trace_array *tr = iter->tr; in print_synth_event()
317 struct trace_seq *s = &iter->seq; in print_synth_event()
324 entry = (struct synth_trace_event *)iter->ent; in print_synth_event()
325 se = container_of(event, struct synth_event, call.event); in print_synth_event()
327 trace_seq_printf(s, "%s: ", se->name); in print_synth_event()
329 for (i = 0, n_u64 = 0; i < se->n_fields; i++) { in print_synth_event()
333 fmt = synth_field_fmt(se->fields[i]->type); in print_synth_event()
336 if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) in print_synth_event()
342 if (se->fields[i]->is_string) { in print_synth_event()
343 if (se->fields[i]->is_dynamic) { in print_synth_event()
347 offset = (u32)entry->fields[n_u64]; in print_synth_event()
352 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
355 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
358 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
360 (char *)&entry->fields[n_u64], in print_synth_event()
361 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
366 __def_gfpflag_names, {-1, NULL} }; in print_synth_event()
367 char *space = (i == se->n_fields - 1 ? "" : " "); in print_synth_event()
370 se->fields[i]->name, in print_synth_event()
371 se->fields[i]->size, in print_synth_event()
372 entry->fields[n_u64], in print_synth_event()
375 if (strcmp(se->fields[i]->type, "gfp_t") == 0) { in print_synth_event()
378 entry->fields[n_u64], in print_synth_event()
396 struct synth_event *event, in trace_string() argument
409 data_offset += event->n_u64 * sizeof(u64); in trace_string()
418 *(u32 *)&entry->fields[*n_u64] = data_offset; in trace_string()
422 str_field = (char *)&entry->fields[*n_u64]; in trace_string()
440 struct synth_event *event; in trace_event_raw_event_synth() local
443 event = trace_file->event_call->data; in trace_event_raw_event_synth()
448 fields_size = event->n_u64 * sizeof(u64); in trace_event_raw_event_synth()
450 for (i = 0; i < event->n_dynamic_fields; i++) { in trace_event_raw_event_synth()
451 unsigned int field_pos = event->dynamic_fields[i]->field_pos; in trace_event_raw_event_synth()
463 * Avoid ring buffer recursion detection, as this event in trace_event_raw_event_synth()
464 * is being performed within another event. in trace_event_raw_event_synth()
466 buffer = trace_file->tr->array_buffer.buffer; in trace_event_raw_event_synth()
474 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in trace_event_raw_event_synth()
476 if (event->fields[i]->is_string) { in trace_event_raw_event_synth()
479 len = trace_string(entry, event, str_val, in trace_event_raw_event_synth()
480 event->fields[i]->is_dynamic, in trace_event_raw_event_synth()
484 struct synth_field *field = event->fields[i]; in trace_event_raw_event_synth()
487 switch (field->size) { in trace_event_raw_event_synth()
489 *(u8 *)&entry->fields[n_u64] = (u8)val; in trace_event_raw_event_synth()
493 *(u16 *)&entry->fields[n_u64] = (u16)val; in trace_event_raw_event_synth()
497 *(u32 *)&entry->fields[n_u64] = (u32)val; in trace_event_raw_event_synth()
501 entry->fields[n_u64] = val; in trace_event_raw_event_synth()
516 kfree(call->print_fmt); in free_synth_event_print_fmt()
517 call->print_fmt = NULL; in free_synth_event_print_fmt()
521 static int __set_synth_event_print_fmt(struct synth_event *event, in __set_synth_event_print_fmt() argument
529 #define LEN_OR_ZERO (len ? len - pos : 0) in __set_synth_event_print_fmt()
532 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
533 fmt = synth_field_fmt(event->fields[i]->type); in __set_synth_event_print_fmt()
535 event->fields[i]->name, fmt, in __set_synth_event_print_fmt()
536 i == event->n_fields - 1 ? "" : ", "); in __set_synth_event_print_fmt()
540 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
541 if (event->fields[i]->is_string && in __set_synth_event_print_fmt()
542 event->fields[i]->is_dynamic) in __set_synth_event_print_fmt()
544 ", __get_str(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
547 ", REC->%s", event->fields[i]->name); in __set_synth_event_print_fmt()
558 struct synth_event *event = call->data; in set_synth_event_print_fmt() local
563 len = __set_synth_event_print_fmt(event, NULL, 0); in set_synth_event_print_fmt()
567 return -ENOMEM; in set_synth_event_print_fmt()
570 __set_synth_event_print_fmt(event, print_fmt, len + 1); in set_synth_event_print_fmt()
571 call->print_fmt = print_fmt; in set_synth_event_print_fmt()
578 kfree(field->type); in free_synth_field()
579 kfree(field->name); in free_synth_field()
587 * For backward compatibility, the old synthetic event command in check_field_version()
605 int len, ret = -ENOMEM; in parse_synth_field()
612 return ERR_PTR(-EINVAL); in parse_synth_field()
625 return ERR_PTR(-EINVAL); in parse_synth_field()
632 return ERR_PTR(-ENOMEM); in parse_synth_field()
637 len -= strlen(array); in parse_synth_field()
639 field->name = kmemdup_nul(field_name, len, GFP_KERNEL); in parse_synth_field()
640 if (!field->name) in parse_synth_field()
643 if (!is_good_name(field->name)) { in parse_synth_field()
645 ret = -EINVAL; in parse_synth_field()
657 field->type = kzalloc(len, GFP_KERNEL); in parse_synth_field()
658 if (!field->type) in parse_synth_field()
661 seq_buf_init(&s, field->type, len); in parse_synth_field()
672 size = synth_field_size(field->type); in parse_synth_field()
678 ret = -EINVAL; in parse_synth_field()
681 if (synth_field_is_string(field->type)) { in parse_synth_field()
684 len = sizeof("__data_loc ") + strlen(field->type) + 1; in parse_synth_field()
691 seq_buf_puts(&s, field->type); in parse_synth_field()
697 kfree(field->type); in parse_synth_field()
698 field->type = type; in parse_synth_field()
700 field->is_dynamic = true; in parse_synth_field()
704 ret = -EINVAL; in parse_synth_field()
708 field->size = size; in parse_synth_field()
710 if (synth_field_is_string(field->type)) in parse_synth_field()
711 field->is_string = true; in parse_synth_field()
713 field->is_signed = synth_field_signed(field->type); in parse_synth_field()
727 kfree(tp->name); in free_synth_tracepoint()
731 static struct tracepoint *alloc_synth_tracepoint(char *name) in alloc_synth_tracepoint() argument
737 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
739 tp->name = kstrdup(name, GFP_KERNEL); in alloc_synth_tracepoint()
740 if (!tp->name) { in alloc_synth_tracepoint()
742 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
748 struct synth_event *find_synth_event(const char *name) in find_synth_event() argument
751 struct synth_event *event; in find_synth_event() local
756 event = to_synth_event(pos); in find_synth_event()
757 if (strcmp(event->name, name) == 0) in find_synth_event()
758 return event; in find_synth_event()
770 static int register_synth_event(struct synth_event *event) in register_synth_event() argument
772 struct trace_event_call *call = &event->call; in register_synth_event()
775 event->call.class = &event->class; in register_synth_event()
776 event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL); in register_synth_event()
777 if (!event->class.system) { in register_synth_event()
778 ret = -ENOMEM; in register_synth_event()
782 event->tp = alloc_synth_tracepoint(event->name); in register_synth_event()
783 if (IS_ERR(event->tp)) { in register_synth_event()
784 ret = PTR_ERR(event->tp); in register_synth_event()
785 event->tp = NULL; in register_synth_event()
789 INIT_LIST_HEAD(&call->class->fields); in register_synth_event()
790 call->event.funcs = &synth_event_funcs; in register_synth_event()
791 call->class->fields_array = synth_event_fields_array; in register_synth_event()
793 ret = register_trace_event(&call->event); in register_synth_event()
795 ret = -ENODEV; in register_synth_event()
798 call->flags = TRACE_EVENT_FL_TRACEPOINT; in register_synth_event()
799 call->class->reg = trace_event_reg; in register_synth_event()
800 call->class->probe = trace_event_raw_event_synth; in register_synth_event()
801 call->data = event; in register_synth_event()
802 call->tp = event->tp; in register_synth_event()
806 pr_warn("Failed to register synthetic event: %s\n", in register_synth_event()
819 unregister_trace_event(&call->event); in register_synth_event()
823 static int unregister_synth_event(struct synth_event *event) in unregister_synth_event() argument
825 struct trace_event_call *call = &event->call; in unregister_synth_event()
833 static void free_synth_event(struct synth_event *event) in free_synth_event() argument
837 if (!event) in free_synth_event()
840 for (i = 0; i < event->n_fields; i++) in free_synth_event()
841 free_synth_field(event->fields[i]); in free_synth_event()
843 kfree(event->fields); in free_synth_event()
844 kfree(event->dynamic_fields); in free_synth_event()
845 kfree(event->name); in free_synth_event()
846 kfree(event->class.system); in free_synth_event()
847 free_synth_tracepoint(event->tp); in free_synth_event()
848 free_synth_event_print_fmt(&event->call); in free_synth_event()
849 kfree(event); in free_synth_event()
852 static struct synth_event *alloc_synth_event(const char *name, int n_fields, in alloc_synth_event() argument
856 struct synth_event *event; in alloc_synth_event() local
858 event = kzalloc(sizeof(*event), GFP_KERNEL); in alloc_synth_event()
859 if (!event) { in alloc_synth_event()
860 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
864 event->name = kstrdup(name, GFP_KERNEL); in alloc_synth_event()
865 if (!event->name) { in alloc_synth_event()
866 kfree(event); in alloc_synth_event()
867 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
871 event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL); in alloc_synth_event()
872 if (!event->fields) { in alloc_synth_event()
873 free_synth_event(event); in alloc_synth_event()
874 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
879 if (fields[i]->is_dynamic) in alloc_synth_event()
883 event->dynamic_fields = kcalloc(n_dynamic_fields, in alloc_synth_event()
884 sizeof(*event->dynamic_fields), in alloc_synth_event()
886 if (!event->dynamic_fields) { in alloc_synth_event()
887 free_synth_event(event); in alloc_synth_event()
888 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
893 dyn_event_init(&event->devent, &synth_event_ops); in alloc_synth_event()
896 fields[i]->field_pos = i; in alloc_synth_event()
897 event->fields[i] = fields[i]; in alloc_synth_event()
899 if (fields[i]->is_dynamic) in alloc_synth_event()
900 event->dynamic_fields[j++] = fields[i]; in alloc_synth_event()
902 event->n_dynamic_fields = j; in alloc_synth_event()
903 event->n_fields = n_fields; in alloc_synth_event()
905 return event; in alloc_synth_event()
913 size = synth_field_size((char *)arg_pair->lhs); in synth_event_check_arg_fn()
915 if (strstr((char *)arg_pair->lhs, "[")) in synth_event_check_arg_fn()
919 return size ? 0 : -EINVAL; in synth_event_check_arg_fn()
923 * synth_event_add_field - Add a new field to a synthetic event cmd
924 * @cmd: A pointer to the dynevent_cmd struct representing the new event
926 * @name: The name of the new field to add
928 * Add a new field to a synthetic event cmd object. Field ordering is in
937 const char *name) in synth_event_add_field() argument
942 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field()
943 return -EINVAL; in synth_event_add_field()
945 if (!type || !name) in synth_event_add_field()
946 return -EINVAL; in synth_event_add_field()
951 arg_pair.rhs = name; in synth_event_add_field()
957 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field()
958 ret = -EINVAL; in synth_event_add_field()
965 * synth_event_add_field_str - Add a new field to a synthetic event cmd
966 * @cmd: A pointer to the dynevent_cmd struct representing the new event
967 * @type_name: The type and name of the new field to add, as a single string
969 * Add a new field to a synthetic event cmd object, as a single
971 * name', which will be appended by ';'. No sanity checking is done -
972 * what's passed in is assumed to already be well-formed. Field
985 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field_str()
986 return -EINVAL; in synth_event_add_field_str()
989 return -EINVAL; in synth_event_add_field_str()
999 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field_str()
1000 ret = -EINVAL; in synth_event_add_field_str()
1007 * synth_event_add_fields - Add multiple fields to a synthetic event cmd
1008 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1009 * @fields: An array of type/name field descriptions
1012 * Add a new set of fields to a synthetic event cmd object. The event
1013 * fields that will be defined for the event should be passed in as an
1031 if (fields[i].type == NULL || fields[i].name == NULL) { in synth_event_add_fields()
1032 ret = -EINVAL; in synth_event_add_fields()
1036 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_add_fields()
1046 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
1047 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1048 * @name: The name of the synthetic event
1049 * @mod: The module creating the event, NULL if not created from a module
1058 * Generate a synthetic event command to be executed by
1066 * of a type followed by a field name.
1073 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name, in __synth_event_gen_cmd_start() argument
1080 cmd->event_name = name; in __synth_event_gen_cmd_start()
1081 cmd->private_data = mod; in __synth_event_gen_cmd_start()
1083 if (cmd->type != DYNEVENT_TYPE_SYNTH) in __synth_event_gen_cmd_start()
1084 return -EINVAL; in __synth_event_gen_cmd_start()
1087 arg.str = name; in __synth_event_gen_cmd_start()
1094 const char *type, *name; in __synth_event_gen_cmd_start() local
1099 name = va_arg(args, const char *); in __synth_event_gen_cmd_start()
1100 if (!name) in __synth_event_gen_cmd_start()
1103 if (++cmd->n_fields > SYNTH_FIELDS_MAX) { in __synth_event_gen_cmd_start()
1104 ret = -EINVAL; in __synth_event_gen_cmd_start()
1108 ret = synth_event_add_field(cmd, type, name); in __synth_event_gen_cmd_start()
1119 * synth_event_gen_cmd_array_start - Start synthetic event command from an array
1120 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1121 * @name: The name of the synthetic event
1122 * @fields: An array of type/name field descriptions
1125 * Generate a synthetic event command to be executed by
1132 * The event fields that will be defined for the event should be
1142 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name, in synth_event_gen_cmd_array_start() argument
1151 cmd->event_name = name; in synth_event_gen_cmd_array_start()
1152 cmd->private_data = mod; in synth_event_gen_cmd_array_start()
1154 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_gen_cmd_array_start()
1155 return -EINVAL; in synth_event_gen_cmd_array_start()
1158 return -EINVAL; in synth_event_gen_cmd_array_start()
1161 arg.str = name; in synth_event_gen_cmd_array_start()
1167 if (fields[i].type == NULL || fields[i].name == NULL) in synth_event_gen_cmd_array_start()
1168 return -EINVAL; in synth_event_gen_cmd_array_start()
1170 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_gen_cmd_array_start()
1179 static int __create_synth_event(const char *name, const char *raw_fields) in __create_synth_event() argument
1185 struct synth_event *event = NULL; in __create_synth_event() local
1189 * - Add synthetic event: <event_name> field[;field] ... in __create_synth_event()
1190 * - Remove synthetic event: !<event_name> field[;field] ... in __create_synth_event()
1194 if (name[0] == '\0') { in __create_synth_event()
1196 return -EINVAL; in __create_synth_event()
1199 if (!is_good_name(name)) { in __create_synth_event()
1200 synth_err(SYNTH_ERR_BAD_NAME, errpos(name)); in __create_synth_event()
1201 return -EINVAL; in __create_synth_event()
1206 event = find_synth_event(name); in __create_synth_event()
1207 if (event) { in __create_synth_event()
1208 synth_err(SYNTH_ERR_EVENT_EXISTS, errpos(name)); in __create_synth_event()
1209 ret = -EEXIST; in __create_synth_event()
1215 ret = -ENOMEM; in __create_synth_event()
1222 ret = -ENOMEM; in __create_synth_event()
1236 field = parse_synth_field(argc - consumed, in __create_synth_event()
1264 ret = -EINVAL; in __create_synth_event()
1271 ret = -EINVAL; in __create_synth_event()
1280 ret = -EINVAL; in __create_synth_event()
1289 ret = -EINVAL; in __create_synth_event()
1293 event = alloc_synth_event(name, n_fields, fields); in __create_synth_event()
1294 if (IS_ERR(event)) { in __create_synth_event()
1295 ret = PTR_ERR(event); in __create_synth_event()
1296 event = NULL; in __create_synth_event()
1299 ret = register_synth_event(event); in __create_synth_event()
1301 dyn_event_add(&event->devent, &event->call); in __create_synth_event()
1303 free_synth_event(event); in __create_synth_event()
1318 * synth_event_create - Create a new synthetic event
1319 * @name: The name of the new synthetic event
1320 * @fields: An array of type/name field descriptions
1322 * @mod: The module creating the event, NULL if not created from a module
1324 * Create a new synthetic event with the given name under the
1325 * trace/events/synthetic/ directory. The event fields that will be
1326 * defined for the event should be passed in as an array of struct
1331 * If the new synthetic event is being created from a module, the mod
1332 * param must be non-NULL. This will ensure that the trace buffer
1335 * The new synth event should be deleted using synth_event_delete()
1336 * function. The new synthetic event can be generated from modules or
1341 int synth_event_create(const char *name, struct synth_field_desc *fields, in synth_event_create() argument
1350 return -ENOMEM; in synth_event_create()
1354 ret = synth_event_gen_cmd_array_start(&cmd, name, mod, in synth_event_create()
1371 if (se->ref) in destroy_synth_event()
1372 return -EBUSY; in destroy_synth_event()
1374 if (trace_event_dyn_busy(&se->call)) in destroy_synth_event()
1375 return -EBUSY; in destroy_synth_event()
1379 dyn_event_remove(&se->devent); in destroy_synth_event()
1387 * synth_event_delete - Delete a synthetic event
1388 * @event_name: The name of the new synthetic event
1390 * Delete a synthetic event that was created with synth_event_create().
1398 int ret = -ENOENT; in synth_event_delete()
1403 mod = se->mod; in synth_event_delete()
1435 return -ENOMEM; in check_command()
1439 ret = -EINVAL; in check_command()
1448 ret = -ENOMEM; in check_command()
1454 ret = -EINVAL; in check_command()
1463 char *name = NULL, *fields, *p; in create_or_delete_synth_event() local
1481 ret = -EINVAL; in create_or_delete_synth_event()
1485 name = kmemdup_nul(raw_command, p ? p - raw_command : strlen(raw_command), GFP_KERNEL); in create_or_delete_synth_event()
1486 if (!name) in create_or_delete_synth_event()
1487 return -ENOMEM; in create_or_delete_synth_event()
1489 if (name[0] == '!') { in create_or_delete_synth_event()
1490 ret = synth_event_delete(name + 1); in create_or_delete_synth_event()
1496 ret = __create_synth_event(name, fields); in create_or_delete_synth_event()
1498 kfree(name); in create_or_delete_synth_event()
1508 ret = create_or_delete_synth_event(cmd->seq.buffer); in synth_event_run_command()
1512 se = find_synth_event(cmd->event_name); in synth_event_run_command()
1514 return -ENOENT; in synth_event_run_command()
1516 se->mod = cmd->private_data; in synth_event_run_command()
1522 * synth_event_cmd_init - Initialize a synthetic event command object
1523 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1527 * Initialize a synthetic event command object. Use this before
1546 * Normal event tracing doesn't get called at all unless the in __synth_event_trace_init()
1554 if (!(file->flags & EVENT_FILE_FL_ENABLED) || in __synth_event_trace_init()
1556 trace_state->disabled = true; in __synth_event_trace_init()
1557 ret = -ENOENT; in __synth_event_trace_init()
1561 trace_state->event = file->event_call->data; in __synth_event_trace_init()
1574 fields_size = trace_state->event->n_u64 * sizeof(u64); in __synth_event_trace_start()
1578 * Avoid ring buffer recursion detection, as this event in __synth_event_trace_start()
1579 * is being performed within another event. in __synth_event_trace_start()
1581 trace_state->buffer = file->tr->array_buffer.buffer; in __synth_event_trace_start()
1582 ring_buffer_nest_start(trace_state->buffer); in __synth_event_trace_start()
1584 entry_size = sizeof(*trace_state->entry) + fields_size; in __synth_event_trace_start()
1585 trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer, in __synth_event_trace_start()
1588 if (!trace_state->entry) { in __synth_event_trace_start()
1589 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_start()
1590 ret = -EINVAL; in __synth_event_trace_start()
1599 trace_event_buffer_commit(&trace_state->fbuffer); in __synth_event_trace_end()
1601 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_end()
1605 * synth_event_trace - Trace a synthetic event
1606 * @file: The trace_event_file representing the synthetic event
1608 * @args: Variable number of args containing the event values
1610 * Trace a synthetic event using the values passed in the variable
1614 * of vals must match the number of field in the synthetic event, and
1615 * must be in the same order as the synthetic event fields.
1619 * reserved in the event for the string, using these pointers.
1632 if (ret == -ENOENT) in synth_event_trace()
1637 if (state.event->n_dynamic_fields) { in synth_event_trace()
1640 for (i = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1643 if (state.event->fields[i]->is_string && in synth_event_trace()
1644 state.event->fields[i]->is_dynamic) { in synth_event_trace()
1658 if (n_vals != state.event->n_fields) { in synth_event_trace()
1659 ret = -EINVAL; in synth_event_trace()
1666 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1671 if (state.event->fields[i]->is_string) { in synth_event_trace()
1674 len = trace_string(state.entry, state.event, str_val, in synth_event_trace()
1675 state.event->fields[i]->is_dynamic, in synth_event_trace()
1679 struct synth_field *field = state.event->fields[i]; in synth_event_trace()
1681 switch (field->size) { in synth_event_trace()
1683 *(u8 *)&state.entry->fields[n_u64] = (u8)val; in synth_event_trace()
1687 *(u16 *)&state.entry->fields[n_u64] = (u16)val; in synth_event_trace()
1691 *(u32 *)&state.entry->fields[n_u64] = (u32)val; in synth_event_trace()
1695 state.entry->fields[n_u64] = val; in synth_event_trace()
1710 * synth_event_trace_array - Trace a synthetic event from an array
1711 * @file: The trace_event_file representing the synthetic event
1715 * Trace a synthetic event using the values passed in as 'vals'.
1718 * vals must match the number of field in the synthetic event, and
1719 * must be in the same order as the synthetic event fields.
1723 * reserved in the event for the string, using these pointers.
1737 if (ret == -ENOENT) in synth_event_trace_array()
1742 if (state.event->n_dynamic_fields) { in synth_event_trace_array()
1743 for (i = 0; i < state.event->n_dynamic_fields; i++) { in synth_event_trace_array()
1744 field_pos = state.event->dynamic_fields[i]->field_pos; in synth_event_trace_array()
1755 if (n_vals != state.event->n_fields) { in synth_event_trace_array()
1756 ret = -EINVAL; in synth_event_trace_array()
1762 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace_array()
1763 if (state.event->fields[i]->is_string) { in synth_event_trace_array()
1766 len = trace_string(state.entry, state.event, str_val, in synth_event_trace_array()
1767 state.event->fields[i]->is_dynamic, in synth_event_trace_array()
1771 struct synth_field *field = state.event->fields[i]; in synth_event_trace_array()
1774 switch (field->size) { in synth_event_trace_array()
1776 *(u8 *)&state.entry->fields[n_u64] = (u8)val; in synth_event_trace_array()
1780 *(u16 *)&state.entry->fields[n_u64] = (u16)val; in synth_event_trace_array()
1784 *(u32 *)&state.entry->fields[n_u64] = (u32)val; in synth_event_trace_array()
1788 state.entry->fields[n_u64] = val; in synth_event_trace_array()
1802 * synth_event_trace_start - Start piecewise synthetic event trace
1803 * @file: The trace_event_file representing the synthetic event
1806 * Start the trace of a synthetic event field-by-field rather than all
1809 * This function 'opens' an event trace, which means space is reserved
1810 * for the event in the trace buffer, after which the event's
1815 * track of the current event trace state until the event trace is
1816 * closed (and the event finally traced) using
1820 * have been added for each event trace, regardless of whether adding
1823 * Note also that for a given event trace, all fields must be added
1835 return -EINVAL; in synth_event_trace_start()
1839 if (ret == -ENOENT) in synth_event_trace_start()
1844 if (trace_state->event->n_dynamic_fields) in synth_event_trace_start()
1845 return -ENOTSUPP; in synth_event_trace_start()
1858 struct synth_event *event; in __synth_event_add_val() local
1862 ret = -EINVAL; in __synth_event_add_val()
1868 if (trace_state->add_next) { in __synth_event_add_val()
1869 ret = -EINVAL; in __synth_event_add_val()
1872 trace_state->add_name = true; in __synth_event_add_val()
1874 if (trace_state->add_name) { in __synth_event_add_val()
1875 ret = -EINVAL; in __synth_event_add_val()
1878 trace_state->add_next = true; in __synth_event_add_val()
1881 if (trace_state->disabled) in __synth_event_add_val()
1884 event = trace_state->event; in __synth_event_add_val()
1885 if (trace_state->add_name) { in __synth_event_add_val()
1886 for (i = 0; i < event->n_fields; i++) { in __synth_event_add_val()
1887 field = event->fields[i]; in __synth_event_add_val()
1888 if (strcmp(field->name, field_name) == 0) in __synth_event_add_val()
1892 ret = -EINVAL; in __synth_event_add_val()
1896 if (trace_state->cur_field >= event->n_fields) { in __synth_event_add_val()
1897 ret = -EINVAL; in __synth_event_add_val()
1900 field = event->fields[trace_state->cur_field++]; in __synth_event_add_val()
1903 entry = trace_state->entry; in __synth_event_add_val()
1904 if (field->is_string) { in __synth_event_add_val()
1908 if (field->is_dynamic) { /* add_val can't do dynamic strings */ in __synth_event_add_val()
1909 ret = -EINVAL; in __synth_event_add_val()
1914 ret = -EINVAL; in __synth_event_add_val()
1918 str_field = (char *)&entry->fields[field->offset]; in __synth_event_add_val()
1921 switch (field->size) { in __synth_event_add_val()
1923 *(u8 *)&trace_state->entry->fields[field->offset] = (u8)val; in __synth_event_add_val()
1927 *(u16 *)&trace_state->entry->fields[field->offset] = (u16)val; in __synth_event_add_val()
1931 *(u32 *)&trace_state->entry->fields[field->offset] = (u32)val; in __synth_event_add_val()
1935 trace_state->entry->fields[field->offset] = val; in __synth_event_add_val()
1944 * synth_event_add_next_val - Add the next field's value to an open synth trace
1948 * Set the value of the next field in an event that's been opened by
1954 * This function assumes all the fields in an event are to be set one
1955 * after another - successive calls to this function are made, one for
1956 * each field, in the order of the fields in the event, until all
1962 * synth_event_add_val() can't be intermixed for a given event trace -
1966 * values have been added for each event trace, regardless of whether
1979 * synth_event_add_val - Add a named field's value to an open synth trace
1980 * @field_name: The name of the synthetic event field value to set
1984 * Set the value of the named field in an event that's been opened by
1990 * This function looks up the field name, and if found, sets the field
1993 * none-piecewise synth_event_trace() instead if efficiency is more
1997 * synth_event_add_val() can't be intermixed for a given event trace -
2001 * values have been added for each event trace, regardless of whether
2014 * synth_event_trace_end - End piecewise synthetic event trace
2017 * End the trace of a synthetic event opened by
2020 * This function 'closes' an event trace, which basically means that
2021 * it commits the reserved event and cleans up other loose ends.
2024 * track of the current event trace state opened with
2028 * added for each event trace, regardless of whether adding all field
2036 return -EINVAL; in synth_event_trace_end()
2047 const char *name; in create_synth_event() local
2059 return -EINVAL; in create_synth_event()
2064 name = raw_command; in create_synth_event()
2066 if (name[0] != 's' || name[1] != ':') in create_synth_event()
2067 return -ECANCELED; in create_synth_event()
2068 name += 2; in create_synth_event()
2070 /* This interface accepts group name prefix */ in create_synth_event()
2071 if (strchr(name, '/')) { in create_synth_event()
2072 len = str_has_prefix(name, SYNTH_SYSTEM "/"); in create_synth_event()
2075 return -EINVAL; in create_synth_event()
2077 name += len; in create_synth_event()
2080 len = name - raw_command; in create_synth_event()
2088 name = kmemdup_nul(raw_command + len, p - raw_command - len, GFP_KERNEL); in create_synth_event()
2089 if (!name) in create_synth_event()
2090 return -ENOMEM; in create_synth_event()
2092 ret = __create_synth_event(name, fields); in create_synth_event()
2094 kfree(name); in create_synth_event()
2101 struct synth_event *event = to_synth_event(ev); in synth_event_release() local
2104 if (event->ref) in synth_event_release()
2105 return -EBUSY; in synth_event_release()
2107 if (trace_event_dyn_busy(&event->call)) in synth_event_release()
2108 return -EBUSY; in synth_event_release()
2110 ret = unregister_synth_event(event); in synth_event_release()
2115 free_synth_event(event); in synth_event_release()
2119 static int __synth_event_show(struct seq_file *m, struct synth_event *event) in __synth_event_show() argument
2125 seq_printf(m, "%s\t", event->name); in __synth_event_show()
2127 for (i = 0; i < event->n_fields; i++) { in __synth_event_show()
2128 field = event->fields[i]; in __synth_event_show()
2130 type = field->type; in __synth_event_show()
2132 if (t) { /* __data_loc belongs in format but not event desc */ in __synth_event_show()
2138 seq_printf(m, "%s %s%s", type, field->name, in __synth_event_show()
2139 i == event->n_fields - 1 ? "" : "; "); in __synth_event_show()
2149 struct synth_event *event = to_synth_event(ev); in synth_event_show() local
2151 seq_printf(m, "s:%s/", event->class.system); in synth_event_show()
2153 return __synth_event_show(m, event); in synth_event_show()
2181 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { in synth_events_open()
2233 err = -ENODEV; in trace_events_synth_init()