Lines Matching +full:event +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0
3 * trace_events_synth - synthetic trace events
27 C(BAD_NAME, "Illegal name"), \
28 C(INVALID_CMD, "Command must be of the form: <name> field[;field] ..."),\
29 C(INVALID_DYN_CMD, "Command must be of the form: s or -:[synthetic/]<name> field[;field] ..."),\
30 C(EVENT_EXISTS, "Event already exists"), \
91 static bool synth_event_match(const char *system, const char *event,
104 return ev->ops == &synth_event_ops; in is_synth_event()
114 struct synth_event *event = to_synth_event(ev); in synth_event_is_busy() local
116 return event->ref != 0; in synth_event_is_busy()
119 static bool synth_event_match(const char *system, const char *event, in synth_event_match() argument
124 return strcmp(sev->name, event) == 0 && in synth_event_match()
137 struct synth_event *event = call->data; in synth_event_define_fields() local
139 char *name, *type; in synth_event_define_fields() local
143 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in synth_event_define_fields()
144 size = event->fields[i]->size; in synth_event_define_fields()
145 is_signed = event->fields[i]->is_signed; in synth_event_define_fields()
146 type = event->fields[i]->type; in synth_event_define_fields()
147 name = event->fields[i]->name; in synth_event_define_fields()
148 ret = trace_define_field(call, type, name, offset, size, in synth_event_define_fields()
153 event->fields[i]->offset = n_u64; in synth_event_define_fields()
155 if (event->fields[i]->is_string && !event->fields[i]->is_dynamic) { in synth_event_define_fields()
164 event->n_u64 = n_u64; in synth_event_define_fields()
203 return -EINVAL; in synth_field_string_size()
204 start += sizeof("char[") - 1; in synth_field_string_size()
208 return -EINVAL; in synth_field_string_size()
210 len = end - start; in synth_field_string_size()
212 return -EINVAL; in synth_field_string_size()
215 return 0; /* variable-length string */ in synth_field_string_size()
225 return -EINVAL; in synth_field_string_size()
323 char *print_fmt, char *name, in print_synth_event_num_val() argument
328 trace_seq_printf(s, print_fmt, name, val->as_u8, space); in print_synth_event_num_val()
332 trace_seq_printf(s, print_fmt, name, val->as_u16, space); in print_synth_event_num_val()
336 trace_seq_printf(s, print_fmt, name, val->as_u32, space); in print_synth_event_num_val()
340 trace_seq_printf(s, print_fmt, name, val->as_u64, space); in print_synth_event_num_val()
347 struct trace_event *event) in print_synth_event() argument
349 struct trace_array *tr = iter->tr; in print_synth_event()
350 struct trace_seq *s = &iter->seq; in print_synth_event()
357 entry = (struct synth_trace_event *)iter->ent; in print_synth_event()
358 se = container_of(event, struct synth_event, call.event); in print_synth_event()
360 trace_seq_printf(s, "%s: ", se->name); in print_synth_event()
362 for (i = 0, n_u64 = 0; i < se->n_fields; i++) { in print_synth_event()
366 fmt = synth_field_fmt(se->fields[i]->type); in print_synth_event()
369 if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) in print_synth_event()
375 if (se->fields[i]->is_string) { in print_synth_event()
376 if (se->fields[i]->is_dynamic) { in print_synth_event()
377 union trace_synth_field *data = &entry->fields[n_u64]; in print_synth_event()
379 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
381 (char *)entry + data->as_dynamic.offset, in print_synth_event()
382 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
385 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
387 (char *)&entry->fields[n_u64].as_u64, in print_synth_event()
388 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
391 } else if (se->fields[i]->is_stack) { in print_synth_event()
392 union trace_synth_field *data = &entry->fields[n_u64]; in print_synth_event()
393 unsigned long *p = (void *)entry + data->as_dynamic.offset; in print_synth_event()
395 trace_seq_printf(s, "%s=STACK:\n", se->fields[i]->name); in print_synth_event()
396 for (j = 1; j < data->as_dynamic.len / sizeof(long); j++) in print_synth_event()
401 __def_gfpflag_names, {-1, NULL} }; in print_synth_event()
402 char *space = (i == se->n_fields - 1 ? "" : " "); in print_synth_event()
405 se->fields[i]->name, in print_synth_event()
406 se->fields[i]->size, in print_synth_event()
407 &entry->fields[n_u64], in print_synth_event()
410 if (strcmp(se->fields[i]->type, "gfp_t") == 0) { in print_synth_event()
413 entry->fields[n_u64].as_u64, in print_synth_event()
431 struct synth_event *event, in trace_string() argument
442 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_string()
445 data->as_dynamic.offset = struct_size(entry, fields, event->n_u64) + data_size; in trace_string()
446 data->as_dynamic.len = len; in trace_string()
448 ret = fetch_store_string((unsigned long)str_val, &entry->fields[*n_u64], entry); in trace_string()
452 str_field = (char *)&entry->fields[*n_u64].as_u64; in trace_string()
471 struct synth_event *event, in trace_stack() argument
476 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_stack()
481 data_offset = struct_size(entry, fields, event->n_u64); in trace_stack()
497 data->as_dynamic.offset = data_offset; in trace_stack()
498 data->as_dynamic.len = len; in trace_stack()
514 struct synth_event *event; in trace_event_raw_event_synth() local
517 event = trace_file->event_call->data; in trace_event_raw_event_synth()
522 fields_size = event->n_u64 * sizeof(u64); in trace_event_raw_event_synth()
524 for (i = 0; i < event->n_dynamic_fields; i++) { in trace_event_raw_event_synth()
525 unsigned int field_pos = event->dynamic_fields[i]->field_pos; in trace_event_raw_event_synth()
531 if (event->dynamic_fields[i]->is_stack) { in trace_event_raw_event_synth()
543 * Avoid ring buffer recursion detection, as this event in trace_event_raw_event_synth()
544 * is being performed within another event. in trace_event_raw_event_synth()
546 buffer = trace_file->tr->array_buffer.buffer; in trace_event_raw_event_synth()
554 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in trace_event_raw_event_synth()
556 if (event->fields[i]->is_string) { in trace_event_raw_event_synth()
559 len = trace_string(entry, event, str_val, in trace_event_raw_event_synth()
560 event->fields[i]->is_dynamic, in trace_event_raw_event_synth()
563 } else if (event->fields[i]->is_stack) { in trace_event_raw_event_synth()
566 len = trace_stack(entry, event, stack, in trace_event_raw_event_synth()
570 struct synth_field *field = event->fields[i]; in trace_event_raw_event_synth()
573 switch (field->size) { in trace_event_raw_event_synth()
575 entry->fields[n_u64].as_u8 = (u8)val; in trace_event_raw_event_synth()
579 entry->fields[n_u64].as_u16 = (u16)val; in trace_event_raw_event_synth()
583 entry->fields[n_u64].as_u32 = (u32)val; in trace_event_raw_event_synth()
587 entry->fields[n_u64].as_u64 = val; in trace_event_raw_event_synth()
602 kfree(call->print_fmt); in free_synth_event_print_fmt()
603 call->print_fmt = NULL; in free_synth_event_print_fmt()
607 static int __set_synth_event_print_fmt(struct synth_event *event, in __set_synth_event_print_fmt() argument
615 #define LEN_OR_ZERO (len ? len - pos : 0) in __set_synth_event_print_fmt()
618 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
619 fmt = synth_field_fmt(event->fields[i]->type); in __set_synth_event_print_fmt()
621 event->fields[i]->name, fmt, in __set_synth_event_print_fmt()
622 i == event->n_fields - 1 ? "" : ", "); in __set_synth_event_print_fmt()
626 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
627 if (event->fields[i]->is_string && in __set_synth_event_print_fmt()
628 event->fields[i]->is_dynamic) in __set_synth_event_print_fmt()
630 ", __get_str(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
631 else if (event->fields[i]->is_stack) in __set_synth_event_print_fmt()
633 ", __get_stacktrace(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
636 ", REC->%s", event->fields[i]->name); in __set_synth_event_print_fmt()
647 struct synth_event *event = call->data; in set_synth_event_print_fmt() local
652 len = __set_synth_event_print_fmt(event, NULL, 0); in set_synth_event_print_fmt()
656 return -ENOMEM; in set_synth_event_print_fmt()
659 __set_synth_event_print_fmt(event, print_fmt, len + 1); in set_synth_event_print_fmt()
660 call->print_fmt = print_fmt; in set_synth_event_print_fmt()
667 kfree(field->type); in free_synth_field()
668 kfree(field->name); in free_synth_field()
676 * For backward compatibility, the old synthetic event command in check_field_version()
694 int len, ret = -ENOMEM; in parse_synth_field()
701 return ERR_PTR(-EINVAL); in parse_synth_field()
714 return ERR_PTR(-EINVAL); in parse_synth_field()
721 return ERR_PTR(-ENOMEM); in parse_synth_field()
726 len -= strlen(array); in parse_synth_field()
728 field->name = kmemdup_nul(field_name, len, GFP_KERNEL); in parse_synth_field()
729 if (!field->name) in parse_synth_field()
732 if (!is_good_name(field->name)) { in parse_synth_field()
734 ret = -EINVAL; in parse_synth_field()
746 field->type = kzalloc(len, GFP_KERNEL); in parse_synth_field()
747 if (!field->type) in parse_synth_field()
750 seq_buf_init(&s, field->type, len); in parse_synth_field()
761 size = synth_field_size(field->type); in parse_synth_field()
767 ret = -EINVAL; in parse_synth_field()
770 if (synth_field_is_string(field->type) || in parse_synth_field()
771 synth_field_is_stack(field->type)) { in parse_synth_field()
774 len = sizeof("__data_loc ") + strlen(field->type) + 1; in parse_synth_field()
781 seq_buf_puts(&s, field->type); in parse_synth_field()
787 kfree(field->type); in parse_synth_field()
788 field->type = type; in parse_synth_field()
790 field->is_dynamic = true; in parse_synth_field()
794 ret = -EINVAL; in parse_synth_field()
798 field->size = size; in parse_synth_field()
800 if (synth_field_is_string(field->type)) in parse_synth_field()
801 field->is_string = true; in parse_synth_field()
802 else if (synth_field_is_stack(field->type)) in parse_synth_field()
803 field->is_stack = true; in parse_synth_field()
805 field->is_signed = synth_field_signed(field->type); in parse_synth_field()
819 kfree(tp->name); in free_synth_tracepoint()
823 static struct tracepoint *alloc_synth_tracepoint(char *name) in alloc_synth_tracepoint() argument
829 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
831 tp->name = kstrdup(name, GFP_KERNEL); in alloc_synth_tracepoint()
832 if (!tp->name) { in alloc_synth_tracepoint()
834 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
840 struct synth_event *find_synth_event(const char *name) in find_synth_event() argument
843 struct synth_event *event; in find_synth_event() local
848 event = to_synth_event(pos); in find_synth_event()
849 if (strcmp(event->name, name) == 0) in find_synth_event()
850 return event; in find_synth_event()
862 static int register_synth_event(struct synth_event *event) in register_synth_event() argument
864 struct trace_event_call *call = &event->call; in register_synth_event()
867 event->call.class = &event->class; in register_synth_event()
868 event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL); in register_synth_event()
869 if (!event->class.system) { in register_synth_event()
870 ret = -ENOMEM; in register_synth_event()
874 event->tp = alloc_synth_tracepoint(event->name); in register_synth_event()
875 if (IS_ERR(event->tp)) { in register_synth_event()
876 ret = PTR_ERR(event->tp); in register_synth_event()
877 event->tp = NULL; in register_synth_event()
881 INIT_LIST_HEAD(&call->class->fields); in register_synth_event()
882 call->event.funcs = &synth_event_funcs; in register_synth_event()
883 call->class->fields_array = synth_event_fields_array; in register_synth_event()
885 ret = register_trace_event(&call->event); in register_synth_event()
887 ret = -ENODEV; in register_synth_event()
890 call->flags = TRACE_EVENT_FL_TRACEPOINT; in register_synth_event()
891 call->class->reg = trace_event_reg; in register_synth_event()
892 call->class->probe = trace_event_raw_event_synth; in register_synth_event()
893 call->data = event; in register_synth_event()
894 call->tp = event->tp; in register_synth_event()
898 pr_warn("Failed to register synthetic event: %s\n", in register_synth_event()
910 unregister_trace_event(&call->event); in register_synth_event()
914 static int unregister_synth_event(struct synth_event *event) in unregister_synth_event() argument
916 struct trace_event_call *call = &event->call; in unregister_synth_event()
924 static void free_synth_event(struct synth_event *event) in free_synth_event() argument
928 if (!event) in free_synth_event()
931 for (i = 0; i < event->n_fields; i++) in free_synth_event()
932 free_synth_field(event->fields[i]); in free_synth_event()
934 kfree(event->fields); in free_synth_event()
935 kfree(event->dynamic_fields); in free_synth_event()
936 kfree(event->name); in free_synth_event()
937 kfree(event->class.system); in free_synth_event()
938 free_synth_tracepoint(event->tp); in free_synth_event()
939 free_synth_event_print_fmt(&event->call); in free_synth_event()
940 kfree(event); in free_synth_event()
943 static struct synth_event *alloc_synth_event(const char *name, int n_fields, in alloc_synth_event() argument
947 struct synth_event *event; in alloc_synth_event() local
949 event = kzalloc(sizeof(*event), GFP_KERNEL); in alloc_synth_event()
950 if (!event) { in alloc_synth_event()
951 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
955 event->name = kstrdup(name, GFP_KERNEL); in alloc_synth_event()
956 if (!event->name) { in alloc_synth_event()
957 kfree(event); in alloc_synth_event()
958 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
962 event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL); in alloc_synth_event()
963 if (!event->fields) { in alloc_synth_event()
964 free_synth_event(event); in alloc_synth_event()
965 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
970 if (fields[i]->is_dynamic) in alloc_synth_event()
974 event->dynamic_fields = kcalloc(n_dynamic_fields, in alloc_synth_event()
975 sizeof(*event->dynamic_fields), in alloc_synth_event()
977 if (!event->dynamic_fields) { in alloc_synth_event()
978 free_synth_event(event); in alloc_synth_event()
979 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
984 dyn_event_init(&event->devent, &synth_event_ops); in alloc_synth_event()
987 fields[i]->field_pos = i; in alloc_synth_event()
988 event->fields[i] = fields[i]; in alloc_synth_event()
990 if (fields[i]->is_dynamic) in alloc_synth_event()
991 event->dynamic_fields[j++] = fields[i]; in alloc_synth_event()
993 event->n_dynamic_fields = j; in alloc_synth_event()
994 event->n_fields = n_fields; in alloc_synth_event()
996 return event; in alloc_synth_event()
1004 size = synth_field_size((char *)arg_pair->lhs); in synth_event_check_arg_fn()
1006 if (strstr((char *)arg_pair->lhs, "[")) in synth_event_check_arg_fn()
1010 return size ? 0 : -EINVAL; in synth_event_check_arg_fn()
1014 * synth_event_add_field - Add a new field to a synthetic event cmd
1015 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1017 * @name: The name of the new field to add
1019 * Add a new field to a synthetic event cmd object. Field ordering is in
1028 const char *name) in synth_event_add_field() argument
1033 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field()
1034 return -EINVAL; in synth_event_add_field()
1036 if (!type || !name) in synth_event_add_field()
1037 return -EINVAL; in synth_event_add_field()
1042 arg_pair.rhs = name; in synth_event_add_field()
1048 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field()
1049 ret = -EINVAL; in synth_event_add_field()
1056 * synth_event_add_field_str - Add a new field to a synthetic event cmd
1057 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1058 * @type_name: The type and name of the new field to add, as a single string
1060 * Add a new field to a synthetic event cmd object, as a single
1062 * name', which will be appended by ';'. No sanity checking is done -
1063 * what's passed in is assumed to already be well-formed. Field
1076 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field_str()
1077 return -EINVAL; in synth_event_add_field_str()
1080 return -EINVAL; in synth_event_add_field_str()
1090 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field_str()
1091 ret = -EINVAL; in synth_event_add_field_str()
1098 * synth_event_add_fields - Add multiple fields to a synthetic event cmd
1099 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1100 * @fields: An array of type/name field descriptions
1103 * Add a new set of fields to a synthetic event cmd object. The event
1104 * fields that will be defined for the event should be passed in as an
1122 if (fields[i].type == NULL || fields[i].name == NULL) { in synth_event_add_fields()
1123 ret = -EINVAL; in synth_event_add_fields()
1127 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_add_fields()
1137 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
1138 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1139 * @name: The name of the synthetic event
1140 * @mod: The module creating the event, NULL if not created from a module
1149 * Generate a synthetic event command to be executed by
1157 * of a type followed by a field name.
1164 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name, in __synth_event_gen_cmd_start() argument
1171 cmd->event_name = name; in __synth_event_gen_cmd_start()
1172 cmd->private_data = mod; in __synth_event_gen_cmd_start()
1174 if (cmd->type != DYNEVENT_TYPE_SYNTH) in __synth_event_gen_cmd_start()
1175 return -EINVAL; in __synth_event_gen_cmd_start()
1178 arg.str = name; in __synth_event_gen_cmd_start()
1185 const char *type, *name; in __synth_event_gen_cmd_start() local
1190 name = va_arg(args, const char *); in __synth_event_gen_cmd_start()
1191 if (!name) in __synth_event_gen_cmd_start()
1194 if (++cmd->n_fields > SYNTH_FIELDS_MAX) { in __synth_event_gen_cmd_start()
1195 ret = -EINVAL; in __synth_event_gen_cmd_start()
1199 ret = synth_event_add_field(cmd, type, name); in __synth_event_gen_cmd_start()
1210 * synth_event_gen_cmd_array_start - Start synthetic event command from an array
1211 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1212 * @name: The name of the synthetic event
1213 * @mod: The module creating the event, NULL if not created from a module
1214 * @fields: An array of type/name field descriptions
1217 * Generate a synthetic event command to be executed by
1224 * The event fields that will be defined for the event should be
1234 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name, in synth_event_gen_cmd_array_start() argument
1243 cmd->event_name = name; in synth_event_gen_cmd_array_start()
1244 cmd->private_data = mod; in synth_event_gen_cmd_array_start()
1246 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_gen_cmd_array_start()
1247 return -EINVAL; in synth_event_gen_cmd_array_start()
1250 return -EINVAL; in synth_event_gen_cmd_array_start()
1253 arg.str = name; in synth_event_gen_cmd_array_start()
1259 if (fields[i].type == NULL || fields[i].name == NULL) in synth_event_gen_cmd_array_start()
1260 return -EINVAL; in synth_event_gen_cmd_array_start()
1262 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_gen_cmd_array_start()
1271 static int __create_synth_event(const char *name, const char *raw_fields) in __create_synth_event() argument
1277 struct synth_event *event = NULL; in __create_synth_event() local
1281 * - Add synthetic event: <event_name> field[;field] ... in __create_synth_event()
1282 * - Remove synthetic event: !<event_name> field[;field] ... in __create_synth_event()
1286 if (name[0] == '\0') { in __create_synth_event()
1288 return -EINVAL; in __create_synth_event()
1291 if (!is_good_name(name)) { in __create_synth_event()
1292 synth_err(SYNTH_ERR_BAD_NAME, errpos(name)); in __create_synth_event()
1293 return -EINVAL; in __create_synth_event()
1298 event = find_synth_event(name); in __create_synth_event()
1299 if (event) { in __create_synth_event()
1300 synth_err(SYNTH_ERR_EVENT_EXISTS, errpos(name)); in __create_synth_event()
1301 ret = -EEXIST; in __create_synth_event()
1307 ret = -ENOMEM; in __create_synth_event()
1314 ret = -ENOMEM; in __create_synth_event()
1328 field = parse_synth_field(argc - consumed, in __create_synth_event()
1355 ret = -EINVAL; in __create_synth_event()
1361 ret = -EINVAL; in __create_synth_event()
1372 ret = -EINVAL; in __create_synth_event()
1380 ret = -EINVAL; in __create_synth_event()
1384 event = alloc_synth_event(name, n_fields, fields); in __create_synth_event()
1385 if (IS_ERR(event)) { in __create_synth_event()
1386 ret = PTR_ERR(event); in __create_synth_event()
1387 event = NULL; in __create_synth_event()
1390 ret = register_synth_event(event); in __create_synth_event()
1392 dyn_event_add(&event->devent, &event->call); in __create_synth_event()
1394 free_synth_event(event); in __create_synth_event()
1411 * synth_event_create - Create a new synthetic event
1412 * @name: The name of the new synthetic event
1413 * @fields: An array of type/name field descriptions
1415 * @mod: The module creating the event, NULL if not created from a module
1417 * Create a new synthetic event with the given name under the
1418 * trace/events/synthetic/ directory. The event fields that will be
1419 * defined for the event should be passed in as an array of struct
1424 * If the new synthetic event is being created from a module, the mod
1425 * param must be non-NULL. This will ensure that the trace buffer
1428 * The new synth event should be deleted using synth_event_delete()
1429 * function. The new synthetic event can be generated from modules or
1434 int synth_event_create(const char *name, struct synth_field_desc *fields, in synth_event_create() argument
1443 return -ENOMEM; in synth_event_create()
1447 ret = synth_event_gen_cmd_array_start(&cmd, name, mod, in synth_event_create()
1464 if (se->ref) in destroy_synth_event()
1465 return -EBUSY; in destroy_synth_event()
1467 if (trace_event_dyn_busy(&se->call)) in destroy_synth_event()
1468 return -EBUSY; in destroy_synth_event()
1472 dyn_event_remove(&se->devent); in destroy_synth_event()
1480 * synth_event_delete - Delete a synthetic event
1481 * @event_name: The name of the new synthetic event
1483 * Delete a synthetic event that was created with synth_event_create().
1491 int ret = -ENOENT; in synth_event_delete()
1496 mod = se->mod; in synth_event_delete()
1526 return -ENOMEM; in check_command()
1530 ret = -EINVAL; in check_command()
1539 ret = -ENOMEM; in check_command()
1545 ret = -EINVAL; in check_command()
1554 char *name = NULL, *fields, *p; in create_or_delete_synth_event() local
1572 ret = -EINVAL; in create_or_delete_synth_event()
1576 name = kmemdup_nul(raw_command, p ? p - raw_command : strlen(raw_command), GFP_KERNEL); in create_or_delete_synth_event()
1577 if (!name) in create_or_delete_synth_event()
1578 return -ENOMEM; in create_or_delete_synth_event()
1580 if (name[0] == '!') { in create_or_delete_synth_event()
1581 ret = synth_event_delete(name + 1); in create_or_delete_synth_event()
1587 ret = __create_synth_event(name, fields); in create_or_delete_synth_event()
1589 kfree(name); in create_or_delete_synth_event()
1599 ret = create_or_delete_synth_event(cmd->seq.buffer); in synth_event_run_command()
1603 se = find_synth_event(cmd->event_name); in synth_event_run_command()
1605 return -ENOENT; in synth_event_run_command()
1607 se->mod = cmd->private_data; in synth_event_run_command()
1613 * synth_event_cmd_init - Initialize a synthetic event command object
1614 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1618 * Initialize a synthetic event command object. Use this before
1637 * Normal event tracing doesn't get called at all unless the in __synth_event_trace_init()
1645 if (!(file->flags & EVENT_FILE_FL_ENABLED) || in __synth_event_trace_init()
1647 trace_state->disabled = true; in __synth_event_trace_init()
1648 ret = -ENOENT; in __synth_event_trace_init()
1652 trace_state->event = file->event_call->data; in __synth_event_trace_init()
1665 fields_size = trace_state->event->n_u64 * sizeof(u64); in __synth_event_trace_start()
1669 * Avoid ring buffer recursion detection, as this event in __synth_event_trace_start()
1670 * is being performed within another event. in __synth_event_trace_start()
1672 trace_state->buffer = file->tr->array_buffer.buffer; in __synth_event_trace_start()
1673 ring_buffer_nest_start(trace_state->buffer); in __synth_event_trace_start()
1675 entry_size = sizeof(*trace_state->entry) + fields_size; in __synth_event_trace_start()
1676 trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer, in __synth_event_trace_start()
1679 if (!trace_state->entry) { in __synth_event_trace_start()
1680 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_start()
1681 ret = -EINVAL; in __synth_event_trace_start()
1690 trace_event_buffer_commit(&trace_state->fbuffer); in __synth_event_trace_end()
1692 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_end()
1696 * synth_event_trace - Trace a synthetic event
1697 * @file: The trace_event_file representing the synthetic event
1699 * @args: Variable number of args containing the event values
1701 * Trace a synthetic event using the values passed in the variable
1705 * of vals must match the number of field in the synthetic event, and
1706 * must be in the same order as the synthetic event fields.
1710 * reserved in the event for the string, using these pointers.
1723 if (ret == -ENOENT) in synth_event_trace()
1728 if (state.event->n_dynamic_fields) { in synth_event_trace()
1731 for (i = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1734 if (state.event->fields[i]->is_string && in synth_event_trace()
1735 state.event->fields[i]->is_dynamic) { in synth_event_trace()
1749 if (n_vals != state.event->n_fields) { in synth_event_trace()
1750 ret = -EINVAL; in synth_event_trace()
1757 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1762 if (state.event->fields[i]->is_string) { in synth_event_trace()
1765 len = trace_string(state.entry, state.event, str_val, in synth_event_trace()
1766 state.event->fields[i]->is_dynamic, in synth_event_trace()
1770 struct synth_field *field = state.event->fields[i]; in synth_event_trace()
1772 switch (field->size) { in synth_event_trace()
1774 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace()
1778 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace()
1782 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace()
1786 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace()
1801 * synth_event_trace_array - Trace a synthetic event from an array
1802 * @file: The trace_event_file representing the synthetic event
1806 * Trace a synthetic event using the values passed in as 'vals'.
1809 * vals must match the number of field in the synthetic event, and
1810 * must be in the same order as the synthetic event fields.
1814 * reserved in the event for the string, using these pointers.
1828 if (ret == -ENOENT) in synth_event_trace_array()
1833 if (state.event->n_dynamic_fields) { in synth_event_trace_array()
1834 for (i = 0; i < state.event->n_dynamic_fields; i++) { in synth_event_trace_array()
1835 field_pos = state.event->dynamic_fields[i]->field_pos; in synth_event_trace_array()
1846 if (n_vals != state.event->n_fields) { in synth_event_trace_array()
1847 ret = -EINVAL; in synth_event_trace_array()
1853 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace_array()
1854 if (state.event->fields[i]->is_string) { in synth_event_trace_array()
1857 len = trace_string(state.entry, state.event, str_val, in synth_event_trace_array()
1858 state.event->fields[i]->is_dynamic, in synth_event_trace_array()
1862 struct synth_field *field = state.event->fields[i]; in synth_event_trace_array()
1865 switch (field->size) { in synth_event_trace_array()
1867 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace_array()
1871 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace_array()
1875 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace_array()
1879 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace_array()
1893 * synth_event_trace_start - Start piecewise synthetic event trace
1894 * @file: The trace_event_file representing the synthetic event
1897 * Start the trace of a synthetic event field-by-field rather than all
1900 * This function 'opens' an event trace, which means space is reserved
1901 * for the event in the trace buffer, after which the event's
1906 * track of the current event trace state until the event trace is
1907 * closed (and the event finally traced) using
1911 * have been added for each event trace, regardless of whether adding
1914 * Note also that for a given event trace, all fields must be added
1926 return -EINVAL; in synth_event_trace_start()
1930 if (ret == -ENOENT) in synth_event_trace_start()
1935 if (trace_state->event->n_dynamic_fields) in synth_event_trace_start()
1936 return -ENOTSUPP; in synth_event_trace_start()
1949 struct synth_event *event; in __synth_event_add_val() local
1953 ret = -EINVAL; in __synth_event_add_val()
1959 if (trace_state->add_next) { in __synth_event_add_val()
1960 ret = -EINVAL; in __synth_event_add_val()
1963 trace_state->add_name = true; in __synth_event_add_val()
1965 if (trace_state->add_name) { in __synth_event_add_val()
1966 ret = -EINVAL; in __synth_event_add_val()
1969 trace_state->add_next = true; in __synth_event_add_val()
1972 if (trace_state->disabled) in __synth_event_add_val()
1975 event = trace_state->event; in __synth_event_add_val()
1976 if (trace_state->add_name) { in __synth_event_add_val()
1977 for (i = 0; i < event->n_fields; i++) { in __synth_event_add_val()
1978 field = event->fields[i]; in __synth_event_add_val()
1979 if (strcmp(field->name, field_name) == 0) in __synth_event_add_val()
1983 ret = -EINVAL; in __synth_event_add_val()
1987 if (trace_state->cur_field >= event->n_fields) { in __synth_event_add_val()
1988 ret = -EINVAL; in __synth_event_add_val()
1991 field = event->fields[trace_state->cur_field++]; in __synth_event_add_val()
1994 entry = trace_state->entry; in __synth_event_add_val()
1995 if (field->is_string) { in __synth_event_add_val()
1999 if (field->is_dynamic) { /* add_val can't do dynamic strings */ in __synth_event_add_val()
2000 ret = -EINVAL; in __synth_event_add_val()
2005 ret = -EINVAL; in __synth_event_add_val()
2009 str_field = (char *)&entry->fields[field->offset]; in __synth_event_add_val()
2012 switch (field->size) { in __synth_event_add_val()
2014 trace_state->entry->fields[field->offset].as_u8 = (u8)val; in __synth_event_add_val()
2018 trace_state->entry->fields[field->offset].as_u16 = (u16)val; in __synth_event_add_val()
2022 trace_state->entry->fields[field->offset].as_u32 = (u32)val; in __synth_event_add_val()
2026 trace_state->entry->fields[field->offset].as_u64 = val; in __synth_event_add_val()
2035 * synth_event_add_next_val - Add the next field's value to an open synth trace
2039 * Set the value of the next field in an event that's been opened by
2045 * This function assumes all the fields in an event are to be set one
2046 * after another - successive calls to this function are made, one for
2047 * each field, in the order of the fields in the event, until all
2053 * synth_event_add_val() can't be intermixed for a given event trace -
2057 * values have been added for each event trace, regardless of whether
2070 * synth_event_add_val - Add a named field's value to an open synth trace
2071 * @field_name: The name of the synthetic event field value to set
2075 * Set the value of the named field in an event that's been opened by
2081 * This function looks up the field name, and if found, sets the field
2084 * none-piecewise synth_event_trace() instead if efficiency is more
2088 * synth_event_add_val() can't be intermixed for a given event trace -
2092 * values have been added for each event trace, regardless of whether
2105 * synth_event_trace_end - End piecewise synthetic event trace
2108 * End the trace of a synthetic event opened by
2111 * This function 'closes' an event trace, which basically means that
2112 * it commits the reserved event and cleans up other loose ends.
2115 * track of the current event trace state opened with
2119 * added for each event trace, regardless of whether adding all field
2127 return -EINVAL; in synth_event_trace_end()
2138 const char *name; in create_synth_event() local
2147 name = raw_command; in create_synth_event()
2150 if (name[0] != 's' || name[1] != ':') in create_synth_event()
2151 return -ECANCELED; in create_synth_event()
2152 name += 2; in create_synth_event()
2157 return -EINVAL; in create_synth_event()
2162 /* This interface accepts group name prefix */ in create_synth_event()
2163 if (strchr(name, '/')) { in create_synth_event()
2164 len = str_has_prefix(name, SYNTH_SYSTEM "/"); in create_synth_event()
2167 return -EINVAL; in create_synth_event()
2169 name += len; in create_synth_event()
2172 len = name - raw_command; in create_synth_event()
2180 name = kmemdup_nul(raw_command + len, p - raw_command - len, GFP_KERNEL); in create_synth_event()
2181 if (!name) in create_synth_event()
2182 return -ENOMEM; in create_synth_event()
2184 ret = __create_synth_event(name, fields); in create_synth_event()
2186 kfree(name); in create_synth_event()
2193 struct synth_event *event = to_synth_event(ev); in synth_event_release() local
2196 if (event->ref) in synth_event_release()
2197 return -EBUSY; in synth_event_release()
2199 if (trace_event_dyn_busy(&event->call)) in synth_event_release()
2200 return -EBUSY; in synth_event_release()
2202 ret = unregister_synth_event(event); in synth_event_release()
2207 free_synth_event(event); in synth_event_release()
2211 static int __synth_event_show(struct seq_file *m, struct synth_event *event) in __synth_event_show() argument
2217 seq_printf(m, "%s\t", event->name); in __synth_event_show()
2219 for (i = 0; i < event->n_fields; i++) { in __synth_event_show()
2220 field = event->fields[i]; in __synth_event_show()
2222 type = field->type; in __synth_event_show()
2224 if (t) { /* __data_loc belongs in format but not event desc */ in __synth_event_show()
2230 seq_printf(m, "%s %s%s", type, field->name, in __synth_event_show()
2231 i == event->n_fields - 1 ? "" : "; "); in __synth_event_show()
2241 struct synth_event *event = to_synth_event(ev); in synth_event_show() local
2243 seq_printf(m, "s:%s/", event->class.system); in synth_event_show()
2245 return __synth_event_show(m, event); in synth_event_show()
2273 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { in synth_events_open()
2325 err = -ENODEV; in trace_events_synth_init()