blktrace: make function blk_trace_bio_get_cgid() static
[linux-2.6-microblaze.git] / kernel / trace / trace_events_synth.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * trace_events_synth - synthetic trace events
4  *
5  * Copyright (C) 2015, 2020 Tom Zanussi <tom.zanussi@linux.intel.com>
6  */
7
8 #include <linux/module.h>
9 #include <linux/kallsyms.h>
10 #include <linux/security.h>
11 #include <linux/mutex.h>
12 #include <linux/slab.h>
13 #include <linux/stacktrace.h>
14 #include <linux/rculist.h>
15 #include <linux/tracefs.h>
16
17 /* for gfp flag names */
18 #include <linux/trace_events.h>
19 #include <trace/events/mmflags.h>
20
21 #include "trace_synth.h"
22
23 static int create_synth_event(int argc, const char **argv);
24 static int synth_event_show(struct seq_file *m, struct dyn_event *ev);
25 static int synth_event_release(struct dyn_event *ev);
26 static bool synth_event_is_busy(struct dyn_event *ev);
27 static bool synth_event_match(const char *system, const char *event,
28                         int argc, const char **argv, struct dyn_event *ev);
29
30 static struct dyn_event_operations synth_event_ops = {
31         .create = create_synth_event,
32         .show = synth_event_show,
33         .is_busy = synth_event_is_busy,
34         .free = synth_event_release,
35         .match = synth_event_match,
36 };
37
38 static bool is_synth_event(struct dyn_event *ev)
39 {
40         return ev->ops == &synth_event_ops;
41 }
42
43 static struct synth_event *to_synth_event(struct dyn_event *ev)
44 {
45         return container_of(ev, struct synth_event, devent);
46 }
47
48 static bool synth_event_is_busy(struct dyn_event *ev)
49 {
50         struct synth_event *event = to_synth_event(ev);
51
52         return event->ref != 0;
53 }
54
55 static bool synth_event_match(const char *system, const char *event,
56                         int argc, const char **argv, struct dyn_event *ev)
57 {
58         struct synth_event *sev = to_synth_event(ev);
59
60         return strcmp(sev->name, event) == 0 &&
61                 (!system || strcmp(system, SYNTH_SYSTEM) == 0);
62 }
63
64 struct synth_trace_event {
65         struct trace_entry      ent;
66         u64                     fields[];
67 };
68
69 static int synth_event_define_fields(struct trace_event_call *call)
70 {
71         struct synth_trace_event trace;
72         int offset = offsetof(typeof(trace), fields);
73         struct synth_event *event = call->data;
74         unsigned int i, size, n_u64;
75         char *name, *type;
76         bool is_signed;
77         int ret = 0;
78
79         for (i = 0, n_u64 = 0; i < event->n_fields; i++) {
80                 size = event->fields[i]->size;
81                 is_signed = event->fields[i]->is_signed;
82                 type = event->fields[i]->type;
83                 name = event->fields[i]->name;
84                 ret = trace_define_field(call, type, name, offset, size,
85                                          is_signed, FILTER_OTHER);
86                 if (ret)
87                         break;
88
89                 event->fields[i]->offset = n_u64;
90
91                 if (event->fields[i]->is_string) {
92                         offset += STR_VAR_LEN_MAX;
93                         n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
94                 } else {
95                         offset += sizeof(u64);
96                         n_u64++;
97                 }
98         }
99
100         event->n_u64 = n_u64;
101
102         return ret;
103 }
104
105 static bool synth_field_signed(char *type)
106 {
107         if (str_has_prefix(type, "u"))
108                 return false;
109         if (strcmp(type, "gfp_t") == 0)
110                 return false;
111
112         return true;
113 }
114
115 static int synth_field_is_string(char *type)
116 {
117         if (strstr(type, "char[") != NULL)
118                 return true;
119
120         return false;
121 }
122
123 static int synth_field_string_size(char *type)
124 {
125         char buf[4], *end, *start;
126         unsigned int len;
127         int size, err;
128
129         start = strstr(type, "char[");
130         if (start == NULL)
131                 return -EINVAL;
132         start += sizeof("char[") - 1;
133
134         end = strchr(type, ']');
135         if (!end || end < start)
136                 return -EINVAL;
137
138         len = end - start;
139         if (len > 3)
140                 return -EINVAL;
141
142         strncpy(buf, start, len);
143         buf[len] = '\0';
144
145         err = kstrtouint(buf, 0, &size);
146         if (err)
147                 return err;
148
149         if (size > STR_VAR_LEN_MAX)
150                 return -EINVAL;
151
152         return size;
153 }
154
155 static int synth_field_size(char *type)
156 {
157         int size = 0;
158
159         if (strcmp(type, "s64") == 0)
160                 size = sizeof(s64);
161         else if (strcmp(type, "u64") == 0)
162                 size = sizeof(u64);
163         else if (strcmp(type, "s32") == 0)
164                 size = sizeof(s32);
165         else if (strcmp(type, "u32") == 0)
166                 size = sizeof(u32);
167         else if (strcmp(type, "s16") == 0)
168                 size = sizeof(s16);
169         else if (strcmp(type, "u16") == 0)
170                 size = sizeof(u16);
171         else if (strcmp(type, "s8") == 0)
172                 size = sizeof(s8);
173         else if (strcmp(type, "u8") == 0)
174                 size = sizeof(u8);
175         else if (strcmp(type, "char") == 0)
176                 size = sizeof(char);
177         else if (strcmp(type, "unsigned char") == 0)
178                 size = sizeof(unsigned char);
179         else if (strcmp(type, "int") == 0)
180                 size = sizeof(int);
181         else if (strcmp(type, "unsigned int") == 0)
182                 size = sizeof(unsigned int);
183         else if (strcmp(type, "long") == 0)
184                 size = sizeof(long);
185         else if (strcmp(type, "unsigned long") == 0)
186                 size = sizeof(unsigned long);
187         else if (strcmp(type, "pid_t") == 0)
188                 size = sizeof(pid_t);
189         else if (strcmp(type, "gfp_t") == 0)
190                 size = sizeof(gfp_t);
191         else if (synth_field_is_string(type))
192                 size = synth_field_string_size(type);
193
194         return size;
195 }
196
197 static const char *synth_field_fmt(char *type)
198 {
199         const char *fmt = "%llu";
200
201         if (strcmp(type, "s64") == 0)
202                 fmt = "%lld";
203         else if (strcmp(type, "u64") == 0)
204                 fmt = "%llu";
205         else if (strcmp(type, "s32") == 0)
206                 fmt = "%d";
207         else if (strcmp(type, "u32") == 0)
208                 fmt = "%u";
209         else if (strcmp(type, "s16") == 0)
210                 fmt = "%d";
211         else if (strcmp(type, "u16") == 0)
212                 fmt = "%u";
213         else if (strcmp(type, "s8") == 0)
214                 fmt = "%d";
215         else if (strcmp(type, "u8") == 0)
216                 fmt = "%u";
217         else if (strcmp(type, "char") == 0)
218                 fmt = "%d";
219         else if (strcmp(type, "unsigned char") == 0)
220                 fmt = "%u";
221         else if (strcmp(type, "int") == 0)
222                 fmt = "%d";
223         else if (strcmp(type, "unsigned int") == 0)
224                 fmt = "%u";
225         else if (strcmp(type, "long") == 0)
226                 fmt = "%ld";
227         else if (strcmp(type, "unsigned long") == 0)
228                 fmt = "%lu";
229         else if (strcmp(type, "pid_t") == 0)
230                 fmt = "%d";
231         else if (strcmp(type, "gfp_t") == 0)
232                 fmt = "%x";
233         else if (synth_field_is_string(type))
234                 fmt = "%s";
235
236         return fmt;
237 }
238
239 static void print_synth_event_num_val(struct trace_seq *s,
240                                       char *print_fmt, char *name,
241                                       int size, u64 val, char *space)
242 {
243         switch (size) {
244         case 1:
245                 trace_seq_printf(s, print_fmt, name, (u8)val, space);
246                 break;
247
248         case 2:
249                 trace_seq_printf(s, print_fmt, name, (u16)val, space);
250                 break;
251
252         case 4:
253                 trace_seq_printf(s, print_fmt, name, (u32)val, space);
254                 break;
255
256         default:
257                 trace_seq_printf(s, print_fmt, name, val, space);
258                 break;
259         }
260 }
261
262 static enum print_line_t print_synth_event(struct trace_iterator *iter,
263                                            int flags,
264                                            struct trace_event *event)
265 {
266         struct trace_array *tr = iter->tr;
267         struct trace_seq *s = &iter->seq;
268         struct synth_trace_event *entry;
269         struct synth_event *se;
270         unsigned int i, n_u64;
271         char print_fmt[32];
272         const char *fmt;
273
274         entry = (struct synth_trace_event *)iter->ent;
275         se = container_of(event, struct synth_event, call.event);
276
277         trace_seq_printf(s, "%s: ", se->name);
278
279         for (i = 0, n_u64 = 0; i < se->n_fields; i++) {
280                 if (trace_seq_has_overflowed(s))
281                         goto end;
282
283                 fmt = synth_field_fmt(se->fields[i]->type);
284
285                 /* parameter types */
286                 if (tr && tr->trace_flags & TRACE_ITER_VERBOSE)
287                         trace_seq_printf(s, "%s ", fmt);
288
289                 snprintf(print_fmt, sizeof(print_fmt), "%%s=%s%%s", fmt);
290
291                 /* parameter values */
292                 if (se->fields[i]->is_string) {
293                         trace_seq_printf(s, print_fmt, se->fields[i]->name,
294                                          (char *)&entry->fields[n_u64],
295                                          i == se->n_fields - 1 ? "" : " ");
296                         n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
297                 } else {
298                         struct trace_print_flags __flags[] = {
299                             __def_gfpflag_names, {-1, NULL} };
300                         char *space = (i == se->n_fields - 1 ? "" : " ");
301
302                         print_synth_event_num_val(s, print_fmt,
303                                                   se->fields[i]->name,
304                                                   se->fields[i]->size,
305                                                   entry->fields[n_u64],
306                                                   space);
307
308                         if (strcmp(se->fields[i]->type, "gfp_t") == 0) {
309                                 trace_seq_puts(s, " (");
310                                 trace_print_flags_seq(s, "|",
311                                                       entry->fields[n_u64],
312                                                       __flags);
313                                 trace_seq_putc(s, ')');
314                         }
315                         n_u64++;
316                 }
317         }
318 end:
319         trace_seq_putc(s, '\n');
320
321         return trace_handle_return(s);
322 }
323
324 static struct trace_event_functions synth_event_funcs = {
325         .trace          = print_synth_event
326 };
327
328 static notrace void trace_event_raw_event_synth(void *__data,
329                                                 u64 *var_ref_vals,
330                                                 unsigned int *var_ref_idx)
331 {
332         struct trace_event_file *trace_file = __data;
333         struct synth_trace_event *entry;
334         struct trace_event_buffer fbuffer;
335         struct trace_buffer *buffer;
336         struct synth_event *event;
337         unsigned int i, n_u64, val_idx;
338         int fields_size = 0;
339
340         event = trace_file->event_call->data;
341
342         if (trace_trigger_soft_disabled(trace_file))
343                 return;
344
345         fields_size = event->n_u64 * sizeof(u64);
346
347         /*
348          * Avoid ring buffer recursion detection, as this event
349          * is being performed within another event.
350          */
351         buffer = trace_file->tr->array_buffer.buffer;
352         ring_buffer_nest_start(buffer);
353
354         entry = trace_event_buffer_reserve(&fbuffer, trace_file,
355                                            sizeof(*entry) + fields_size);
356         if (!entry)
357                 goto out;
358
359         for (i = 0, n_u64 = 0; i < event->n_fields; i++) {
360                 val_idx = var_ref_idx[i];
361                 if (event->fields[i]->is_string) {
362                         char *str_val = (char *)(long)var_ref_vals[val_idx];
363                         char *str_field = (char *)&entry->fields[n_u64];
364
365                         strscpy(str_field, str_val, STR_VAR_LEN_MAX);
366                         n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
367                 } else {
368                         struct synth_field *field = event->fields[i];
369                         u64 val = var_ref_vals[val_idx];
370
371                         switch (field->size) {
372                         case 1:
373                                 *(u8 *)&entry->fields[n_u64] = (u8)val;
374                                 break;
375
376                         case 2:
377                                 *(u16 *)&entry->fields[n_u64] = (u16)val;
378                                 break;
379
380                         case 4:
381                                 *(u32 *)&entry->fields[n_u64] = (u32)val;
382                                 break;
383
384                         default:
385                                 entry->fields[n_u64] = val;
386                                 break;
387                         }
388                         n_u64++;
389                 }
390         }
391
392         trace_event_buffer_commit(&fbuffer);
393 out:
394         ring_buffer_nest_end(buffer);
395 }
396
397 static void free_synth_event_print_fmt(struct trace_event_call *call)
398 {
399         if (call) {
400                 kfree(call->print_fmt);
401                 call->print_fmt = NULL;
402         }
403 }
404
405 static int __set_synth_event_print_fmt(struct synth_event *event,
406                                        char *buf, int len)
407 {
408         const char *fmt;
409         int pos = 0;
410         int i;
411
412         /* When len=0, we just calculate the needed length */
413 #define LEN_OR_ZERO (len ? len - pos : 0)
414
415         pos += snprintf(buf + pos, LEN_OR_ZERO, "\"");
416         for (i = 0; i < event->n_fields; i++) {
417                 fmt = synth_field_fmt(event->fields[i]->type);
418                 pos += snprintf(buf + pos, LEN_OR_ZERO, "%s=%s%s",
419                                 event->fields[i]->name, fmt,
420                                 i == event->n_fields - 1 ? "" : ", ");
421         }
422         pos += snprintf(buf + pos, LEN_OR_ZERO, "\"");
423
424         for (i = 0; i < event->n_fields; i++) {
425                 pos += snprintf(buf + pos, LEN_OR_ZERO,
426                                 ", REC->%s", event->fields[i]->name);
427         }
428
429 #undef LEN_OR_ZERO
430
431         /* return the length of print_fmt */
432         return pos;
433 }
434
435 static int set_synth_event_print_fmt(struct trace_event_call *call)
436 {
437         struct synth_event *event = call->data;
438         char *print_fmt;
439         int len;
440
441         /* First: called with 0 length to calculate the needed length */
442         len = __set_synth_event_print_fmt(event, NULL, 0);
443
444         print_fmt = kmalloc(len + 1, GFP_KERNEL);
445         if (!print_fmt)
446                 return -ENOMEM;
447
448         /* Second: actually write the @print_fmt */
449         __set_synth_event_print_fmt(event, print_fmt, len + 1);
450         call->print_fmt = print_fmt;
451
452         return 0;
453 }
454
455 static void free_synth_field(struct synth_field *field)
456 {
457         kfree(field->type);
458         kfree(field->name);
459         kfree(field);
460 }
461
462 static struct synth_field *parse_synth_field(int argc, const char **argv,
463                                              int *consumed)
464 {
465         struct synth_field *field;
466         const char *prefix = NULL, *field_type = argv[0], *field_name, *array;
467         int len, ret = 0;
468
469         if (field_type[0] == ';')
470                 field_type++;
471
472         if (!strcmp(field_type, "unsigned")) {
473                 if (argc < 3)
474                         return ERR_PTR(-EINVAL);
475                 prefix = "unsigned ";
476                 field_type = argv[1];
477                 field_name = argv[2];
478                 *consumed = 3;
479         } else {
480                 field_name = argv[1];
481                 *consumed = 2;
482         }
483
484         field = kzalloc(sizeof(*field), GFP_KERNEL);
485         if (!field)
486                 return ERR_PTR(-ENOMEM);
487
488         len = strlen(field_name);
489         array = strchr(field_name, '[');
490         if (array)
491                 len -= strlen(array);
492         else if (field_name[len - 1] == ';')
493                 len--;
494
495         field->name = kmemdup_nul(field_name, len, GFP_KERNEL);
496         if (!field->name) {
497                 ret = -ENOMEM;
498                 goto free;
499         }
500
501         if (field_type[0] == ';')
502                 field_type++;
503         len = strlen(field_type) + 1;
504         if (array)
505                 len += strlen(array);
506         if (prefix)
507                 len += strlen(prefix);
508
509         field->type = kzalloc(len, GFP_KERNEL);
510         if (!field->type) {
511                 ret = -ENOMEM;
512                 goto free;
513         }
514         if (prefix)
515                 strcat(field->type, prefix);
516         strcat(field->type, field_type);
517         if (array) {
518                 strcat(field->type, array);
519                 if (field->type[len - 1] == ';')
520                         field->type[len - 1] = '\0';
521         }
522
523         field->size = synth_field_size(field->type);
524         if (!field->size) {
525                 ret = -EINVAL;
526                 goto free;
527         }
528
529         if (synth_field_is_string(field->type))
530                 field->is_string = true;
531
532         field->is_signed = synth_field_signed(field->type);
533
534  out:
535         return field;
536  free:
537         free_synth_field(field);
538         field = ERR_PTR(ret);
539         goto out;
540 }
541
542 static void free_synth_tracepoint(struct tracepoint *tp)
543 {
544         if (!tp)
545                 return;
546
547         kfree(tp->name);
548         kfree(tp);
549 }
550
551 static struct tracepoint *alloc_synth_tracepoint(char *name)
552 {
553         struct tracepoint *tp;
554
555         tp = kzalloc(sizeof(*tp), GFP_KERNEL);
556         if (!tp)
557                 return ERR_PTR(-ENOMEM);
558
559         tp->name = kstrdup(name, GFP_KERNEL);
560         if (!tp->name) {
561                 kfree(tp);
562                 return ERR_PTR(-ENOMEM);
563         }
564
565         return tp;
566 }
567
568 struct synth_event *find_synth_event(const char *name)
569 {
570         struct dyn_event *pos;
571         struct synth_event *event;
572
573         for_each_dyn_event(pos) {
574                 if (!is_synth_event(pos))
575                         continue;
576                 event = to_synth_event(pos);
577                 if (strcmp(event->name, name) == 0)
578                         return event;
579         }
580
581         return NULL;
582 }
583
584 static struct trace_event_fields synth_event_fields_array[] = {
585         { .type = TRACE_FUNCTION_TYPE,
586           .define_fields = synth_event_define_fields },
587         {}
588 };
589
590 static int register_synth_event(struct synth_event *event)
591 {
592         struct trace_event_call *call = &event->call;
593         int ret = 0;
594
595         event->call.class = &event->class;
596         event->class.system = kstrdup(SYNTH_SYSTEM, GFP_KERNEL);
597         if (!event->class.system) {
598                 ret = -ENOMEM;
599                 goto out;
600         }
601
602         event->tp = alloc_synth_tracepoint(event->name);
603         if (IS_ERR(event->tp)) {
604                 ret = PTR_ERR(event->tp);
605                 event->tp = NULL;
606                 goto out;
607         }
608
609         INIT_LIST_HEAD(&call->class->fields);
610         call->event.funcs = &synth_event_funcs;
611         call->class->fields_array = synth_event_fields_array;
612
613         ret = register_trace_event(&call->event);
614         if (!ret) {
615                 ret = -ENODEV;
616                 goto out;
617         }
618         call->flags = TRACE_EVENT_FL_TRACEPOINT;
619         call->class->reg = trace_event_reg;
620         call->class->probe = trace_event_raw_event_synth;
621         call->data = event;
622         call->tp = event->tp;
623
624         ret = trace_add_event_call(call);
625         if (ret) {
626                 pr_warn("Failed to register synthetic event: %s\n",
627                         trace_event_name(call));
628                 goto err;
629         }
630
631         ret = set_synth_event_print_fmt(call);
632         if (ret < 0) {
633                 trace_remove_event_call(call);
634                 goto err;
635         }
636  out:
637         return ret;
638  err:
639         unregister_trace_event(&call->event);
640         goto out;
641 }
642
643 static int unregister_synth_event(struct synth_event *event)
644 {
645         struct trace_event_call *call = &event->call;
646         int ret;
647
648         ret = trace_remove_event_call(call);
649
650         return ret;
651 }
652
653 static void free_synth_event(struct synth_event *event)
654 {
655         unsigned int i;
656
657         if (!event)
658                 return;
659
660         for (i = 0; i < event->n_fields; i++)
661                 free_synth_field(event->fields[i]);
662
663         kfree(event->fields);
664         kfree(event->name);
665         kfree(event->class.system);
666         free_synth_tracepoint(event->tp);
667         free_synth_event_print_fmt(&event->call);
668         kfree(event);
669 }
670
671 static struct synth_event *alloc_synth_event(const char *name, int n_fields,
672                                              struct synth_field **fields)
673 {
674         struct synth_event *event;
675         unsigned int i;
676
677         event = kzalloc(sizeof(*event), GFP_KERNEL);
678         if (!event) {
679                 event = ERR_PTR(-ENOMEM);
680                 goto out;
681         }
682
683         event->name = kstrdup(name, GFP_KERNEL);
684         if (!event->name) {
685                 kfree(event);
686                 event = ERR_PTR(-ENOMEM);
687                 goto out;
688         }
689
690         event->fields = kcalloc(n_fields, sizeof(*event->fields), GFP_KERNEL);
691         if (!event->fields) {
692                 free_synth_event(event);
693                 event = ERR_PTR(-ENOMEM);
694                 goto out;
695         }
696
697         dyn_event_init(&event->devent, &synth_event_ops);
698
699         for (i = 0; i < n_fields; i++)
700                 event->fields[i] = fields[i];
701
702         event->n_fields = n_fields;
703  out:
704         return event;
705 }
706
707 static int synth_event_check_arg_fn(void *data)
708 {
709         struct dynevent_arg_pair *arg_pair = data;
710         int size;
711
712         size = synth_field_size((char *)arg_pair->lhs);
713
714         return size ? 0 : -EINVAL;
715 }
716
717 /**
718  * synth_event_add_field - Add a new field to a synthetic event cmd
719  * @cmd: A pointer to the dynevent_cmd struct representing the new event
720  * @type: The type of the new field to add
721  * @name: The name of the new field to add
722  *
723  * Add a new field to a synthetic event cmd object.  Field ordering is in
724  * the same order the fields are added.
725  *
726  * See synth_field_size() for available types. If field_name contains
727  * [n] the field is considered to be an array.
728  *
729  * Return: 0 if successful, error otherwise.
730  */
731 int synth_event_add_field(struct dynevent_cmd *cmd, const char *type,
732                           const char *name)
733 {
734         struct dynevent_arg_pair arg_pair;
735         int ret;
736
737         if (cmd->type != DYNEVENT_TYPE_SYNTH)
738                 return -EINVAL;
739
740         if (!type || !name)
741                 return -EINVAL;
742
743         dynevent_arg_pair_init(&arg_pair, 0, ';');
744
745         arg_pair.lhs = type;
746         arg_pair.rhs = name;
747
748         ret = dynevent_arg_pair_add(cmd, &arg_pair, synth_event_check_arg_fn);
749         if (ret)
750                 return ret;
751
752         if (++cmd->n_fields > SYNTH_FIELDS_MAX)
753                 ret = -EINVAL;
754
755         return ret;
756 }
757 EXPORT_SYMBOL_GPL(synth_event_add_field);
758
759 /**
760  * synth_event_add_field_str - Add a new field to a synthetic event cmd
761  * @cmd: A pointer to the dynevent_cmd struct representing the new event
762  * @type_name: The type and name of the new field to add, as a single string
763  *
764  * Add a new field to a synthetic event cmd object, as a single
765  * string.  The @type_name string is expected to be of the form 'type
766  * name', which will be appended by ';'.  No sanity checking is done -
767  * what's passed in is assumed to already be well-formed.  Field
768  * ordering is in the same order the fields are added.
769  *
770  * See synth_field_size() for available types. If field_name contains
771  * [n] the field is considered to be an array.
772  *
773  * Return: 0 if successful, error otherwise.
774  */
775 int synth_event_add_field_str(struct dynevent_cmd *cmd, const char *type_name)
776 {
777         struct dynevent_arg arg;
778         int ret;
779
780         if (cmd->type != DYNEVENT_TYPE_SYNTH)
781                 return -EINVAL;
782
783         if (!type_name)
784                 return -EINVAL;
785
786         dynevent_arg_init(&arg, ';');
787
788         arg.str = type_name;
789
790         ret = dynevent_arg_add(cmd, &arg, NULL);
791         if (ret)
792                 return ret;
793
794         if (++cmd->n_fields > SYNTH_FIELDS_MAX)
795                 ret = -EINVAL;
796
797         return ret;
798 }
799 EXPORT_SYMBOL_GPL(synth_event_add_field_str);
800
801 /**
802  * synth_event_add_fields - Add multiple fields to a synthetic event cmd
803  * @cmd: A pointer to the dynevent_cmd struct representing the new event
804  * @fields: An array of type/name field descriptions
805  * @n_fields: The number of field descriptions contained in the fields array
806  *
807  * Add a new set of fields to a synthetic event cmd object.  The event
808  * fields that will be defined for the event should be passed in as an
809  * array of struct synth_field_desc, and the number of elements in the
810  * array passed in as n_fields.  Field ordering will retain the
811  * ordering given in the fields array.
812  *
813  * See synth_field_size() for available types. If field_name contains
814  * [n] the field is considered to be an array.
815  *
816  * Return: 0 if successful, error otherwise.
817  */
818 int synth_event_add_fields(struct dynevent_cmd *cmd,
819                            struct synth_field_desc *fields,
820                            unsigned int n_fields)
821 {
822         unsigned int i;
823         int ret = 0;
824
825         for (i = 0; i < n_fields; i++) {
826                 if (fields[i].type == NULL || fields[i].name == NULL) {
827                         ret = -EINVAL;
828                         break;
829                 }
830
831                 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name);
832                 if (ret)
833                         break;
834         }
835
836         return ret;
837 }
838 EXPORT_SYMBOL_GPL(synth_event_add_fields);
839
840 /**
841  * __synth_event_gen_cmd_start - Start a synthetic event command from arg list
842  * @cmd: A pointer to the dynevent_cmd struct representing the new event
843  * @name: The name of the synthetic event
844  * @mod: The module creating the event, NULL if not created from a module
845  * @args: Variable number of arg (pairs), one pair for each field
846  *
847  * NOTE: Users normally won't want to call this function directly, but
848  * rather use the synth_event_gen_cmd_start() wrapper, which
849  * automatically adds a NULL to the end of the arg list.  If this
850  * function is used directly, make sure the last arg in the variable
851  * arg list is NULL.
852  *
853  * Generate a synthetic event command to be executed by
854  * synth_event_gen_cmd_end().  This function can be used to generate
855  * the complete command or only the first part of it; in the latter
856  * case, synth_event_add_field(), synth_event_add_field_str(), or
857  * synth_event_add_fields() can be used to add more fields following
858  * this.
859  *
860  * There should be an even number variable args, each pair consisting
861  * of a type followed by a field name.
862  *
863  * See synth_field_size() for available types. If field_name contains
864  * [n] the field is considered to be an array.
865  *
866  * Return: 0 if successful, error otherwise.
867  */
868 int __synth_event_gen_cmd_start(struct dynevent_cmd *cmd, const char *name,
869                                 struct module *mod, ...)
870 {
871         struct dynevent_arg arg;
872         va_list args;
873         int ret;
874
875         cmd->event_name = name;
876         cmd->private_data = mod;
877
878         if (cmd->type != DYNEVENT_TYPE_SYNTH)
879                 return -EINVAL;
880
881         dynevent_arg_init(&arg, 0);
882         arg.str = name;
883         ret = dynevent_arg_add(cmd, &arg, NULL);
884         if (ret)
885                 return ret;
886
887         va_start(args, mod);
888         for (;;) {
889                 const char *type, *name;
890
891                 type = va_arg(args, const char *);
892                 if (!type)
893                         break;
894                 name = va_arg(args, const char *);
895                 if (!name)
896                         break;
897
898                 if (++cmd->n_fields > SYNTH_FIELDS_MAX) {
899                         ret = -EINVAL;
900                         break;
901                 }
902
903                 ret = synth_event_add_field(cmd, type, name);
904                 if (ret)
905                         break;
906         }
907         va_end(args);
908
909         return ret;
910 }
911 EXPORT_SYMBOL_GPL(__synth_event_gen_cmd_start);
912
913 /**
914  * synth_event_gen_cmd_array_start - Start synthetic event command from an array
915  * @cmd: A pointer to the dynevent_cmd struct representing the new event
916  * @name: The name of the synthetic event
917  * @fields: An array of type/name field descriptions
918  * @n_fields: The number of field descriptions contained in the fields array
919  *
920  * Generate a synthetic event command to be executed by
921  * synth_event_gen_cmd_end().  This function can be used to generate
922  * the complete command or only the first part of it; in the latter
923  * case, synth_event_add_field(), synth_event_add_field_str(), or
924  * synth_event_add_fields() can be used to add more fields following
925  * this.
926  *
927  * The event fields that will be defined for the event should be
928  * passed in as an array of struct synth_field_desc, and the number of
929  * elements in the array passed in as n_fields.  Field ordering will
930  * retain the ordering given in the fields array.
931  *
932  * See synth_field_size() for available types. If field_name contains
933  * [n] the field is considered to be an array.
934  *
935  * Return: 0 if successful, error otherwise.
936  */
937 int synth_event_gen_cmd_array_start(struct dynevent_cmd *cmd, const char *name,
938                                     struct module *mod,
939                                     struct synth_field_desc *fields,
940                                     unsigned int n_fields)
941 {
942         struct dynevent_arg arg;
943         unsigned int i;
944         int ret = 0;
945
946         cmd->event_name = name;
947         cmd->private_data = mod;
948
949         if (cmd->type != DYNEVENT_TYPE_SYNTH)
950                 return -EINVAL;
951
952         if (n_fields > SYNTH_FIELDS_MAX)
953                 return -EINVAL;
954
955         dynevent_arg_init(&arg, 0);
956         arg.str = name;
957         ret = dynevent_arg_add(cmd, &arg, NULL);
958         if (ret)
959                 return ret;
960
961         for (i = 0; i < n_fields; i++) {
962                 if (fields[i].type == NULL || fields[i].name == NULL)
963                         return -EINVAL;
964
965                 ret = synth_event_add_field(cmd, fields[i].type, fields[i].name);
966                 if (ret)
967                         break;
968         }
969
970         return ret;
971 }
972 EXPORT_SYMBOL_GPL(synth_event_gen_cmd_array_start);
973
974 static int __create_synth_event(int argc, const char *name, const char **argv)
975 {
976         struct synth_field *field, *fields[SYNTH_FIELDS_MAX];
977         struct synth_event *event = NULL;
978         int i, consumed = 0, n_fields = 0, ret = 0;
979
980         /*
981          * Argument syntax:
982          *  - Add synthetic event: <event_name> field[;field] ...
983          *  - Remove synthetic event: !<event_name> field[;field] ...
984          *      where 'field' = type field_name
985          */
986
987         if (name[0] == '\0' || argc < 1)
988                 return -EINVAL;
989
990         mutex_lock(&event_mutex);
991
992         event = find_synth_event(name);
993         if (event) {
994                 ret = -EEXIST;
995                 goto out;
996         }
997
998         for (i = 0; i < argc - 1; i++) {
999                 if (strcmp(argv[i], ";") == 0)
1000                         continue;
1001                 if (n_fields == SYNTH_FIELDS_MAX) {
1002                         ret = -EINVAL;
1003                         goto err;
1004                 }
1005
1006                 field = parse_synth_field(argc - i, &argv[i], &consumed);
1007                 if (IS_ERR(field)) {
1008                         ret = PTR_ERR(field);
1009                         goto err;
1010                 }
1011                 fields[n_fields++] = field;
1012                 i += consumed - 1;
1013         }
1014
1015         if (i < argc && strcmp(argv[i], ";") != 0) {
1016                 ret = -EINVAL;
1017                 goto err;
1018         }
1019
1020         event = alloc_synth_event(name, n_fields, fields);
1021         if (IS_ERR(event)) {
1022                 ret = PTR_ERR(event);
1023                 event = NULL;
1024                 goto err;
1025         }
1026         ret = register_synth_event(event);
1027         if (!ret)
1028                 dyn_event_add(&event->devent);
1029         else
1030                 free_synth_event(event);
1031  out:
1032         mutex_unlock(&event_mutex);
1033
1034         return ret;
1035  err:
1036         for (i = 0; i < n_fields; i++)
1037                 free_synth_field(fields[i]);
1038
1039         goto out;
1040 }
1041
1042 /**
1043  * synth_event_create - Create a new synthetic event
1044  * @name: The name of the new sythetic event
1045  * @fields: An array of type/name field descriptions
1046  * @n_fields: The number of field descriptions contained in the fields array
1047  * @mod: The module creating the event, NULL if not created from a module
1048  *
1049  * Create a new synthetic event with the given name under the
1050  * trace/events/synthetic/ directory.  The event fields that will be
1051  * defined for the event should be passed in as an array of struct
1052  * synth_field_desc, and the number elements in the array passed in as
1053  * n_fields. Field ordering will retain the ordering given in the
1054  * fields array.
1055  *
1056  * If the new synthetic event is being created from a module, the mod
1057  * param must be non-NULL.  This will ensure that the trace buffer
1058  * won't contain unreadable events.
1059  *
1060  * The new synth event should be deleted using synth_event_delete()
1061  * function.  The new synthetic event can be generated from modules or
1062  * other kernel code using trace_synth_event() and related functions.
1063  *
1064  * Return: 0 if successful, error otherwise.
1065  */
1066 int synth_event_create(const char *name, struct synth_field_desc *fields,
1067                        unsigned int n_fields, struct module *mod)
1068 {
1069         struct dynevent_cmd cmd;
1070         char *buf;
1071         int ret;
1072
1073         buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
1074         if (!buf)
1075                 return -ENOMEM;
1076
1077         synth_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
1078
1079         ret = synth_event_gen_cmd_array_start(&cmd, name, mod,
1080                                               fields, n_fields);
1081         if (ret)
1082                 goto out;
1083
1084         ret = synth_event_gen_cmd_end(&cmd);
1085  out:
1086         kfree(buf);
1087
1088         return ret;
1089 }
1090 EXPORT_SYMBOL_GPL(synth_event_create);
1091
1092 static int destroy_synth_event(struct synth_event *se)
1093 {
1094         int ret;
1095
1096         if (se->ref)
1097                 ret = -EBUSY;
1098         else {
1099                 ret = unregister_synth_event(se);
1100                 if (!ret) {
1101                         dyn_event_remove(&se->devent);
1102                         free_synth_event(se);
1103                 }
1104         }
1105
1106         return ret;
1107 }
1108
1109 /**
1110  * synth_event_delete - Delete a synthetic event
1111  * @event_name: The name of the new sythetic event
1112  *
1113  * Delete a synthetic event that was created with synth_event_create().
1114  *
1115  * Return: 0 if successful, error otherwise.
1116  */
1117 int synth_event_delete(const char *event_name)
1118 {
1119         struct synth_event *se = NULL;
1120         struct module *mod = NULL;
1121         int ret = -ENOENT;
1122
1123         mutex_lock(&event_mutex);
1124         se = find_synth_event(event_name);
1125         if (se) {
1126                 mod = se->mod;
1127                 ret = destroy_synth_event(se);
1128         }
1129         mutex_unlock(&event_mutex);
1130
1131         if (mod) {
1132                 mutex_lock(&trace_types_lock);
1133                 /*
1134                  * It is safest to reset the ring buffer if the module
1135                  * being unloaded registered any events that were
1136                  * used. The only worry is if a new module gets
1137                  * loaded, and takes on the same id as the events of
1138                  * this module. When printing out the buffer, traced
1139                  * events left over from this module may be passed to
1140                  * the new module events and unexpected results may
1141                  * occur.
1142                  */
1143                 tracing_reset_all_online_cpus();
1144                 mutex_unlock(&trace_types_lock);
1145         }
1146
1147         return ret;
1148 }
1149 EXPORT_SYMBOL_GPL(synth_event_delete);
1150
1151 static int create_or_delete_synth_event(int argc, char **argv)
1152 {
1153         const char *name = argv[0];
1154         int ret;
1155
1156         /* trace_run_command() ensures argc != 0 */
1157         if (name[0] == '!') {
1158                 ret = synth_event_delete(name + 1);
1159                 return ret;
1160         }
1161
1162         ret = __create_synth_event(argc - 1, name, (const char **)argv + 1);
1163         return ret == -ECANCELED ? -EINVAL : ret;
1164 }
1165
1166 static int synth_event_run_command(struct dynevent_cmd *cmd)
1167 {
1168         struct synth_event *se;
1169         int ret;
1170
1171         ret = trace_run_command(cmd->seq.buffer, create_or_delete_synth_event);
1172         if (ret)
1173                 return ret;
1174
1175         se = find_synth_event(cmd->event_name);
1176         if (WARN_ON(!se))
1177                 return -ENOENT;
1178
1179         se->mod = cmd->private_data;
1180
1181         return ret;
1182 }
1183
1184 /**
1185  * synth_event_cmd_init - Initialize a synthetic event command object
1186  * @cmd: A pointer to the dynevent_cmd struct representing the new event
1187  * @buf: A pointer to the buffer used to build the command
1188  * @maxlen: The length of the buffer passed in @buf
1189  *
1190  * Initialize a synthetic event command object.  Use this before
1191  * calling any of the other dyenvent_cmd functions.
1192  */
1193 void synth_event_cmd_init(struct dynevent_cmd *cmd, char *buf, int maxlen)
1194 {
1195         dynevent_cmd_init(cmd, buf, maxlen, DYNEVENT_TYPE_SYNTH,
1196                           synth_event_run_command);
1197 }
1198 EXPORT_SYMBOL_GPL(synth_event_cmd_init);
1199
1200 static inline int
1201 __synth_event_trace_start(struct trace_event_file *file,
1202                           struct synth_event_trace_state *trace_state)
1203 {
1204         int entry_size, fields_size = 0;
1205         int ret = 0;
1206
1207         memset(trace_state, '\0', sizeof(*trace_state));
1208
1209         /*
1210          * Normal event tracing doesn't get called at all unless the
1211          * ENABLED bit is set (which attaches the probe thus allowing
1212          * this code to be called, etc).  Because this is called
1213          * directly by the user, we don't have that but we still need
1214          * to honor not logging when disabled.  For the the iterated
1215          * trace case, we save the enabed state upon start and just
1216          * ignore the following data calls.
1217          */
1218         if (!(file->flags & EVENT_FILE_FL_ENABLED) ||
1219             trace_trigger_soft_disabled(file)) {
1220                 trace_state->disabled = true;
1221                 ret = -ENOENT;
1222                 goto out;
1223         }
1224
1225         trace_state->event = file->event_call->data;
1226
1227         fields_size = trace_state->event->n_u64 * sizeof(u64);
1228
1229         /*
1230          * Avoid ring buffer recursion detection, as this event
1231          * is being performed within another event.
1232          */
1233         trace_state->buffer = file->tr->array_buffer.buffer;
1234         ring_buffer_nest_start(trace_state->buffer);
1235
1236         entry_size = sizeof(*trace_state->entry) + fields_size;
1237         trace_state->entry = trace_event_buffer_reserve(&trace_state->fbuffer,
1238                                                         file,
1239                                                         entry_size);
1240         if (!trace_state->entry) {
1241                 ring_buffer_nest_end(trace_state->buffer);
1242                 ret = -EINVAL;
1243         }
1244 out:
1245         return ret;
1246 }
1247
1248 static inline void
1249 __synth_event_trace_end(struct synth_event_trace_state *trace_state)
1250 {
1251         trace_event_buffer_commit(&trace_state->fbuffer);
1252
1253         ring_buffer_nest_end(trace_state->buffer);
1254 }
1255
1256 /**
1257  * synth_event_trace - Trace a synthetic event
1258  * @file: The trace_event_file representing the synthetic event
1259  * @n_vals: The number of values in vals
1260  * @args: Variable number of args containing the event values
1261  *
1262  * Trace a synthetic event using the values passed in the variable
1263  * argument list.
1264  *
1265  * The argument list should be a list 'n_vals' u64 values.  The number
1266  * of vals must match the number of field in the synthetic event, and
1267  * must be in the same order as the synthetic event fields.
1268  *
1269  * All vals should be cast to u64, and string vals are just pointers
1270  * to strings, cast to u64.  Strings will be copied into space
1271  * reserved in the event for the string, using these pointers.
1272  *
1273  * Return: 0 on success, err otherwise.
1274  */
1275 int synth_event_trace(struct trace_event_file *file, unsigned int n_vals, ...)
1276 {
1277         struct synth_event_trace_state state;
1278         unsigned int i, n_u64;
1279         va_list args;
1280         int ret;
1281
1282         ret = __synth_event_trace_start(file, &state);
1283         if (ret) {
1284                 if (ret == -ENOENT)
1285                         ret = 0; /* just disabled, not really an error */
1286                 return ret;
1287         }
1288
1289         if (n_vals != state.event->n_fields) {
1290                 ret = -EINVAL;
1291                 goto out;
1292         }
1293
1294         va_start(args, n_vals);
1295         for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) {
1296                 u64 val;
1297
1298                 val = va_arg(args, u64);
1299
1300                 if (state.event->fields[i]->is_string) {
1301                         char *str_val = (char *)(long)val;
1302                         char *str_field = (char *)&state.entry->fields[n_u64];
1303
1304                         strscpy(str_field, str_val, STR_VAR_LEN_MAX);
1305                         n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
1306                 } else {
1307                         struct synth_field *field = state.event->fields[i];
1308
1309                         switch (field->size) {
1310                         case 1:
1311                                 *(u8 *)&state.entry->fields[n_u64] = (u8)val;
1312                                 break;
1313
1314                         case 2:
1315                                 *(u16 *)&state.entry->fields[n_u64] = (u16)val;
1316                                 break;
1317
1318                         case 4:
1319                                 *(u32 *)&state.entry->fields[n_u64] = (u32)val;
1320                                 break;
1321
1322                         default:
1323                                 state.entry->fields[n_u64] = val;
1324                                 break;
1325                         }
1326                         n_u64++;
1327                 }
1328         }
1329         va_end(args);
1330 out:
1331         __synth_event_trace_end(&state);
1332
1333         return ret;
1334 }
1335 EXPORT_SYMBOL_GPL(synth_event_trace);
1336
1337 /**
1338  * synth_event_trace_array - Trace a synthetic event from an array
1339  * @file: The trace_event_file representing the synthetic event
1340  * @vals: Array of values
1341  * @n_vals: The number of values in vals
1342  *
1343  * Trace a synthetic event using the values passed in as 'vals'.
1344  *
1345  * The 'vals' array is just an array of 'n_vals' u64.  The number of
1346  * vals must match the number of field in the synthetic event, and
1347  * must be in the same order as the synthetic event fields.
1348  *
1349  * All vals should be cast to u64, and string vals are just pointers
1350  * to strings, cast to u64.  Strings will be copied into space
1351  * reserved in the event for the string, using these pointers.
1352  *
1353  * Return: 0 on success, err otherwise.
1354  */
1355 int synth_event_trace_array(struct trace_event_file *file, u64 *vals,
1356                             unsigned int n_vals)
1357 {
1358         struct synth_event_trace_state state;
1359         unsigned int i, n_u64;
1360         int ret;
1361
1362         ret = __synth_event_trace_start(file, &state);
1363         if (ret) {
1364                 if (ret == -ENOENT)
1365                         ret = 0; /* just disabled, not really an error */
1366                 return ret;
1367         }
1368
1369         if (n_vals != state.event->n_fields) {
1370                 ret = -EINVAL;
1371                 goto out;
1372         }
1373
1374         for (i = 0, n_u64 = 0; i < state.event->n_fields; i++) {
1375                 if (state.event->fields[i]->is_string) {
1376                         char *str_val = (char *)(long)vals[i];
1377                         char *str_field = (char *)&state.entry->fields[n_u64];
1378
1379                         strscpy(str_field, str_val, STR_VAR_LEN_MAX);
1380                         n_u64 += STR_VAR_LEN_MAX / sizeof(u64);
1381                 } else {
1382                         struct synth_field *field = state.event->fields[i];
1383                         u64 val = vals[i];
1384
1385                         switch (field->size) {
1386                         case 1:
1387                                 *(u8 *)&state.entry->fields[n_u64] = (u8)val;
1388                                 break;
1389
1390                         case 2:
1391                                 *(u16 *)&state.entry->fields[n_u64] = (u16)val;
1392                                 break;
1393
1394                         case 4:
1395                                 *(u32 *)&state.entry->fields[n_u64] = (u32)val;
1396                                 break;
1397
1398                         default:
1399                                 state.entry->fields[n_u64] = val;
1400                                 break;
1401                         }
1402                         n_u64++;
1403                 }
1404         }
1405 out:
1406         __synth_event_trace_end(&state);
1407
1408         return ret;
1409 }
1410 EXPORT_SYMBOL_GPL(synth_event_trace_array);
1411
1412 /**
1413  * synth_event_trace_start - Start piecewise synthetic event trace
1414  * @file: The trace_event_file representing the synthetic event
1415  * @trace_state: A pointer to object tracking the piecewise trace state
1416  *
1417  * Start the trace of a synthetic event field-by-field rather than all
1418  * at once.
1419  *
1420  * This function 'opens' an event trace, which means space is reserved
1421  * for the event in the trace buffer, after which the event's
1422  * individual field values can be set through either
1423  * synth_event_add_next_val() or synth_event_add_val().
1424  *
1425  * A pointer to a trace_state object is passed in, which will keep
1426  * track of the current event trace state until the event trace is
1427  * closed (and the event finally traced) using
1428  * synth_event_trace_end().
1429  *
1430  * Note that synth_event_trace_end() must be called after all values
1431  * have been added for each event trace, regardless of whether adding
1432  * all field values succeeded or not.
1433  *
1434  * Note also that for a given event trace, all fields must be added
1435  * using either synth_event_add_next_val() or synth_event_add_val()
1436  * but not both together or interleaved.
1437  *
1438  * Return: 0 on success, err otherwise.
1439  */
1440 int synth_event_trace_start(struct trace_event_file *file,
1441                             struct synth_event_trace_state *trace_state)
1442 {
1443         int ret;
1444
1445         if (!trace_state)
1446                 return -EINVAL;
1447
1448         ret = __synth_event_trace_start(file, trace_state);
1449         if (ret == -ENOENT)
1450                 ret = 0; /* just disabled, not really an error */
1451
1452         return ret;
1453 }
1454 EXPORT_SYMBOL_GPL(synth_event_trace_start);
1455
1456 static int __synth_event_add_val(const char *field_name, u64 val,
1457                                  struct synth_event_trace_state *trace_state)
1458 {
1459         struct synth_field *field = NULL;
1460         struct synth_trace_event *entry;
1461         struct synth_event *event;
1462         int i, ret = 0;
1463
1464         if (!trace_state) {
1465                 ret = -EINVAL;
1466                 goto out;
1467         }
1468
1469         /* can't mix add_next_synth_val() with add_synth_val() */
1470         if (field_name) {
1471                 if (trace_state->add_next) {
1472                         ret = -EINVAL;
1473                         goto out;
1474                 }
1475                 trace_state->add_name = true;
1476         } else {
1477                 if (trace_state->add_name) {
1478                         ret = -EINVAL;
1479                         goto out;
1480                 }
1481                 trace_state->add_next = true;
1482         }
1483
1484         if (trace_state->disabled)
1485                 goto out;
1486
1487         event = trace_state->event;
1488         if (trace_state->add_name) {
1489                 for (i = 0; i < event->n_fields; i++) {
1490                         field = event->fields[i];
1491                         if (strcmp(field->name, field_name) == 0)
1492                                 break;
1493                 }
1494                 if (!field) {
1495                         ret = -EINVAL;
1496                         goto out;
1497                 }
1498         } else {
1499                 if (trace_state->cur_field >= event->n_fields) {
1500                         ret = -EINVAL;
1501                         goto out;
1502                 }
1503                 field = event->fields[trace_state->cur_field++];
1504         }
1505
1506         entry = trace_state->entry;
1507         if (field->is_string) {
1508                 char *str_val = (char *)(long)val;
1509                 char *str_field;
1510
1511                 if (!str_val) {
1512                         ret = -EINVAL;
1513                         goto out;
1514                 }
1515
1516                 str_field = (char *)&entry->fields[field->offset];
1517                 strscpy(str_field, str_val, STR_VAR_LEN_MAX);
1518         } else {
1519                 switch (field->size) {
1520                 case 1:
1521                         *(u8 *)&trace_state->entry->fields[field->offset] = (u8)val;
1522                         break;
1523
1524                 case 2:
1525                         *(u16 *)&trace_state->entry->fields[field->offset] = (u16)val;
1526                         break;
1527
1528                 case 4:
1529                         *(u32 *)&trace_state->entry->fields[field->offset] = (u32)val;
1530                         break;
1531
1532                 default:
1533                         trace_state->entry->fields[field->offset] = val;
1534                         break;
1535                 }
1536         }
1537  out:
1538         return ret;
1539 }
1540
1541 /**
1542  * synth_event_add_next_val - Add the next field's value to an open synth trace
1543  * @val: The value to set the next field to
1544  * @trace_state: A pointer to object tracking the piecewise trace state
1545  *
1546  * Set the value of the next field in an event that's been opened by
1547  * synth_event_trace_start().
1548  *
1549  * The val param should be the value cast to u64.  If the value points
1550  * to a string, the val param should be a char * cast to u64.
1551  *
1552  * This function assumes all the fields in an event are to be set one
1553  * after another - successive calls to this function are made, one for
1554  * each field, in the order of the fields in the event, until all
1555  * fields have been set.  If you'd rather set each field individually
1556  * without regard to ordering, synth_event_add_val() can be used
1557  * instead.
1558  *
1559  * Note however that synth_event_add_next_val() and
1560  * synth_event_add_val() can't be intermixed for a given event trace -
1561  * one or the other but not both can be used at the same time.
1562  *
1563  * Note also that synth_event_trace_end() must be called after all
1564  * values have been added for each event trace, regardless of whether
1565  * adding all field values succeeded or not.
1566  *
1567  * Return: 0 on success, err otherwise.
1568  */
1569 int synth_event_add_next_val(u64 val,
1570                              struct synth_event_trace_state *trace_state)
1571 {
1572         return __synth_event_add_val(NULL, val, trace_state);
1573 }
1574 EXPORT_SYMBOL_GPL(synth_event_add_next_val);
1575
1576 /**
1577  * synth_event_add_val - Add a named field's value to an open synth trace
1578  * @field_name: The name of the synthetic event field value to set
1579  * @val: The value to set the next field to
1580  * @trace_state: A pointer to object tracking the piecewise trace state
1581  *
1582  * Set the value of the named field in an event that's been opened by
1583  * synth_event_trace_start().
1584  *
1585  * The val param should be the value cast to u64.  If the value points
1586  * to a string, the val param should be a char * cast to u64.
1587  *
1588  * This function looks up the field name, and if found, sets the field
1589  * to the specified value.  This lookup makes this function more
1590  * expensive than synth_event_add_next_val(), so use that or the
1591  * none-piecewise synth_event_trace() instead if efficiency is more
1592  * important.
1593  *
1594  * Note however that synth_event_add_next_val() and
1595  * synth_event_add_val() can't be intermixed for a given event trace -
1596  * one or the other but not both can be used at the same time.
1597  *
1598  * Note also that synth_event_trace_end() must be called after all
1599  * values have been added for each event trace, regardless of whether
1600  * adding all field values succeeded or not.
1601  *
1602  * Return: 0 on success, err otherwise.
1603  */
1604 int synth_event_add_val(const char *field_name, u64 val,
1605                         struct synth_event_trace_state *trace_state)
1606 {
1607         return __synth_event_add_val(field_name, val, trace_state);
1608 }
1609 EXPORT_SYMBOL_GPL(synth_event_add_val);
1610
1611 /**
1612  * synth_event_trace_end - End piecewise synthetic event trace
1613  * @trace_state: A pointer to object tracking the piecewise trace state
1614  *
1615  * End the trace of a synthetic event opened by
1616  * synth_event_trace__start().
1617  *
1618  * This function 'closes' an event trace, which basically means that
1619  * it commits the reserved event and cleans up other loose ends.
1620  *
1621  * A pointer to a trace_state object is passed in, which will keep
1622  * track of the current event trace state opened with
1623  * synth_event_trace_start().
1624  *
1625  * Note that this function must be called after all values have been
1626  * added for each event trace, regardless of whether adding all field
1627  * values succeeded or not.
1628  *
1629  * Return: 0 on success, err otherwise.
1630  */
1631 int synth_event_trace_end(struct synth_event_trace_state *trace_state)
1632 {
1633         if (!trace_state)
1634                 return -EINVAL;
1635
1636         __synth_event_trace_end(trace_state);
1637
1638         return 0;
1639 }
1640 EXPORT_SYMBOL_GPL(synth_event_trace_end);
1641
1642 static int create_synth_event(int argc, const char **argv)
1643 {
1644         const char *name = argv[0];
1645         int len;
1646
1647         if (name[0] != 's' || name[1] != ':')
1648                 return -ECANCELED;
1649         name += 2;
1650
1651         /* This interface accepts group name prefix */
1652         if (strchr(name, '/')) {
1653                 len = str_has_prefix(name, SYNTH_SYSTEM "/");
1654                 if (len == 0)
1655                         return -EINVAL;
1656                 name += len;
1657         }
1658         return __create_synth_event(argc - 1, name, argv + 1);
1659 }
1660
1661 static int synth_event_release(struct dyn_event *ev)
1662 {
1663         struct synth_event *event = to_synth_event(ev);
1664         int ret;
1665
1666         if (event->ref)
1667                 return -EBUSY;
1668
1669         ret = unregister_synth_event(event);
1670         if (ret)
1671                 return ret;
1672
1673         dyn_event_remove(ev);
1674         free_synth_event(event);
1675         return 0;
1676 }
1677
1678 static int __synth_event_show(struct seq_file *m, struct synth_event *event)
1679 {
1680         struct synth_field *field;
1681         unsigned int i;
1682
1683         seq_printf(m, "%s\t", event->name);
1684
1685         for (i = 0; i < event->n_fields; i++) {
1686                 field = event->fields[i];
1687
1688                 /* parameter values */
1689                 seq_printf(m, "%s %s%s", field->type, field->name,
1690                            i == event->n_fields - 1 ? "" : "; ");
1691         }
1692
1693         seq_putc(m, '\n');
1694
1695         return 0;
1696 }
1697
1698 static int synth_event_show(struct seq_file *m, struct dyn_event *ev)
1699 {
1700         struct synth_event *event = to_synth_event(ev);
1701
1702         seq_printf(m, "s:%s/", event->class.system);
1703
1704         return __synth_event_show(m, event);
1705 }
1706
1707 static int synth_events_seq_show(struct seq_file *m, void *v)
1708 {
1709         struct dyn_event *ev = v;
1710
1711         if (!is_synth_event(ev))
1712                 return 0;
1713
1714         return __synth_event_show(m, to_synth_event(ev));
1715 }
1716
1717 static const struct seq_operations synth_events_seq_op = {
1718         .start  = dyn_event_seq_start,
1719         .next   = dyn_event_seq_next,
1720         .stop   = dyn_event_seq_stop,
1721         .show   = synth_events_seq_show,
1722 };
1723
1724 static int synth_events_open(struct inode *inode, struct file *file)
1725 {
1726         int ret;
1727
1728         ret = security_locked_down(LOCKDOWN_TRACEFS);
1729         if (ret)
1730                 return ret;
1731
1732         if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
1733                 ret = dyn_events_release_all(&synth_event_ops);
1734                 if (ret < 0)
1735                         return ret;
1736         }
1737
1738         return seq_open(file, &synth_events_seq_op);
1739 }
1740
1741 static ssize_t synth_events_write(struct file *file,
1742                                   const char __user *buffer,
1743                                   size_t count, loff_t *ppos)
1744 {
1745         return trace_parse_run_command(file, buffer, count, ppos,
1746                                        create_or_delete_synth_event);
1747 }
1748
1749 static const struct file_operations synth_events_fops = {
1750         .open           = synth_events_open,
1751         .write          = synth_events_write,
1752         .read           = seq_read,
1753         .llseek         = seq_lseek,
1754         .release        = seq_release,
1755 };
1756
1757 static __init int trace_events_synth_init(void)
1758 {
1759         struct dentry *entry = NULL;
1760         struct dentry *d_tracer;
1761         int err = 0;
1762
1763         err = dyn_event_register(&synth_event_ops);
1764         if (err) {
1765                 pr_warn("Could not register synth_event_ops\n");
1766                 return err;
1767         }
1768
1769         d_tracer = tracing_init_dentry();
1770         if (IS_ERR(d_tracer)) {
1771                 err = PTR_ERR(d_tracer);
1772                 goto err;
1773         }
1774
1775         entry = tracefs_create_file("synthetic_events", 0644, d_tracer,
1776                                     NULL, &synth_events_fops);
1777         if (!entry) {
1778                 err = -ENODEV;
1779                 goto err;
1780         }
1781
1782         return err;
1783  err:
1784         pr_warn("Could not create tracefs 'synthetic_events' entry\n");
1785
1786         return err;
1787 }
1788
1789 fs_initcall(trace_events_synth_init);