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"), \
84 static bool synth_event_match(const char *system, const char *event,
97 return ev->ops == &synth_event_ops; in is_synth_event()
107 struct synth_event *event = to_synth_event(ev); in synth_event_is_busy() local
109 return event->ref != 0; in synth_event_is_busy()
112 static bool synth_event_match(const char *system, const char *event, in synth_event_match() argument
117 return strcmp(sev->name, event) == 0 && in synth_event_match()
130 struct synth_event *event = call->data; in synth_event_define_fields() local
132 char *name, *type; in synth_event_define_fields() local
136 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in synth_event_define_fields()
137 size = event->fields[i]->size; in synth_event_define_fields()
138 is_signed = event->fields[i]->is_signed; in synth_event_define_fields()
139 type = event->fields[i]->type; in synth_event_define_fields()
140 name = event->fields[i]->name; in synth_event_define_fields()
141 ret = trace_define_field(call, type, name, offset, size, in synth_event_define_fields()
146 event->fields[i]->offset = n_u64; in synth_event_define_fields()
148 if (event->fields[i]->is_string && !event->fields[i]->is_dynamic) { in synth_event_define_fields()
157 event->n_u64 = n_u64; in synth_event_define_fields()
196 return -EINVAL; in synth_field_string_size()
197 start += sizeof("char[") - 1; in synth_field_string_size()
201 return -EINVAL; in synth_field_string_size()
203 len = end - start; in synth_field_string_size()
205 return -EINVAL; in synth_field_string_size()
208 return 0; /* variable-length string */ in synth_field_string_size()
218 return -EINVAL; in synth_field_string_size()
316 char *print_fmt, char *name, in print_synth_event_num_val() argument
321 trace_seq_printf(s, print_fmt, name, val->as_u8, space); in print_synth_event_num_val()
325 trace_seq_printf(s, print_fmt, name, val->as_u16, space); in print_synth_event_num_val()
329 trace_seq_printf(s, print_fmt, name, val->as_u32, space); in print_synth_event_num_val()
333 trace_seq_printf(s, print_fmt, name, val->as_u64, space); in print_synth_event_num_val()
340 struct trace_event *event) in print_synth_event() argument
342 struct trace_array *tr = iter->tr; in print_synth_event()
343 struct trace_seq *s = &iter->seq; in print_synth_event()
350 entry = (struct synth_trace_event *)iter->ent; in print_synth_event()
351 se = container_of(event, struct synth_event, call.event); in print_synth_event()
353 trace_seq_printf(s, "%s: ", se->name); in print_synth_event()
355 for (i = 0, n_u64 = 0; i < se->n_fields; i++) { in print_synth_event()
359 fmt = synth_field_fmt(se->fields[i]->type); in print_synth_event()
362 if (tr && tr->trace_flags & TRACE_ITER_VERBOSE) in print_synth_event()
368 if (se->fields[i]->is_string) { in print_synth_event()
369 if (se->fields[i]->is_dynamic) { in print_synth_event()
370 union trace_synth_field *data = &entry->fields[n_u64]; in print_synth_event()
372 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
374 (char *)entry + data->as_dynamic.offset, in print_synth_event()
375 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
378 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
380 (char *)&entry->fields[n_u64].as_u64, in print_synth_event()
381 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
384 } else if (se->fields[i]->is_stack) { in print_synth_event()
385 union trace_synth_field *data = &entry->fields[n_u64]; in print_synth_event()
386 unsigned long *p = (void *)entry + data->as_dynamic.offset; in print_synth_event()
388 trace_seq_printf(s, "%s=STACK:\n", se->fields[i]->name); in print_synth_event()
389 for (j = 1; j < data->as_dynamic.len / sizeof(long); j++) in print_synth_event()
394 __def_gfpflag_names, {-1, NULL} }; in print_synth_event()
395 char *space = (i == se->n_fields - 1 ? "" : " "); in print_synth_event()
398 se->fields[i]->name, in print_synth_event()
399 se->fields[i]->size, in print_synth_event()
400 &entry->fields[n_u64], in print_synth_event()
403 if (strcmp(se->fields[i]->type, "gfp_t") == 0) { in print_synth_event()
406 entry->fields[n_u64].as_u64, in print_synth_event()
424 struct synth_event *event, in trace_string() argument
435 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_string()
438 data->as_dynamic.offset = struct_size(entry, fields, event->n_u64) + data_size; in trace_string()
439 data->as_dynamic.len = len; in trace_string()
441 ret = fetch_store_string((unsigned long)str_val, &entry->fields[*n_u64], entry); in trace_string()
445 str_field = (char *)&entry->fields[*n_u64].as_u64; in trace_string()
464 struct synth_event *event, in trace_stack() argument
469 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_stack()
474 data_offset = struct_size(entry, fields, event->n_u64); in trace_stack()
490 data->as_dynamic.offset = data_offset; in trace_stack()
491 data->as_dynamic.len = len; in trace_stack()
507 struct synth_event *event; in trace_event_raw_event_synth() local
510 event = trace_file->event_call->data; in trace_event_raw_event_synth()
515 fields_size = event->n_u64 * sizeof(u64); in trace_event_raw_event_synth()
517 for (i = 0; i < event->n_dynamic_fields; i++) { in trace_event_raw_event_synth()
518 unsigned int field_pos = event->dynamic_fields[i]->field_pos; in trace_event_raw_event_synth()
524 if (event->dynamic_fields[i]->is_stack) { in trace_event_raw_event_synth()
536 * Avoid ring buffer recursion detection, as this event in trace_event_raw_event_synth()
537 * is being performed within another event. in trace_event_raw_event_synth()
539 buffer = trace_file->tr->array_buffer.buffer; in trace_event_raw_event_synth()
547 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in trace_event_raw_event_synth()
549 if (event->fields[i]->is_string) { in trace_event_raw_event_synth()
552 len = trace_string(entry, event, str_val, in trace_event_raw_event_synth()
553 event->fields[i]->is_dynamic, in trace_event_raw_event_synth()
556 } else if (event->fields[i]->is_stack) { in trace_event_raw_event_synth()
559 len = trace_stack(entry, event, stack, in trace_event_raw_event_synth()
563 struct synth_field *field = event->fields[i]; in trace_event_raw_event_synth()
566 switch (field->size) { in trace_event_raw_event_synth()
568 entry->fields[n_u64].as_u8 = (u8)val; in trace_event_raw_event_synth()
572 entry->fields[n_u64].as_u16 = (u16)val; in trace_event_raw_event_synth()
576 entry->fields[n_u64].as_u32 = (u32)val; in trace_event_raw_event_synth()
580 entry->fields[n_u64].as_u64 = val; in trace_event_raw_event_synth()
595 kfree(call->print_fmt); in free_synth_event_print_fmt()
596 call->print_fmt = NULL; in free_synth_event_print_fmt()
600 static int __set_synth_event_print_fmt(struct synth_event *event, in __set_synth_event_print_fmt() argument
608 #define LEN_OR_ZERO (len ? len - pos : 0) in __set_synth_event_print_fmt()
611 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
612 fmt = synth_field_fmt(event->fields[i]->type); in __set_synth_event_print_fmt()
614 event->fields[i]->name, fmt, in __set_synth_event_print_fmt()
615 i == event->n_fields - 1 ? "" : ", "); in __set_synth_event_print_fmt()
619 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
620 if (event->fields[i]->is_string && in __set_synth_event_print_fmt()
621 event->fields[i]->is_dynamic) in __set_synth_event_print_fmt()
623 ", __get_str(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
624 else if (event->fields[i]->is_stack) in __set_synth_event_print_fmt()
626 ", __get_stacktrace(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
629 ", REC->%s", event->fields[i]->name); in __set_synth_event_print_fmt()
640 struct synth_event *event = call->data; in set_synth_event_print_fmt() local
645 len = __set_synth_event_print_fmt(event, NULL, 0); in set_synth_event_print_fmt()
649 return -ENOMEM; in set_synth_event_print_fmt()
652 __set_synth_event_print_fmt(event, print_fmt, len + 1); in set_synth_event_print_fmt()
653 call->print_fmt = print_fmt; in set_synth_event_print_fmt()
660 kfree(field->type); in free_synth_field()
661 kfree(field->name); in free_synth_field()
669 * For backward compatibility, the old synthetic event command in check_field_version()
687 int len, ret = -ENOMEM; in parse_synth_field()
694 return ERR_PTR(-EINVAL); in parse_synth_field()
707 return ERR_PTR(-EINVAL); in parse_synth_field()
714 return ERR_PTR(-ENOMEM); in parse_synth_field()
719 len -= strlen(array); in parse_synth_field()
721 field->name = kmemdup_nul(field_name, len, GFP_KERNEL); in parse_synth_field()
722 if (!field->name) in parse_synth_field()
725 if (!is_good_name(field->name)) { in parse_synth_field()
727 ret = -EINVAL; in parse_synth_field()
739 field->type = kzalloc(len, GFP_KERNEL); in parse_synth_field()
740 if (!field->type) in parse_synth_field()
743 seq_buf_init(&s, field->type, len); in parse_synth_field()
754 size = synth_field_size(field->type); in parse_synth_field()
760 ret = -EINVAL; in parse_synth_field()
763 if (synth_field_is_string(field->type) || in parse_synth_field()
764 synth_field_is_stack(field->type)) { in parse_synth_field()
767 len = sizeof("__data_loc ") + strlen(field->type) + 1; in parse_synth_field()
774 seq_buf_puts(&s, field->type); in parse_synth_field()
780 kfree(field->type); in parse_synth_field()
781 field->type = type; in parse_synth_field()
783 field->is_dynamic = true; in parse_synth_field()
787 ret = -EINVAL; in parse_synth_field()
791 field->size = size; in parse_synth_field()
793 if (synth_field_is_string(field->type)) in parse_synth_field()
794 field->is_string = true; in parse_synth_field()
795 else if (synth_field_is_stack(field->type)) in parse_synth_field()
796 field->is_stack = true; in parse_synth_field()
798 field->is_signed = synth_field_signed(field->type); in parse_synth_field()
812 kfree(tp->name); in free_synth_tracepoint()
816 static struct tracepoint *alloc_synth_tracepoint(char *name) in alloc_synth_tracepoint() argument
822 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
824 tp->name = kstrdup(name, GFP_KERNEL); in alloc_synth_tracepoint()
825 if (!tp->name) { in alloc_synth_tracepoint()
827 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
833 struct synth_event *find_synth_event(const char *name) in find_synth_event() argument
836 struct synth_event *event; in find_synth_event() local
841 event = to_synth_event(pos); in find_synth_event()
842 if (strcmp(event->name, name) == 0) in find_synth_event()
843 return event; in find_synth_event()
855 static int register_synth_event(struct synth_event *event) in register_synth_event() argument
857 struct trace_event_call *call = &event->call; in register_synth_event()
860 event->call.class = &event->class; in register_synth_event()
861 event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL); in register_synth_event()
862 if (!event->class.system) { in register_synth_event()
863 ret = -ENOMEM; in register_synth_event()
867 event->tp = alloc_synth_tracepoint(event->name); in register_synth_event()
868 if (IS_ERR(event->tp)) { in register_synth_event()
869 ret = PTR_ERR(event->tp); in register_synth_event()
870 event->tp = NULL; in register_synth_event()
874 INIT_LIST_HEAD(&call->class->fields); in register_synth_event()
875 call->event.funcs = &synth_event_funcs; in register_synth_event()
876 call->class->fields_array = synth_event_fields_array; in register_synth_event()
878 ret = register_trace_event(&call->event); in register_synth_event()
880 ret = -ENODEV; in register_synth_event()
883 call->flags = TRACE_EVENT_FL_TRACEPOINT; in register_synth_event()
884 call->class->reg = trace_event_reg; in register_synth_event()
885 call->class->probe = trace_event_raw_event_synth; in register_synth_event()
886 call->data = event; in register_synth_event()
887 call->tp = event->tp; in register_synth_event()
891 pr_warn("Failed to register synthetic event: %s\n", in register_synth_event()
903 unregister_trace_event(&call->event); in register_synth_event()
907 static int unregister_synth_event(struct synth_event *event) in unregister_synth_event() argument
909 struct trace_event_call *call = &event->call; in unregister_synth_event()
917 static void free_synth_event(struct synth_event *event) in free_synth_event() argument
921 if (!event) in free_synth_event()
924 for (i = 0; i < event->n_fields; i++) in free_synth_event()
925 free_synth_field(event->fields[i]); in free_synth_event()
927 kfree(event->fields); in free_synth_event()
928 kfree(event->dynamic_fields); in free_synth_event()
929 kfree(event->name); in free_synth_event()
930 kfree(event->class.system); in free_synth_event()
931 free_synth_tracepoint(event->tp); in free_synth_event()
932 free_synth_event_print_fmt(&event->call); in free_synth_event()
933 kfree(event); in free_synth_event()
936 static struct synth_event *alloc_synth_event(const char *name, int n_fields, in alloc_synth_event() argument
940 struct synth_event *event; in alloc_synth_event() local
942 event = kzalloc(sizeof(*event), GFP_KERNEL); in alloc_synth_event()
943 if (!event) { in alloc_synth_event()
944 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
948 event->name = kstrdup(name, GFP_KERNEL); in alloc_synth_event()
949 if (!event->name) { in alloc_synth_event()
950 kfree(event); in alloc_synth_event()
951 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
955 event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL); in alloc_synth_event()
956 if (!event->fields) { in alloc_synth_event()
957 free_synth_event(event); in alloc_synth_event()
958 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
963 if (fields[i]->is_dynamic) in alloc_synth_event()
967 event->dynamic_fields = kcalloc(n_dynamic_fields, in alloc_synth_event()
968 sizeof(*event->dynamic_fields), in alloc_synth_event()
970 if (!event->dynamic_fields) { in alloc_synth_event()
971 free_synth_event(event); in alloc_synth_event()
972 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
977 dyn_event_init(&event->devent, &synth_event_ops); in alloc_synth_event()
980 fields[i]->field_pos = i; in alloc_synth_event()
981 event->fields[i] = fields[i]; in alloc_synth_event()
983 if (fields[i]->is_dynamic) in alloc_synth_event()
984 event->dynamic_fields[j++] = fields[i]; in alloc_synth_event()
986 event->n_dynamic_fields = j; in alloc_synth_event()
987 event->n_fields = n_fields; in alloc_synth_event()
989 return event; in alloc_synth_event()
997 size = synth_field_size((char *)arg_pair->lhs); in synth_event_check_arg_fn()
999 if (strstr((char *)arg_pair->lhs, "[")) in synth_event_check_arg_fn()
1003 return size ? 0 : -EINVAL; in synth_event_check_arg_fn()
1007 * synth_event_add_field - Add a new field to a synthetic event cmd
1008 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1010 * @name: The name of the new field to add
1012 * Add a new field to a synthetic event cmd object. Field ordering is in
1021 const char *name) in synth_event_add_field() argument
1026 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field()
1027 return -EINVAL; in synth_event_add_field()
1029 if (!type || !name) in synth_event_add_field()
1030 return -EINVAL; in synth_event_add_field()
1035 arg_pair.rhs = name; in synth_event_add_field()
1041 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field()
1042 ret = -EINVAL; in synth_event_add_field()
1049 * synth_event_add_field_str - Add a new field to a synthetic event cmd
1050 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1051 * @type_name: The type and name of the new field to add, as a single string
1053 * Add a new field to a synthetic event cmd object, as a single
1055 * name', which will be appended by ';'. No sanity checking is done -
1056 * what's passed in is assumed to already be well-formed. Field
1069 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field_str()
1070 return -EINVAL; in synth_event_add_field_str()
1073 return -EINVAL; in synth_event_add_field_str()
1083 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field_str()
1084 ret = -EINVAL; in synth_event_add_field_str()
1091 * synth_event_add_fields - Add multiple fields to a synthetic event cmd
1092 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1093 * @fields: An array of type/name field descriptions
1096 * Add a new set of fields to a synthetic event cmd object. The event
1097 * fields that will be defined for the event should be passed in as an
1115 if (fields[i].type == NULL || fields[i].name == NULL) { in synth_event_add_fields()
1116 ret = -EINVAL; in synth_event_add_fields()
1120 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_add_fields()
1130 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
1131 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1132 * @name: The name of the synthetic event
1133 * @mod: The module creating the event, NULL if not created from a module
1142 * Generate a synthetic event command to be executed by
1150 * of a type followed by a field name.
1157 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name, in __synth_event_gen_cmd_start() argument
1164 cmd->event_name = name; in __synth_event_gen_cmd_start()
1165 cmd->private_data = mod; in __synth_event_gen_cmd_start()
1167 if (cmd->type != DYNEVENT_TYPE_SYNTH) in __synth_event_gen_cmd_start()
1168 return -EINVAL; in __synth_event_gen_cmd_start()
1171 arg.str = name; in __synth_event_gen_cmd_start()
1178 const char *type, *name; in __synth_event_gen_cmd_start() local
1183 name = va_arg(args, const char *); in __synth_event_gen_cmd_start()
1184 if (!name) in __synth_event_gen_cmd_start()
1187 if (++cmd->n_fields > SYNTH_FIELDS_MAX) { in __synth_event_gen_cmd_start()
1188 ret = -EINVAL; in __synth_event_gen_cmd_start()
1192 ret = synth_event_add_field(cmd, type, name); in __synth_event_gen_cmd_start()
1203 * synth_event_gen_cmd_array_start - Start synthetic event command from an array
1204 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1205 * @name: The name of the synthetic event
1206 * @mod: The module creating the event, NULL if not created from a module
1207 * @fields: An array of type/name field descriptions
1210 * Generate a synthetic event command to be executed by
1217 * The event fields that will be defined for the event should be
1227 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name, in synth_event_gen_cmd_array_start() argument
1236 cmd->event_name = name; in synth_event_gen_cmd_array_start()
1237 cmd->private_data = mod; in synth_event_gen_cmd_array_start()
1239 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_gen_cmd_array_start()
1240 return -EINVAL; in synth_event_gen_cmd_array_start()
1243 return -EINVAL; in synth_event_gen_cmd_array_start()
1246 arg.str = name; in synth_event_gen_cmd_array_start()
1252 if (fields[i].type == NULL || fields[i].name == NULL) in synth_event_gen_cmd_array_start()
1253 return -EINVAL; in synth_event_gen_cmd_array_start()
1255 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_gen_cmd_array_start()
1264 static int __create_synth_event(const char *name, const char *raw_fields) in __create_synth_event() argument
1270 struct synth_event *event = NULL; in __create_synth_event() local
1274 * - Add synthetic event: <event_name> field[;field] ... in __create_synth_event()
1275 * - Remove synthetic event: !<event_name> field[;field] ... in __create_synth_event()
1279 if (name[0] == '\0') { in __create_synth_event()
1281 return -EINVAL; in __create_synth_event()
1284 if (!is_good_name(name)) { in __create_synth_event()
1285 synth_err(SYNTH_ERR_BAD_NAME, errpos(name)); in __create_synth_event()
1286 return -EINVAL; in __create_synth_event()
1291 event = find_synth_event(name); in __create_synth_event()
1292 if (event) { in __create_synth_event()
1293 synth_err(SYNTH_ERR_EVENT_EXISTS, errpos(name)); in __create_synth_event()
1294 ret = -EEXIST; in __create_synth_event()
1300 ret = -ENOMEM; in __create_synth_event()
1307 ret = -ENOMEM; in __create_synth_event()
1321 field = parse_synth_field(argc - consumed, in __create_synth_event()
1348 ret = -EINVAL; in __create_synth_event()
1354 ret = -EINVAL; in __create_synth_event()
1365 ret = -EINVAL; in __create_synth_event()
1373 ret = -EINVAL; in __create_synth_event()
1377 event = alloc_synth_event(name, n_fields, fields); in __create_synth_event()
1378 if (IS_ERR(event)) { in __create_synth_event()
1379 ret = PTR_ERR(event); in __create_synth_event()
1380 event = NULL; in __create_synth_event()
1383 ret = register_synth_event(event); in __create_synth_event()
1385 dyn_event_add(&event->devent, &event->call); in __create_synth_event()
1387 free_synth_event(event); in __create_synth_event()
1404 * synth_event_create - Create a new synthetic event
1405 * @name: The name of the new synthetic event
1406 * @fields: An array of type/name field descriptions
1408 * @mod: The module creating the event, NULL if not created from a module
1410 * Create a new synthetic event with the given name under the
1411 * trace/events/synthetic/ directory. The event fields that will be
1412 * defined for the event should be passed in as an array of struct
1417 * If the new synthetic event is being created from a module, the mod
1418 * param must be non-NULL. This will ensure that the trace buffer
1421 * The new synth event should be deleted using synth_event_delete()
1422 * function. The new synthetic event can be generated from modules or
1427 int synth_event_create(const char *name, struct synth_field_desc *fields, in synth_event_create() argument
1436 return -ENOMEM; in synth_event_create()
1440 ret = synth_event_gen_cmd_array_start(&cmd, name, mod, in synth_event_create()
1457 if (se->ref) in destroy_synth_event()
1458 return -EBUSY; in destroy_synth_event()
1460 if (trace_event_dyn_busy(&se->call)) in destroy_synth_event()
1461 return -EBUSY; in destroy_synth_event()
1465 dyn_event_remove(&se->devent); in destroy_synth_event()
1473 * synth_event_delete - Delete a synthetic event
1474 * @event_name: The name of the new synthetic event
1476 * Delete a synthetic event that was created with synth_event_create().
1484 int ret = -ENOENT; in synth_event_delete()
1489 mod = se->mod; in synth_event_delete()
1519 return -ENOMEM; in check_command()
1523 ret = -EINVAL; in check_command()
1532 ret = -ENOMEM; in check_command()
1538 ret = -EINVAL; in check_command()
1547 char *name = NULL, *fields, *p; in create_or_delete_synth_event() local
1565 ret = -EINVAL; in create_or_delete_synth_event()
1569 name = kmemdup_nul(raw_command, p ? p - raw_command : strlen(raw_command), GFP_KERNEL); in create_or_delete_synth_event()
1570 if (!name) in create_or_delete_synth_event()
1571 return -ENOMEM; in create_or_delete_synth_event()
1573 if (name[0] == '!') { in create_or_delete_synth_event()
1574 ret = synth_event_delete(name + 1); in create_or_delete_synth_event()
1580 ret = __create_synth_event(name, fields); in create_or_delete_synth_event()
1582 kfree(name); in create_or_delete_synth_event()
1592 ret = create_or_delete_synth_event(cmd->seq.buffer); in synth_event_run_command()
1596 se = find_synth_event(cmd->event_name); in synth_event_run_command()
1598 return -ENOENT; in synth_event_run_command()
1600 se->mod = cmd->private_data; in synth_event_run_command()
1606 * synth_event_cmd_init - Initialize a synthetic event command object
1607 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1611 * Initialize a synthetic event command object. Use this before
1630 * Normal event tracing doesn't get called at all unless the in __synth_event_trace_init()
1638 if (!(file->flags & EVENT_FILE_FL_ENABLED) || in __synth_event_trace_init()
1640 trace_state->disabled = true; in __synth_event_trace_init()
1641 ret = -ENOENT; in __synth_event_trace_init()
1645 trace_state->event = file->event_call->data; in __synth_event_trace_init()
1658 fields_size = trace_state->event->n_u64 * sizeof(u64); in __synth_event_trace_start()
1662 * Avoid ring buffer recursion detection, as this event in __synth_event_trace_start()
1663 * is being performed within another event. in __synth_event_trace_start()
1665 trace_state->buffer = file->tr->array_buffer.buffer; in __synth_event_trace_start()
1666 ring_buffer_nest_start(trace_state->buffer); in __synth_event_trace_start()
1668 entry_size = sizeof(*trace_state->entry) + fields_size; in __synth_event_trace_start()
1669 trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer, in __synth_event_trace_start()
1672 if (!trace_state->entry) { in __synth_event_trace_start()
1673 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_start()
1674 ret = -EINVAL; in __synth_event_trace_start()
1683 trace_event_buffer_commit(&trace_state->fbuffer); in __synth_event_trace_end()
1685 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_end()
1689 * synth_event_trace - Trace a synthetic event
1690 * @file: The trace_event_file representing the synthetic event
1692 * @...: Variable number of args containing the event values
1694 * Trace a synthetic event using the values passed in the variable
1698 * of vals must match the number of field in the synthetic event, and
1699 * must be in the same order as the synthetic event fields.
1703 * reserved in the event for the string, using these pointers.
1716 if (ret == -ENOENT) in synth_event_trace()
1721 if (state.event->n_dynamic_fields) { in synth_event_trace()
1724 for (i = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1727 if (state.event->fields[i]->is_string && in synth_event_trace()
1728 state.event->fields[i]->is_dynamic) { in synth_event_trace()
1742 if (n_vals != state.event->n_fields) { in synth_event_trace()
1743 ret = -EINVAL; in synth_event_trace()
1750 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1755 if (state.event->fields[i]->is_string) { in synth_event_trace()
1758 len = trace_string(state.entry, state.event, str_val, in synth_event_trace()
1759 state.event->fields[i]->is_dynamic, in synth_event_trace()
1763 struct synth_field *field = state.event->fields[i]; in synth_event_trace()
1765 switch (field->size) { in synth_event_trace()
1767 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace()
1771 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace()
1775 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace()
1779 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace()
1794 * synth_event_trace_array - Trace a synthetic event from an array
1795 * @file: The trace_event_file representing the synthetic event
1799 * Trace a synthetic event using the values passed in as 'vals'.
1802 * vals must match the number of field in the synthetic event, and
1803 * must be in the same order as the synthetic event fields.
1807 * reserved in the event for the string, using these pointers.
1821 if (ret == -ENOENT) in synth_event_trace_array()
1826 if (state.event->n_dynamic_fields) { in synth_event_trace_array()
1827 for (i = 0; i < state.event->n_dynamic_fields; i++) { in synth_event_trace_array()
1828 field_pos = state.event->dynamic_fields[i]->field_pos; in synth_event_trace_array()
1839 if (n_vals != state.event->n_fields) { in synth_event_trace_array()
1840 ret = -EINVAL; in synth_event_trace_array()
1846 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace_array()
1847 if (state.event->fields[i]->is_string) { in synth_event_trace_array()
1850 len = trace_string(state.entry, state.event, str_val, in synth_event_trace_array()
1851 state.event->fields[i]->is_dynamic, in synth_event_trace_array()
1855 struct synth_field *field = state.event->fields[i]; in synth_event_trace_array()
1858 switch (field->size) { in synth_event_trace_array()
1860 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace_array()
1864 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace_array()
1868 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace_array()
1872 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace_array()
1886 * synth_event_trace_start - Start piecewise synthetic event trace
1887 * @file: The trace_event_file representing the synthetic event
1890 * Start the trace of a synthetic event field-by-field rather than all
1893 * This function 'opens' an event trace, which means space is reserved
1894 * for the event in the trace buffer, after which the event's
1899 * track of the current event trace state until the event trace is
1900 * closed (and the event finally traced) using
1904 * have been added for each event trace, regardless of whether adding
1907 * Note also that for a given event trace, all fields must be added
1919 return -EINVAL; in synth_event_trace_start()
1923 if (ret == -ENOENT) in synth_event_trace_start()
1928 if (trace_state->event->n_dynamic_fields) in synth_event_trace_start()
1929 return -ENOTSUPP; in synth_event_trace_start()
1942 struct synth_event *event; in __synth_event_add_val() local
1946 ret = -EINVAL; in __synth_event_add_val()
1952 if (trace_state->add_next) { in __synth_event_add_val()
1953 ret = -EINVAL; in __synth_event_add_val()
1956 trace_state->add_name = true; in __synth_event_add_val()
1958 if (trace_state->add_name) { in __synth_event_add_val()
1959 ret = -EINVAL; in __synth_event_add_val()
1962 trace_state->add_next = true; in __synth_event_add_val()
1965 if (trace_state->disabled) in __synth_event_add_val()
1968 event = trace_state->event; in __synth_event_add_val()
1969 if (trace_state->add_name) { in __synth_event_add_val()
1970 for (i = 0; i < event->n_fields; i++) { in __synth_event_add_val()
1971 field = event->fields[i]; in __synth_event_add_val()
1972 if (strcmp(field->name, field_name) == 0) in __synth_event_add_val()
1976 ret = -EINVAL; in __synth_event_add_val()
1980 if (trace_state->cur_field >= event->n_fields) { in __synth_event_add_val()
1981 ret = -EINVAL; in __synth_event_add_val()
1984 field = event->fields[trace_state->cur_field++]; in __synth_event_add_val()
1987 entry = trace_state->entry; in __synth_event_add_val()
1988 if (field->is_string) { in __synth_event_add_val()
1992 if (field->is_dynamic) { /* add_val can't do dynamic strings */ in __synth_event_add_val()
1993 ret = -EINVAL; in __synth_event_add_val()
1998 ret = -EINVAL; in __synth_event_add_val()
2002 str_field = (char *)&entry->fields[field->offset]; in __synth_event_add_val()
2005 switch (field->size) { in __synth_event_add_val()
2007 trace_state->entry->fields[field->offset].as_u8 = (u8)val; in __synth_event_add_val()
2011 trace_state->entry->fields[field->offset].as_u16 = (u16)val; in __synth_event_add_val()
2015 trace_state->entry->fields[field->offset].as_u32 = (u32)val; in __synth_event_add_val()
2019 trace_state->entry->fields[field->offset].as_u64 = val; in __synth_event_add_val()
2028 * synth_event_add_next_val - Add the next field's value to an open synth trace
2032 * Set the value of the next field in an event that's been opened by
2038 * This function assumes all the fields in an event are to be set one
2039 * after another - successive calls to this function are made, one for
2040 * each field, in the order of the fields in the event, until all
2046 * synth_event_add_val() can't be intermixed for a given event trace -
2050 * values have been added for each event trace, regardless of whether
2063 * synth_event_add_val - Add a named field's value to an open synth trace
2064 * @field_name: The name of the synthetic event field value to set
2068 * Set the value of the named field in an event that's been opened by
2074 * This function looks up the field name, and if found, sets the field
2077 * none-piecewise synth_event_trace() instead if efficiency is more
2081 * synth_event_add_val() can't be intermixed for a given event trace -
2085 * values have been added for each event trace, regardless of whether
2098 * synth_event_trace_end - End piecewise synthetic event trace
2101 * End the trace of a synthetic event opened by
2104 * This function 'closes' an event trace, which basically means that
2105 * it commits the reserved event and cleans up other loose ends.
2108 * track of the current event trace state opened with
2112 * added for each event trace, regardless of whether adding all field
2120 return -EINVAL; in synth_event_trace_end()
2131 const char *name; in create_synth_event() local
2140 name = raw_command; in create_synth_event()
2143 if (name[0] != 's' || name[1] != ':') in create_synth_event()
2144 return -ECANCELED; in create_synth_event()
2145 name += 2; in create_synth_event()
2150 return -EINVAL; in create_synth_event()
2155 /* This interface accepts group name prefix */ in create_synth_event()
2156 if (strchr(name, '/')) { in create_synth_event()
2157 len = str_has_prefix(name, SYNTH_SYSTEM "/"); in create_synth_event()
2160 return -EINVAL; in create_synth_event()
2162 name += len; in create_synth_event()
2165 len = name - raw_command; in create_synth_event()
2173 name = kmemdup_nul(raw_command + len, p - raw_command - len, GFP_KERNEL); in create_synth_event()
2174 if (!name) in create_synth_event()
2175 return -ENOMEM; in create_synth_event()
2177 ret = __create_synth_event(name, fields); in create_synth_event()
2179 kfree(name); in create_synth_event()
2186 struct synth_event *event = to_synth_event(ev); in synth_event_release() local
2189 if (event->ref) in synth_event_release()
2190 return -EBUSY; in synth_event_release()
2192 if (trace_event_dyn_busy(&event->call)) in synth_event_release()
2193 return -EBUSY; in synth_event_release()
2195 ret = unregister_synth_event(event); in synth_event_release()
2200 free_synth_event(event); in synth_event_release()
2204 static int __synth_event_show(struct seq_file *m, struct synth_event *event) in __synth_event_show() argument
2210 seq_printf(m, "%s\t", event->name); in __synth_event_show()
2212 for (i = 0; i < event->n_fields; i++) { in __synth_event_show()
2213 field = event->fields[i]; in __synth_event_show()
2215 type = field->type; in __synth_event_show()
2217 if (t) { /* __data_loc belongs in format but not event desc */ in __synth_event_show()
2223 seq_printf(m, "%s %s%s", type, field->name, in __synth_event_show()
2224 i == event->n_fields - 1 ? "" : "; "); in __synth_event_show()
2234 struct synth_event *event = to_synth_event(ev); in synth_event_show() local
2236 seq_printf(m, "s:%s/", event->class.system); in synth_event_show()
2238 return __synth_event_show(m, event); in synth_event_show()
2266 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { in synth_events_open()
2318 err = -ENODEV; in trace_events_synth_init()