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()
373 (char *)entry + data->as_dynamic.offset, in print_synth_event()
374 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
377 trace_seq_printf(s, print_fmt, se->fields[i]->name, in print_synth_event()
379 (char *)&entry->fields[n_u64].as_u64, in print_synth_event()
380 i == se->n_fields - 1 ? "" : " "); in print_synth_event()
383 } else if (se->fields[i]->is_stack) { in print_synth_event()
384 union trace_synth_field *data = &entry->fields[n_u64]; in print_synth_event()
385 unsigned long *p = (void *)entry + data->as_dynamic.offset; in print_synth_event()
387 trace_seq_printf(s, "%s=STACK:\n", se->fields[i]->name); in print_synth_event()
388 for (j = 1; j < data->as_dynamic.len / sizeof(long); j++) in print_synth_event()
393 __def_gfpflag_names, {-1, NULL} }; in print_synth_event()
394 char *space = (i == se->n_fields - 1 ? "" : " "); in print_synth_event()
397 se->fields[i]->name, in print_synth_event()
398 se->fields[i]->size, in print_synth_event()
399 &entry->fields[n_u64], in print_synth_event()
402 if (strcmp(se->fields[i]->type, "gfp_t") == 0) { in print_synth_event()
405 entry->fields[n_u64].as_u64, in print_synth_event()
423 struct synth_event *event, in trace_string() argument
434 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_string()
437 data->as_dynamic.offset = struct_size(entry, fields, event->n_u64) + data_size; in trace_string()
438 data->as_dynamic.len = len; in trace_string()
440 ret = fetch_store_string((unsigned long)str_val, &entry->fields[*n_u64], entry); in trace_string()
444 str_field = (char *)&entry->fields[*n_u64].as_u64; in trace_string()
463 struct synth_event *event, in trace_stack() argument
468 union trace_synth_field *data = &entry->fields[*n_u64]; in trace_stack()
473 data_offset = struct_size(entry, fields, event->n_u64); in trace_stack()
489 data->as_dynamic.offset = data_offset; in trace_stack()
490 data->as_dynamic.len = len; in trace_stack()
506 struct synth_event *event; in trace_event_raw_event_synth() local
509 event = trace_file->event_call->data; in trace_event_raw_event_synth()
514 fields_size = event->n_u64 * sizeof(u64); in trace_event_raw_event_synth()
516 for (i = 0; i < event->n_dynamic_fields; i++) { in trace_event_raw_event_synth()
517 unsigned int field_pos = event->dynamic_fields[i]->field_pos; in trace_event_raw_event_synth()
523 if (event->dynamic_fields[i]->is_stack) { in trace_event_raw_event_synth()
535 * Avoid ring buffer recursion detection, as this event in trace_event_raw_event_synth()
536 * is being performed within another event. in trace_event_raw_event_synth()
538 buffer = trace_file->tr->array_buffer.buffer; in trace_event_raw_event_synth()
546 for (i = 0, n_u64 = 0; i < event->n_fields; i++) { in trace_event_raw_event_synth()
548 if (event->fields[i]->is_string) { in trace_event_raw_event_synth()
551 len = trace_string(entry, event, str_val, in trace_event_raw_event_synth()
552 event->fields[i]->is_dynamic, in trace_event_raw_event_synth()
555 } else if (event->fields[i]->is_stack) { in trace_event_raw_event_synth()
558 len = trace_stack(entry, event, stack, in trace_event_raw_event_synth()
562 struct synth_field *field = event->fields[i]; in trace_event_raw_event_synth()
565 switch (field->size) { in trace_event_raw_event_synth()
567 entry->fields[n_u64].as_u8 = (u8)val; in trace_event_raw_event_synth()
571 entry->fields[n_u64].as_u16 = (u16)val; in trace_event_raw_event_synth()
575 entry->fields[n_u64].as_u32 = (u32)val; in trace_event_raw_event_synth()
579 entry->fields[n_u64].as_u64 = val; in trace_event_raw_event_synth()
594 kfree(call->print_fmt); in free_synth_event_print_fmt()
595 call->print_fmt = NULL; in free_synth_event_print_fmt()
599 static int __set_synth_event_print_fmt(struct synth_event *event, in __set_synth_event_print_fmt() argument
607 #define LEN_OR_ZERO (len ? len - pos : 0) in __set_synth_event_print_fmt()
610 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
611 fmt = synth_field_fmt(event->fields[i]->type); in __set_synth_event_print_fmt()
613 event->fields[i]->name, fmt, in __set_synth_event_print_fmt()
614 i == event->n_fields - 1 ? "" : ", "); in __set_synth_event_print_fmt()
618 for (i = 0; i < event->n_fields; i++) { in __set_synth_event_print_fmt()
619 if (event->fields[i]->is_string && in __set_synth_event_print_fmt()
620 event->fields[i]->is_dynamic) in __set_synth_event_print_fmt()
622 ", __get_str(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
623 else if (event->fields[i]->is_stack) in __set_synth_event_print_fmt()
625 ", __get_stacktrace(%s)", event->fields[i]->name); in __set_synth_event_print_fmt()
628 ", REC->%s", event->fields[i]->name); in __set_synth_event_print_fmt()
639 struct synth_event *event = call->data; in set_synth_event_print_fmt() local
644 len = __set_synth_event_print_fmt(event, NULL, 0); in set_synth_event_print_fmt()
648 return -ENOMEM; in set_synth_event_print_fmt()
651 __set_synth_event_print_fmt(event, print_fmt, len + 1); in set_synth_event_print_fmt()
652 call->print_fmt = print_fmt; in set_synth_event_print_fmt()
659 kfree(field->type); in free_synth_field()
660 kfree(field->name); in free_synth_field()
668 * For backward compatibility, the old synthetic event command in check_field_version()
686 int len, ret = -ENOMEM; in parse_synth_field()
693 return ERR_PTR(-EINVAL); in parse_synth_field()
706 return ERR_PTR(-EINVAL); in parse_synth_field()
713 return ERR_PTR(-ENOMEM); in parse_synth_field()
718 len -= strlen(array); in parse_synth_field()
720 field->name = kmemdup_nul(field_name, len, GFP_KERNEL); in parse_synth_field()
721 if (!field->name) in parse_synth_field()
724 if (!is_good_name(field->name)) { in parse_synth_field()
726 ret = -EINVAL; in parse_synth_field()
738 field->type = kzalloc(len, GFP_KERNEL); in parse_synth_field()
739 if (!field->type) in parse_synth_field()
742 seq_buf_init(&s, field->type, len); in parse_synth_field()
753 size = synth_field_size(field->type); in parse_synth_field()
759 ret = -EINVAL; in parse_synth_field()
762 if (synth_field_is_string(field->type) || in parse_synth_field()
763 synth_field_is_stack(field->type)) { in parse_synth_field()
766 len = sizeof("__data_loc ") + strlen(field->type) + 1; in parse_synth_field()
773 seq_buf_puts(&s, field->type); in parse_synth_field()
779 kfree(field->type); in parse_synth_field()
780 field->type = type; in parse_synth_field()
782 field->is_dynamic = true; in parse_synth_field()
786 ret = -EINVAL; in parse_synth_field()
790 field->size = size; in parse_synth_field()
792 if (synth_field_is_string(field->type)) in parse_synth_field()
793 field->is_string = true; in parse_synth_field()
794 else if (synth_field_is_stack(field->type)) in parse_synth_field()
795 field->is_stack = true; in parse_synth_field()
797 field->is_signed = synth_field_signed(field->type); in parse_synth_field()
811 kfree(tp->name); in free_synth_tracepoint()
815 static struct tracepoint *alloc_synth_tracepoint(char *name) in alloc_synth_tracepoint() argument
821 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
823 tp->name = kstrdup(name, GFP_KERNEL); in alloc_synth_tracepoint()
824 if (!tp->name) { in alloc_synth_tracepoint()
826 return ERR_PTR(-ENOMEM); in alloc_synth_tracepoint()
832 struct synth_event *find_synth_event(const char *name) in find_synth_event() argument
835 struct synth_event *event; in find_synth_event() local
840 event = to_synth_event(pos); in find_synth_event()
841 if (strcmp(event->name, name) == 0) in find_synth_event()
842 return event; in find_synth_event()
857 struct synth_event *event = container_of(call, struct synth_event, call); in synth_event_reg() local
864 if (!try_module_get(event->mod)) in synth_event_reg()
865 return -EBUSY; in synth_event_reg()
878 module_put(event->mod); in synth_event_reg()
886 static int register_synth_event(struct synth_event *event) in register_synth_event() argument
888 struct trace_event_call *call = &event->call; in register_synth_event()
891 event->call.class = &event->class; in register_synth_event()
892 event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL); in register_synth_event()
893 if (!event->class.system) { in register_synth_event()
894 ret = -ENOMEM; in register_synth_event()
898 event->tp = alloc_synth_tracepoint(event->name); in register_synth_event()
899 if (IS_ERR(event->tp)) { in register_synth_event()
900 ret = PTR_ERR(event->tp); in register_synth_event()
901 event->tp = NULL; in register_synth_event()
905 INIT_LIST_HEAD(&call->class->fields); in register_synth_event()
906 call->event.funcs = &synth_event_funcs; in register_synth_event()
907 call->class->fields_array = synth_event_fields_array; in register_synth_event()
909 ret = register_trace_event(&call->event); in register_synth_event()
911 ret = -ENODEV; in register_synth_event()
914 call->flags = TRACE_EVENT_FL_TRACEPOINT; in register_synth_event()
915 call->class->reg = synth_event_reg; in register_synth_event()
916 call->class->probe = trace_event_raw_event_synth; in register_synth_event()
917 call->data = event; in register_synth_event()
918 call->tp = event->tp; in register_synth_event()
922 pr_warn("Failed to register synthetic event: %s\n", in register_synth_event()
934 unregister_trace_event(&call->event); in register_synth_event()
938 static int unregister_synth_event(struct synth_event *event) in unregister_synth_event() argument
940 struct trace_event_call *call = &event->call; in unregister_synth_event()
948 static void free_synth_event(struct synth_event *event) in free_synth_event() argument
952 if (!event) in free_synth_event()
955 for (i = 0; i < event->n_fields; i++) in free_synth_event()
956 free_synth_field(event->fields[i]); in free_synth_event()
958 kfree(event->fields); in free_synth_event()
959 kfree(event->dynamic_fields); in free_synth_event()
960 kfree(event->name); in free_synth_event()
961 kfree(event->class.system); in free_synth_event()
962 free_synth_tracepoint(event->tp); in free_synth_event()
963 free_synth_event_print_fmt(&event->call); in free_synth_event()
964 kfree(event); in free_synth_event()
967 static struct synth_event *alloc_synth_event(const char *name, int n_fields, in alloc_synth_event() argument
971 struct synth_event *event; in alloc_synth_event() local
973 event = kzalloc(sizeof(*event), GFP_KERNEL); in alloc_synth_event()
974 if (!event) { in alloc_synth_event()
975 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
979 event->name = kstrdup(name, GFP_KERNEL); in alloc_synth_event()
980 if (!event->name) { in alloc_synth_event()
981 kfree(event); in alloc_synth_event()
982 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
986 event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL); in alloc_synth_event()
987 if (!event->fields) { in alloc_synth_event()
988 free_synth_event(event); in alloc_synth_event()
989 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
994 if (fields[i]->is_dynamic) in alloc_synth_event()
998 event->dynamic_fields = kcalloc(n_dynamic_fields, in alloc_synth_event()
999 sizeof(*event->dynamic_fields), in alloc_synth_event()
1001 if (!event->dynamic_fields) { in alloc_synth_event()
1002 free_synth_event(event); in alloc_synth_event()
1003 event = ERR_PTR(-ENOMEM); in alloc_synth_event()
1008 dyn_event_init(&event->devent, &synth_event_ops); in alloc_synth_event()
1011 fields[i]->field_pos = i; in alloc_synth_event()
1012 event->fields[i] = fields[i]; in alloc_synth_event()
1014 if (fields[i]->is_dynamic) in alloc_synth_event()
1015 event->dynamic_fields[j++] = fields[i]; in alloc_synth_event()
1017 event->n_dynamic_fields = j; in alloc_synth_event()
1018 event->n_fields = n_fields; in alloc_synth_event()
1020 return event; in alloc_synth_event()
1028 size = synth_field_size((char *)arg_pair->lhs); in synth_event_check_arg_fn()
1030 if (strstr((char *)arg_pair->lhs, "[")) in synth_event_check_arg_fn()
1034 return size ? 0 : -EINVAL; in synth_event_check_arg_fn()
1038 * synth_event_add_field - Add a new field to a synthetic event cmd
1039 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1041 * @name: The name of the new field to add
1043 * Add a new field to a synthetic event cmd object. Field ordering is in
1052 const char *name) in synth_event_add_field() argument
1057 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field()
1058 return -EINVAL; in synth_event_add_field()
1060 if (!type || !name) in synth_event_add_field()
1061 return -EINVAL; in synth_event_add_field()
1066 arg_pair.rhs = name; in synth_event_add_field()
1072 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field()
1073 ret = -EINVAL; in synth_event_add_field()
1080 * synth_event_add_field_str - Add a new field to a synthetic event cmd
1081 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1082 * @type_name: The type and name of the new field to add, as a single string
1084 * Add a new field to a synthetic event cmd object, as a single
1086 * name', which will be appended by ';'. No sanity checking is done -
1087 * what's passed in is assumed to already be well-formed. Field
1100 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_add_field_str()
1101 return -EINVAL; in synth_event_add_field_str()
1104 return -EINVAL; in synth_event_add_field_str()
1114 if (++cmd->n_fields > SYNTH_FIELDS_MAX) in synth_event_add_field_str()
1115 ret = -EINVAL; in synth_event_add_field_str()
1122 * synth_event_add_fields - Add multiple fields to a synthetic event cmd
1123 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1124 * @fields: An array of type/name field descriptions
1127 * Add a new set of fields to a synthetic event cmd object. The event
1128 * fields that will be defined for the event should be passed in as an
1146 if (fields[i].type == NULL || fields[i].name == NULL) { in synth_event_add_fields()
1147 ret = -EINVAL; in synth_event_add_fields()
1151 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_add_fields()
1161 * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
1162 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1163 * @name: The name of the synthetic event
1164 * @mod: The module creating the event, NULL if not created from a module
1173 * Generate a synthetic event command to be executed by
1181 * of a type followed by a field name.
1188 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name, in __synth_event_gen_cmd_start() argument
1195 cmd->event_name = name; in __synth_event_gen_cmd_start()
1196 cmd->private_data = mod; in __synth_event_gen_cmd_start()
1198 if (cmd->type != DYNEVENT_TYPE_SYNTH) in __synth_event_gen_cmd_start()
1199 return -EINVAL; in __synth_event_gen_cmd_start()
1202 arg.str = name; in __synth_event_gen_cmd_start()
1209 const char *type, *name; in __synth_event_gen_cmd_start() local
1214 name = va_arg(args, const char *); in __synth_event_gen_cmd_start()
1215 if (!name) in __synth_event_gen_cmd_start()
1218 if (++cmd->n_fields > SYNTH_FIELDS_MAX) { in __synth_event_gen_cmd_start()
1219 ret = -EINVAL; in __synth_event_gen_cmd_start()
1223 ret = synth_event_add_field(cmd, type, name); in __synth_event_gen_cmd_start()
1234 * synth_event_gen_cmd_array_start - Start synthetic event command from an array
1235 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1236 * @name: The name of the synthetic event
1237 * @mod: The module creating the event, NULL if not created from a module
1238 * @fields: An array of type/name field descriptions
1241 * Generate a synthetic event command to be executed by
1248 * The event fields that will be defined for the event should be
1258 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name, in synth_event_gen_cmd_array_start() argument
1267 cmd->event_name = name; in synth_event_gen_cmd_array_start()
1268 cmd->private_data = mod; in synth_event_gen_cmd_array_start()
1270 if (cmd->type != DYNEVENT_TYPE_SYNTH) in synth_event_gen_cmd_array_start()
1271 return -EINVAL; in synth_event_gen_cmd_array_start()
1274 return -EINVAL; in synth_event_gen_cmd_array_start()
1277 arg.str = name; in synth_event_gen_cmd_array_start()
1283 if (fields[i].type == NULL || fields[i].name == NULL) in synth_event_gen_cmd_array_start()
1284 return -EINVAL; in synth_event_gen_cmd_array_start()
1286 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name); in synth_event_gen_cmd_array_start()
1295 static int __create_synth_event(const char *name, const char *raw_fields) in __create_synth_event() argument
1301 struct synth_event *event = NULL; in __create_synth_event() local
1305 * - Add synthetic event: <event_name> field[;field] ... in __create_synth_event()
1306 * - Remove synthetic event: !<event_name> field[;field] ... in __create_synth_event()
1310 if (name[0] == '\0') { in __create_synth_event()
1312 return -EINVAL; in __create_synth_event()
1315 if (!is_good_name(name)) { in __create_synth_event()
1316 synth_err(SYNTH_ERR_BAD_NAME, errpos(name)); in __create_synth_event()
1317 return -EINVAL; in __create_synth_event()
1322 event = find_synth_event(name); in __create_synth_event()
1323 if (event) { in __create_synth_event()
1324 synth_err(SYNTH_ERR_EVENT_EXISTS, errpos(name)); in __create_synth_event()
1325 ret = -EEXIST; in __create_synth_event()
1331 ret = -ENOMEM; in __create_synth_event()
1338 ret = -ENOMEM; in __create_synth_event()
1352 field = parse_synth_field(argc - consumed, in __create_synth_event()
1379 ret = -EINVAL; in __create_synth_event()
1385 ret = -EINVAL; in __create_synth_event()
1396 ret = -EINVAL; in __create_synth_event()
1404 ret = -EINVAL; in __create_synth_event()
1408 event = alloc_synth_event(name, n_fields, fields); in __create_synth_event()
1409 if (IS_ERR(event)) { in __create_synth_event()
1410 ret = PTR_ERR(event); in __create_synth_event()
1411 event = NULL; in __create_synth_event()
1414 ret = register_synth_event(event); in __create_synth_event()
1416 dyn_event_add(&event->devent, &event->call); in __create_synth_event()
1418 free_synth_event(event); in __create_synth_event()
1435 * synth_event_create - Create a new synthetic event
1436 * @name: The name of the new synthetic event
1437 * @fields: An array of type/name field descriptions
1439 * @mod: The module creating the event, NULL if not created from a module
1441 * Create a new synthetic event with the given name under the
1442 * trace/events/synthetic/ directory. The event fields that will be
1443 * defined for the event should be passed in as an array of struct
1448 * If the new synthetic event is being created from a module, the mod
1449 * param must be non-NULL. This will ensure that the trace buffer
1452 * The new synth event should be deleted using synth_event_delete()
1453 * function. The new synthetic event can be generated from modules or
1458 int synth_event_create(const char *name, struct synth_field_desc *fields, in synth_event_create() argument
1467 return -ENOMEM; in synth_event_create()
1471 ret = synth_event_gen_cmd_array_start(&cmd, name, mod, in synth_event_create()
1488 if (se->ref) in destroy_synth_event()
1489 return -EBUSY; in destroy_synth_event()
1491 if (trace_event_dyn_busy(&se->call)) in destroy_synth_event()
1492 return -EBUSY; in destroy_synth_event()
1496 dyn_event_remove(&se->devent); in destroy_synth_event()
1504 * synth_event_delete - Delete a synthetic event
1505 * @event_name: The name of the new synthetic event
1507 * Delete a synthetic event that was created with synth_event_create().
1515 int ret = -ENOENT; in synth_event_delete()
1520 mod = se->mod; in synth_event_delete()
1550 return -ENOMEM; in check_command()
1554 ret = -EINVAL; in check_command()
1563 ret = -ENOMEM; in check_command()
1569 ret = -EINVAL; in check_command()
1578 char *name = NULL, *fields, *p; in create_or_delete_synth_event() local
1596 ret = -EINVAL; in create_or_delete_synth_event()
1600 name = kmemdup_nul(raw_command, p ? p - raw_command : strlen(raw_command), GFP_KERNEL); in create_or_delete_synth_event()
1601 if (!name) in create_or_delete_synth_event()
1602 return -ENOMEM; in create_or_delete_synth_event()
1604 if (name[0] == '!') { in create_or_delete_synth_event()
1605 ret = synth_event_delete(name + 1); in create_or_delete_synth_event()
1611 ret = __create_synth_event(name, fields); in create_or_delete_synth_event()
1613 kfree(name); in create_or_delete_synth_event()
1623 ret = create_or_delete_synth_event(cmd->seq.buffer); in synth_event_run_command()
1627 se = find_synth_event(cmd->event_name); in synth_event_run_command()
1629 return -ENOENT; in synth_event_run_command()
1631 se->mod = cmd->private_data; in synth_event_run_command()
1637 * synth_event_cmd_init - Initialize a synthetic event command object
1638 * @cmd: A pointer to the dynevent_cmd struct representing the new event
1642 * Initialize a synthetic event command object. Use this before
1661 * Normal event tracing doesn't get called at all unless the in __synth_event_trace_init()
1669 if (!(file->flags & EVENT_FILE_FL_ENABLED) || in __synth_event_trace_init()
1671 trace_state->disabled = true; in __synth_event_trace_init()
1672 ret = -ENOENT; in __synth_event_trace_init()
1676 trace_state->event = file->event_call->data; in __synth_event_trace_init()
1689 fields_size = trace_state->event->n_u64 * sizeof(u64); in __synth_event_trace_start()
1693 * Avoid ring buffer recursion detection, as this event in __synth_event_trace_start()
1694 * is being performed within another event. in __synth_event_trace_start()
1696 trace_state->buffer = file->tr->array_buffer.buffer; in __synth_event_trace_start()
1697 ring_buffer_nest_start(trace_state->buffer); in __synth_event_trace_start()
1699 entry_size = sizeof(*trace_state->entry) + fields_size; in __synth_event_trace_start()
1700 trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer, in __synth_event_trace_start()
1703 if (!trace_state->entry) { in __synth_event_trace_start()
1704 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_start()
1705 ret = -EINVAL; in __synth_event_trace_start()
1714 trace_event_buffer_commit(&trace_state->fbuffer); in __synth_event_trace_end()
1716 ring_buffer_nest_end(trace_state->buffer); in __synth_event_trace_end()
1720 * synth_event_trace - Trace a synthetic event
1721 * @file: The trace_event_file representing the synthetic event
1723 * @...: Variable number of args containing the event values
1725 * Trace a synthetic event using the values passed in the variable
1729 * of vals must match the number of field in the synthetic event, and
1730 * must be in the same order as the synthetic event fields.
1734 * reserved in the event for the string, using these pointers.
1747 if (ret == -ENOENT) in synth_event_trace()
1752 if (state.event->n_dynamic_fields) { in synth_event_trace()
1755 for (i = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1758 if (state.event->fields[i]->is_string && in synth_event_trace()
1759 state.event->fields[i]->is_dynamic) { in synth_event_trace()
1773 if (n_vals != state.event->n_fields) { in synth_event_trace()
1774 ret = -EINVAL; in synth_event_trace()
1781 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace()
1786 if (state.event->fields[i]->is_string) { in synth_event_trace()
1789 len = trace_string(state.entry, state.event, str_val, in synth_event_trace()
1790 state.event->fields[i]->is_dynamic, in synth_event_trace()
1794 struct synth_field *field = state.event->fields[i]; in synth_event_trace()
1796 switch (field->size) { in synth_event_trace()
1798 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace()
1802 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace()
1806 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace()
1810 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace()
1825 * synth_event_trace_array - Trace a synthetic event from an array
1826 * @file: The trace_event_file representing the synthetic event
1830 * Trace a synthetic event using the values passed in as 'vals'.
1833 * vals must match the number of field in the synthetic event, and
1834 * must be in the same order as the synthetic event fields.
1838 * reserved in the event for the string, using these pointers.
1852 if (ret == -ENOENT) in synth_event_trace_array()
1857 if (state.event->n_dynamic_fields) { in synth_event_trace_array()
1858 for (i = 0; i < state.event->n_dynamic_fields; i++) { in synth_event_trace_array()
1859 field_pos = state.event->dynamic_fields[i]->field_pos; in synth_event_trace_array()
1870 if (n_vals != state.event->n_fields) { in synth_event_trace_array()
1871 ret = -EINVAL; in synth_event_trace_array()
1877 for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) { in synth_event_trace_array()
1878 if (state.event->fields[i]->is_string) { in synth_event_trace_array()
1881 len = trace_string(state.entry, state.event, str_val, in synth_event_trace_array()
1882 state.event->fields[i]->is_dynamic, in synth_event_trace_array()
1886 struct synth_field *field = state.event->fields[i]; in synth_event_trace_array()
1889 switch (field->size) { in synth_event_trace_array()
1891 state.entry->fields[n_u64].as_u8 = (u8)val; in synth_event_trace_array()
1895 state.entry->fields[n_u64].as_u16 = (u16)val; in synth_event_trace_array()
1899 state.entry->fields[n_u64].as_u32 = (u32)val; in synth_event_trace_array()
1903 state.entry->fields[n_u64].as_u64 = val; in synth_event_trace_array()
1917 * synth_event_trace_start - Start piecewise synthetic event trace
1918 * @file: The trace_event_file representing the synthetic event
1921 * Start the trace of a synthetic event field-by-field rather than all
1924 * This function 'opens' an event trace, which means space is reserved
1925 * for the event in the trace buffer, after which the event's
1930 * track of the current event trace state until the event trace is
1931 * closed (and the event finally traced) using
1935 * have been added for each event trace, regardless of whether adding
1938 * Note also that for a given event trace, all fields must be added
1950 return -EINVAL; in synth_event_trace_start()
1954 if (ret == -ENOENT) in synth_event_trace_start()
1959 if (trace_state->event->n_dynamic_fields) in synth_event_trace_start()
1960 return -ENOTSUPP; in synth_event_trace_start()
1973 struct synth_event *event; in __synth_event_add_val() local
1977 ret = -EINVAL; in __synth_event_add_val()
1983 if (trace_state->add_next) { in __synth_event_add_val()
1984 ret = -EINVAL; in __synth_event_add_val()
1987 trace_state->add_name = true; in __synth_event_add_val()
1989 if (trace_state->add_name) { in __synth_event_add_val()
1990 ret = -EINVAL; in __synth_event_add_val()
1993 trace_state->add_next = true; in __synth_event_add_val()
1996 if (trace_state->disabled) in __synth_event_add_val()
1999 event = trace_state->event; in __synth_event_add_val()
2000 if (trace_state->add_name) { in __synth_event_add_val()
2001 for (i = 0; i < event->n_fields; i++) { in __synth_event_add_val()
2002 field = event->fields[i]; in __synth_event_add_val()
2003 if (strcmp(field->name, field_name) == 0) in __synth_event_add_val()
2007 ret = -EINVAL; in __synth_event_add_val()
2011 if (trace_state->cur_field >= event->n_fields) { in __synth_event_add_val()
2012 ret = -EINVAL; in __synth_event_add_val()
2015 field = event->fields[trace_state->cur_field++]; in __synth_event_add_val()
2018 entry = trace_state->entry; in __synth_event_add_val()
2019 if (field->is_string) { in __synth_event_add_val()
2023 if (field->is_dynamic) { /* add_val can't do dynamic strings */ in __synth_event_add_val()
2024 ret = -EINVAL; in __synth_event_add_val()
2029 ret = -EINVAL; in __synth_event_add_val()
2033 str_field = (char *)&entry->fields[field->offset]; in __synth_event_add_val()
2036 switch (field->size) { in __synth_event_add_val()
2038 trace_state->entry->fields[field->offset].as_u8 = (u8)val; in __synth_event_add_val()
2042 trace_state->entry->fields[field->offset].as_u16 = (u16)val; in __synth_event_add_val()
2046 trace_state->entry->fields[field->offset].as_u32 = (u32)val; in __synth_event_add_val()
2050 trace_state->entry->fields[field->offset].as_u64 = val; in __synth_event_add_val()
2059 * synth_event_add_next_val - Add the next field's value to an open synth trace
2063 * Set the value of the next field in an event that's been opened by
2069 * This function assumes all the fields in an event are to be set one
2070 * after another - successive calls to this function are made, one for
2071 * each field, in the order of the fields in the event, until all
2077 * synth_event_add_val() can't be intermixed for a given event trace -
2081 * values have been added for each event trace, regardless of whether
2094 * synth_event_add_val - Add a named field's value to an open synth trace
2095 * @field_name: The name of the synthetic event field value to set
2099 * Set the value of the named field in an event that's been opened by
2105 * This function looks up the field name, and if found, sets the field
2108 * none-piecewise synth_event_trace() instead if efficiency is more
2112 * synth_event_add_val() can't be intermixed for a given event trace -
2116 * values have been added for each event trace, regardless of whether
2129 * synth_event_trace_end - End piecewise synthetic event trace
2132 * End the trace of a synthetic event opened by
2135 * This function 'closes' an event trace, which basically means that
2136 * it commits the reserved event and cleans up other loose ends.
2139 * track of the current event trace state opened with
2143 * added for each event trace, regardless of whether adding all field
2151 return -EINVAL; in synth_event_trace_end()
2162 const char *name; in create_synth_event() local
2171 name = raw_command; in create_synth_event()
2174 if (name[0] != 's' || name[1] != ':') in create_synth_event()
2175 return -ECANCELED; in create_synth_event()
2176 name += 2; in create_synth_event()
2181 return -EINVAL; in create_synth_event()
2186 /* This interface accepts group name prefix */ in create_synth_event()
2187 if (strchr(name, '/')) { in create_synth_event()
2188 len = str_has_prefix(name, SYNTH_SYSTEM "/"); in create_synth_event()
2191 return -EINVAL; in create_synth_event()
2193 name += len; in create_synth_event()
2196 len = name - raw_command; in create_synth_event()
2204 name = kmemdup_nul(raw_command + len, p - raw_command - len, GFP_KERNEL); in create_synth_event()
2205 if (!name) in create_synth_event()
2206 return -ENOMEM; in create_synth_event()
2208 ret = __create_synth_event(name, fields); in create_synth_event()
2210 kfree(name); in create_synth_event()
2217 struct synth_event *event = to_synth_event(ev); in synth_event_release() local
2220 if (event->ref) in synth_event_release()
2221 return -EBUSY; in synth_event_release()
2223 if (trace_event_dyn_busy(&event->call)) in synth_event_release()
2224 return -EBUSY; in synth_event_release()
2226 ret = unregister_synth_event(event); in synth_event_release()
2231 free_synth_event(event); in synth_event_release()
2235 static int __synth_event_show(struct seq_file *m, struct synth_event *event) in __synth_event_show() argument
2241 seq_printf(m, "%s\t", event->name); in __synth_event_show()
2243 for (i = 0; i < event->n_fields; i++) { in __synth_event_show()
2244 field = event->fields[i]; in __synth_event_show()
2246 type = field->type; in __synth_event_show()
2248 if (t) { /* __data_loc belongs in format but not event desc */ in __synth_event_show()
2254 seq_printf(m, "%s %s%s", type, field->name, in __synth_event_show()
2255 i == event->n_fields - 1 ? "" : "; "); in __synth_event_show()
2265 struct synth_event *event = to_synth_event(ev); in synth_event_show() local
2267 seq_printf(m, "s:%s/", event->class.system); in synth_event_show()
2269 return __synth_event_show(m, event); in synth_event_show()
2297 if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) { in synth_events_open()
2349 err = -ENODEV; in trace_events_synth_init()