Merge branch 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / kernel / trace / trace_events_hist.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * trace_events_hist - trace event hist triggers
4  *
5  * Copyright (C) 2015 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 "tracing_map.h"
22 #include "trace_synth.h"
23
24 #define ERRORS                                                          \
25         C(NONE,                 "No error"),                            \
26         C(DUPLICATE_VAR,        "Variable already defined"),            \
27         C(VAR_NOT_UNIQUE,       "Variable name not unique, need to use fully qualified name (subsys.event.var) for variable"), \
28         C(TOO_MANY_VARS,        "Too many variables defined"),          \
29         C(MALFORMED_ASSIGNMENT, "Malformed assignment"),                \
30         C(NAMED_MISMATCH,       "Named hist trigger doesn't match existing named trigger (includes variables)"), \
31         C(TRIGGER_EEXIST,       "Hist trigger already exists"),         \
32         C(TRIGGER_ENOENT_CLEAR, "Can't clear or continue a nonexistent hist trigger"), \
33         C(SET_CLOCK_FAIL,       "Couldn't set trace_clock"),            \
34         C(BAD_FIELD_MODIFIER,   "Invalid field modifier"),              \
35         C(TOO_MANY_SUBEXPR,     "Too many subexpressions (3 max)"),     \
36         C(TIMESTAMP_MISMATCH,   "Timestamp units in expression don't match"), \
37         C(TOO_MANY_FIELD_VARS,  "Too many field variables defined"),    \
38         C(EVENT_FILE_NOT_FOUND, "Event file not found"),                \
39         C(HIST_NOT_FOUND,       "Matching event histogram not found"),  \
40         C(HIST_CREATE_FAIL,     "Couldn't create histogram for field"), \
41         C(SYNTH_VAR_NOT_FOUND,  "Couldn't find synthetic variable"),    \
42         C(SYNTH_EVENT_NOT_FOUND,"Couldn't find synthetic event"),       \
43         C(SYNTH_TYPE_MISMATCH,  "Param type doesn't match synthetic event field type"), \
44         C(SYNTH_COUNT_MISMATCH, "Param count doesn't match synthetic event field count"), \
45         C(FIELD_VAR_PARSE_FAIL, "Couldn't parse field variable"),       \
46         C(VAR_CREATE_FIND_FAIL, "Couldn't create or find variable"),    \
47         C(ONX_NOT_VAR,          "For onmax(x) or onchange(x), x must be a variable"), \
48         C(ONX_VAR_NOT_FOUND,    "Couldn't find onmax or onchange variable"), \
49         C(ONX_VAR_CREATE_FAIL,  "Couldn't create onmax or onchange variable"), \
50         C(FIELD_VAR_CREATE_FAIL,"Couldn't create field variable"),      \
51         C(TOO_MANY_PARAMS,      "Too many action params"),              \
52         C(PARAM_NOT_FOUND,      "Couldn't find param"),                 \
53         C(INVALID_PARAM,        "Invalid action param"),                \
54         C(ACTION_NOT_FOUND,     "No action found"),                     \
55         C(NO_SAVE_PARAMS,       "No params found for save()"),          \
56         C(TOO_MANY_SAVE_ACTIONS,"Can't have more than one save() action per hist"), \
57         C(ACTION_MISMATCH,      "Handler doesn't support action"),      \
58         C(NO_CLOSING_PAREN,     "No closing paren found"),              \
59         C(SUBSYS_NOT_FOUND,     "Missing subsystem"),                   \
60         C(INVALID_SUBSYS_EVENT, "Invalid subsystem or event name"),     \
61         C(INVALID_REF_KEY,      "Using variable references in keys not supported"), \
62         C(VAR_NOT_FOUND,        "Couldn't find variable"),              \
63         C(FIELD_NOT_FOUND,      "Couldn't find field"),                 \
64         C(EMPTY_ASSIGNMENT,     "Empty assignment"),                    \
65         C(INVALID_SORT_MODIFIER,"Invalid sort modifier"),               \
66         C(EMPTY_SORT_FIELD,     "Empty sort field"),                    \
67         C(TOO_MANY_SORT_FIELDS, "Too many sort fields (Max = 2)"),      \
68         C(INVALID_SORT_FIELD,   "Sort field must be a key or a val"),   \
69         C(INVALID_STR_OPERAND,  "String type can not be an operand in expression"),
70
71 #undef C
72 #define C(a, b)         HIST_ERR_##a
73
74 enum { ERRORS };
75
76 #undef C
77 #define C(a, b)         b
78
79 static const char *err_text[] = { ERRORS };
80
81 struct hist_field;
82
83 typedef u64 (*hist_field_fn_t) (struct hist_field *field,
84                                 struct tracing_map_elt *elt,
85                                 struct trace_buffer *buffer,
86                                 struct ring_buffer_event *rbe,
87                                 void *event);
88
89 #define HIST_FIELD_OPERANDS_MAX 2
90 #define HIST_FIELDS_MAX         (TRACING_MAP_FIELDS_MAX + TRACING_MAP_VARS_MAX)
91 #define HIST_ACTIONS_MAX        8
92
93 enum field_op_id {
94         FIELD_OP_NONE,
95         FIELD_OP_PLUS,
96         FIELD_OP_MINUS,
97         FIELD_OP_UNARY_MINUS,
98 };
99
100 /*
101  * A hist_var (histogram variable) contains variable information for
102  * hist_fields having the HIST_FIELD_FL_VAR or HIST_FIELD_FL_VAR_REF
103  * flag set.  A hist_var has a variable name e.g. ts0, and is
104  * associated with a given histogram trigger, as specified by
105  * hist_data.  The hist_var idx is the unique index assigned to the
106  * variable by the hist trigger's tracing_map.  The idx is what is
107  * used to set a variable's value and, by a variable reference, to
108  * retrieve it.
109  */
110 struct hist_var {
111         char                            *name;
112         struct hist_trigger_data        *hist_data;
113         unsigned int                    idx;
114 };
115
116 struct hist_field {
117         struct ftrace_event_field       *field;
118         unsigned long                   flags;
119         hist_field_fn_t                 fn;
120         unsigned int                    ref;
121         unsigned int                    size;
122         unsigned int                    offset;
123         unsigned int                    is_signed;
124         const char                      *type;
125         struct hist_field               *operands[HIST_FIELD_OPERANDS_MAX];
126         struct hist_trigger_data        *hist_data;
127
128         /*
129          * Variable fields contain variable-specific info in var.
130          */
131         struct hist_var                 var;
132         enum field_op_id                operator;
133         char                            *system;
134         char                            *event_name;
135
136         /*
137          * The name field is used for EXPR and VAR_REF fields.  VAR
138          * fields contain the variable name in var.name.
139          */
140         char                            *name;
141
142         /*
143          * When a histogram trigger is hit, if it has any references
144          * to variables, the values of those variables are collected
145          * into a var_ref_vals array by resolve_var_refs().  The
146          * current value of each variable is read from the tracing_map
147          * using the hist field's hist_var.idx and entered into the
148          * var_ref_idx entry i.e. var_ref_vals[var_ref_idx].
149          */
150         unsigned int                    var_ref_idx;
151         bool                            read_once;
152
153         unsigned int                    var_str_idx;
154 };
155
156 static u64 hist_field_none(struct hist_field *field,
157                            struct tracing_map_elt *elt,
158                            struct trace_buffer *buffer,
159                            struct ring_buffer_event *rbe,
160                            void *event)
161 {
162         return 0;
163 }
164
165 static u64 hist_field_counter(struct hist_field *field,
166                               struct tracing_map_elt *elt,
167                               struct trace_buffer *buffer,
168                               struct ring_buffer_event *rbe,
169                               void *event)
170 {
171         return 1;
172 }
173
174 static u64 hist_field_string(struct hist_field *hist_field,
175                              struct tracing_map_elt *elt,
176                              struct trace_buffer *buffer,
177                              struct ring_buffer_event *rbe,
178                              void *event)
179 {
180         char *addr = (char *)(event + hist_field->field->offset);
181
182         return (u64)(unsigned long)addr;
183 }
184
185 static u64 hist_field_dynstring(struct hist_field *hist_field,
186                                 struct tracing_map_elt *elt,
187                                 struct trace_buffer *buffer,
188                                 struct ring_buffer_event *rbe,
189                                 void *event)
190 {
191         u32 str_item = *(u32 *)(event + hist_field->field->offset);
192         int str_loc = str_item & 0xffff;
193         char *addr = (char *)(event + str_loc);
194
195         return (u64)(unsigned long)addr;
196 }
197
198 static u64 hist_field_pstring(struct hist_field *hist_field,
199                               struct tracing_map_elt *elt,
200                               struct trace_buffer *buffer,
201                               struct ring_buffer_event *rbe,
202                               void *event)
203 {
204         char **addr = (char **)(event + hist_field->field->offset);
205
206         return (u64)(unsigned long)*addr;
207 }
208
209 static u64 hist_field_log2(struct hist_field *hist_field,
210                            struct tracing_map_elt *elt,
211                            struct trace_buffer *buffer,
212                            struct ring_buffer_event *rbe,
213                            void *event)
214 {
215         struct hist_field *operand = hist_field->operands[0];
216
217         u64 val = operand->fn(operand, elt, buffer, rbe, event);
218
219         return (u64) ilog2(roundup_pow_of_two(val));
220 }
221
222 static u64 hist_field_plus(struct hist_field *hist_field,
223                            struct tracing_map_elt *elt,
224                            struct trace_buffer *buffer,
225                            struct ring_buffer_event *rbe,
226                            void *event)
227 {
228         struct hist_field *operand1 = hist_field->operands[0];
229         struct hist_field *operand2 = hist_field->operands[1];
230
231         u64 val1 = operand1->fn(operand1, elt, buffer, rbe, event);
232         u64 val2 = operand2->fn(operand2, elt, buffer, rbe, event);
233
234         return val1 + val2;
235 }
236
237 static u64 hist_field_minus(struct hist_field *hist_field,
238                             struct tracing_map_elt *elt,
239                             struct trace_buffer *buffer,
240                             struct ring_buffer_event *rbe,
241                             void *event)
242 {
243         struct hist_field *operand1 = hist_field->operands[0];
244         struct hist_field *operand2 = hist_field->operands[1];
245
246         u64 val1 = operand1->fn(operand1, elt, buffer, rbe, event);
247         u64 val2 = operand2->fn(operand2, elt, buffer, rbe, event);
248
249         return val1 - val2;
250 }
251
252 static u64 hist_field_unary_minus(struct hist_field *hist_field,
253                                   struct tracing_map_elt *elt,
254                                   struct trace_buffer *buffer,
255                                   struct ring_buffer_event *rbe,
256                                   void *event)
257 {
258         struct hist_field *operand = hist_field->operands[0];
259
260         s64 sval = (s64)operand->fn(operand, elt, buffer, rbe, event);
261         u64 val = (u64)-sval;
262
263         return val;
264 }
265
266 #define DEFINE_HIST_FIELD_FN(type)                                      \
267         static u64 hist_field_##type(struct hist_field *hist_field,     \
268                                      struct tracing_map_elt *elt,       \
269                                      struct trace_buffer *buffer,       \
270                                      struct ring_buffer_event *rbe,     \
271                                      void *event)                       \
272 {                                                                       \
273         type *addr = (type *)(event + hist_field->field->offset);       \
274                                                                         \
275         return (u64)(unsigned long)*addr;                               \
276 }
277
278 DEFINE_HIST_FIELD_FN(s64);
279 DEFINE_HIST_FIELD_FN(u64);
280 DEFINE_HIST_FIELD_FN(s32);
281 DEFINE_HIST_FIELD_FN(u32);
282 DEFINE_HIST_FIELD_FN(s16);
283 DEFINE_HIST_FIELD_FN(u16);
284 DEFINE_HIST_FIELD_FN(s8);
285 DEFINE_HIST_FIELD_FN(u8);
286
287 #define for_each_hist_field(i, hist_data)       \
288         for ((i) = 0; (i) < (hist_data)->n_fields; (i)++)
289
290 #define for_each_hist_val_field(i, hist_data)   \
291         for ((i) = 0; (i) < (hist_data)->n_vals; (i)++)
292
293 #define for_each_hist_key_field(i, hist_data)   \
294         for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++)
295
296 #define HIST_STACKTRACE_DEPTH   16
297 #define HIST_STACKTRACE_SIZE    (HIST_STACKTRACE_DEPTH * sizeof(unsigned long))
298 #define HIST_STACKTRACE_SKIP    5
299
300 #define HITCOUNT_IDX            0
301 #define HIST_KEY_SIZE_MAX       (MAX_FILTER_STR_VAL + HIST_STACKTRACE_SIZE)
302
303 enum hist_field_flags {
304         HIST_FIELD_FL_HITCOUNT          = 1 << 0,
305         HIST_FIELD_FL_KEY               = 1 << 1,
306         HIST_FIELD_FL_STRING            = 1 << 2,
307         HIST_FIELD_FL_HEX               = 1 << 3,
308         HIST_FIELD_FL_SYM               = 1 << 4,
309         HIST_FIELD_FL_SYM_OFFSET        = 1 << 5,
310         HIST_FIELD_FL_EXECNAME          = 1 << 6,
311         HIST_FIELD_FL_SYSCALL           = 1 << 7,
312         HIST_FIELD_FL_STACKTRACE        = 1 << 8,
313         HIST_FIELD_FL_LOG2              = 1 << 9,
314         HIST_FIELD_FL_TIMESTAMP         = 1 << 10,
315         HIST_FIELD_FL_TIMESTAMP_USECS   = 1 << 11,
316         HIST_FIELD_FL_VAR               = 1 << 12,
317         HIST_FIELD_FL_EXPR              = 1 << 13,
318         HIST_FIELD_FL_VAR_REF           = 1 << 14,
319         HIST_FIELD_FL_CPU               = 1 << 15,
320         HIST_FIELD_FL_ALIAS             = 1 << 16,
321 };
322
323 struct var_defs {
324         unsigned int    n_vars;
325         char            *name[TRACING_MAP_VARS_MAX];
326         char            *expr[TRACING_MAP_VARS_MAX];
327 };
328
329 struct hist_trigger_attrs {
330         char            *keys_str;
331         char            *vals_str;
332         char            *sort_key_str;
333         char            *name;
334         char            *clock;
335         bool            pause;
336         bool            cont;
337         bool            clear;
338         bool            ts_in_usecs;
339         unsigned int    map_bits;
340
341         char            *assignment_str[TRACING_MAP_VARS_MAX];
342         unsigned int    n_assignments;
343
344         char            *action_str[HIST_ACTIONS_MAX];
345         unsigned int    n_actions;
346
347         struct var_defs var_defs;
348 };
349
350 struct field_var {
351         struct hist_field       *var;
352         struct hist_field       *val;
353 };
354
355 struct field_var_hist {
356         struct hist_trigger_data        *hist_data;
357         char                            *cmd;
358 };
359
360 struct hist_trigger_data {
361         struct hist_field               *fields[HIST_FIELDS_MAX];
362         unsigned int                    n_vals;
363         unsigned int                    n_keys;
364         unsigned int                    n_fields;
365         unsigned int                    n_vars;
366         unsigned int                    n_var_str;
367         unsigned int                    key_size;
368         struct tracing_map_sort_key     sort_keys[TRACING_MAP_SORT_KEYS_MAX];
369         unsigned int                    n_sort_keys;
370         struct trace_event_file         *event_file;
371         struct hist_trigger_attrs       *attrs;
372         struct tracing_map              *map;
373         bool                            enable_timestamps;
374         bool                            remove;
375         struct hist_field               *var_refs[TRACING_MAP_VARS_MAX];
376         unsigned int                    n_var_refs;
377
378         struct action_data              *actions[HIST_ACTIONS_MAX];
379         unsigned int                    n_actions;
380
381         struct field_var                *field_vars[SYNTH_FIELDS_MAX];
382         unsigned int                    n_field_vars;
383         unsigned int                    n_field_var_str;
384         struct field_var_hist           *field_var_hists[SYNTH_FIELDS_MAX];
385         unsigned int                    n_field_var_hists;
386
387         struct field_var                *save_vars[SYNTH_FIELDS_MAX];
388         unsigned int                    n_save_vars;
389         unsigned int                    n_save_var_str;
390 };
391
392 struct action_data;
393
394 typedef void (*action_fn_t) (struct hist_trigger_data *hist_data,
395                              struct tracing_map_elt *elt,
396                              struct trace_buffer *buffer, void *rec,
397                              struct ring_buffer_event *rbe, void *key,
398                              struct action_data *data, u64 *var_ref_vals);
399
400 typedef bool (*check_track_val_fn_t) (u64 track_val, u64 var_val);
401
402 enum handler_id {
403         HANDLER_ONMATCH = 1,
404         HANDLER_ONMAX,
405         HANDLER_ONCHANGE,
406 };
407
408 enum action_id {
409         ACTION_SAVE = 1,
410         ACTION_TRACE,
411         ACTION_SNAPSHOT,
412 };
413
414 struct action_data {
415         enum handler_id         handler;
416         enum action_id          action;
417         char                    *action_name;
418         action_fn_t             fn;
419
420         unsigned int            n_params;
421         char                    *params[SYNTH_FIELDS_MAX];
422
423         /*
424          * When a histogram trigger is hit, the values of any
425          * references to variables, including variables being passed
426          * as parameters to synthetic events, are collected into a
427          * var_ref_vals array.  This var_ref_idx array is an array of
428          * indices into the var_ref_vals array, one for each synthetic
429          * event param, and is passed to the synthetic event
430          * invocation.
431          */
432         unsigned int            var_ref_idx[TRACING_MAP_VARS_MAX];
433         struct synth_event      *synth_event;
434         bool                    use_trace_keyword;
435         char                    *synth_event_name;
436
437         union {
438                 struct {
439                         char                    *event;
440                         char                    *event_system;
441                 } match_data;
442
443                 struct {
444                         /*
445                          * var_str contains the $-unstripped variable
446                          * name referenced by var_ref, and used when
447                          * printing the action.  Because var_ref
448                          * creation is deferred to create_actions(),
449                          * we need a per-action way to save it until
450                          * then, thus var_str.
451                          */
452                         char                    *var_str;
453
454                         /*
455                          * var_ref refers to the variable being
456                          * tracked e.g onmax($var).
457                          */
458                         struct hist_field       *var_ref;
459
460                         /*
461                          * track_var contains the 'invisible' tracking
462                          * variable created to keep the current
463                          * e.g. max value.
464                          */
465                         struct hist_field       *track_var;
466
467                         check_track_val_fn_t    check_val;
468                         action_fn_t             save_data;
469                 } track_data;
470         };
471 };
472
473 struct track_data {
474         u64                             track_val;
475         bool                            updated;
476
477         unsigned int                    key_len;
478         void                            *key;
479         struct tracing_map_elt          elt;
480
481         struct action_data              *action_data;
482         struct hist_trigger_data        *hist_data;
483 };
484
485 struct hist_elt_data {
486         char *comm;
487         u64 *var_ref_vals;
488         char *field_var_str[SYNTH_FIELDS_MAX];
489 };
490
491 struct snapshot_context {
492         struct tracing_map_elt  *elt;
493         void                    *key;
494 };
495
496 static void track_data_free(struct track_data *track_data)
497 {
498         struct hist_elt_data *elt_data;
499
500         if (!track_data)
501                 return;
502
503         kfree(track_data->key);
504
505         elt_data = track_data->elt.private_data;
506         if (elt_data) {
507                 kfree(elt_data->comm);
508                 kfree(elt_data);
509         }
510
511         kfree(track_data);
512 }
513
514 static struct track_data *track_data_alloc(unsigned int key_len,
515                                            struct action_data *action_data,
516                                            struct hist_trigger_data *hist_data)
517 {
518         struct track_data *data = kzalloc(sizeof(*data), GFP_KERNEL);
519         struct hist_elt_data *elt_data;
520
521         if (!data)
522                 return ERR_PTR(-ENOMEM);
523
524         data->key = kzalloc(key_len, GFP_KERNEL);
525         if (!data->key) {
526                 track_data_free(data);
527                 return ERR_PTR(-ENOMEM);
528         }
529
530         data->key_len = key_len;
531         data->action_data = action_data;
532         data->hist_data = hist_data;
533
534         elt_data = kzalloc(sizeof(*elt_data), GFP_KERNEL);
535         if (!elt_data) {
536                 track_data_free(data);
537                 return ERR_PTR(-ENOMEM);
538         }
539
540         data->elt.private_data = elt_data;
541
542         elt_data->comm = kzalloc(TASK_COMM_LEN, GFP_KERNEL);
543         if (!elt_data->comm) {
544                 track_data_free(data);
545                 return ERR_PTR(-ENOMEM);
546         }
547
548         return data;
549 }
550
551 static char last_cmd[MAX_FILTER_STR_VAL];
552 static char last_cmd_loc[MAX_FILTER_STR_VAL];
553
554 static int errpos(char *str)
555 {
556         return err_pos(last_cmd, str);
557 }
558
559 static void last_cmd_set(struct trace_event_file *file, char *str)
560 {
561         const char *system = NULL, *name = NULL;
562         struct trace_event_call *call;
563
564         if (!str)
565                 return;
566
567         strcpy(last_cmd, "hist:");
568         strncat(last_cmd, str, MAX_FILTER_STR_VAL - 1 - sizeof("hist:"));
569
570         if (file) {
571                 call = file->event_call;
572                 system = call->class->system;
573                 if (system) {
574                         name = trace_event_name(call);
575                         if (!name)
576                                 system = NULL;
577                 }
578         }
579
580         if (system)
581                 snprintf(last_cmd_loc, MAX_FILTER_STR_VAL, "hist:%s:%s", system, name);
582 }
583
584 static void hist_err(struct trace_array *tr, u8 err_type, u8 err_pos)
585 {
586         tracing_log_err(tr, last_cmd_loc, last_cmd, err_text,
587                         err_type, err_pos);
588 }
589
590 static void hist_err_clear(void)
591 {
592         last_cmd[0] = '\0';
593         last_cmd_loc[0] = '\0';
594 }
595
596 typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals,
597                                     unsigned int *var_ref_idx);
598
599 static inline void trace_synth(struct synth_event *event, u64 *var_ref_vals,
600                                unsigned int *var_ref_idx)
601 {
602         struct tracepoint *tp = event->tp;
603
604         if (unlikely(atomic_read(&tp->key.enabled) > 0)) {
605                 struct tracepoint_func *probe_func_ptr;
606                 synth_probe_func_t probe_func;
607                 void *__data;
608
609                 if (!(cpu_online(raw_smp_processor_id())))
610                         return;
611
612                 probe_func_ptr = rcu_dereference_sched((tp)->funcs);
613                 if (probe_func_ptr) {
614                         do {
615                                 probe_func = probe_func_ptr->func;
616                                 __data = probe_func_ptr->data;
617                                 probe_func(__data, var_ref_vals, var_ref_idx);
618                         } while ((++probe_func_ptr)->func);
619                 }
620         }
621 }
622
623 static void action_trace(struct hist_trigger_data *hist_data,
624                          struct tracing_map_elt *elt,
625                          struct trace_buffer *buffer, void *rec,
626                          struct ring_buffer_event *rbe, void *key,
627                          struct action_data *data, u64 *var_ref_vals)
628 {
629         struct synth_event *event = data->synth_event;
630
631         trace_synth(event, var_ref_vals, data->var_ref_idx);
632 }
633
634 struct hist_var_data {
635         struct list_head list;
636         struct hist_trigger_data *hist_data;
637 };
638
639 static u64 hist_field_timestamp(struct hist_field *hist_field,
640                                 struct tracing_map_elt *elt,
641                                 struct trace_buffer *buffer,
642                                 struct ring_buffer_event *rbe,
643                                 void *event)
644 {
645         struct hist_trigger_data *hist_data = hist_field->hist_data;
646         struct trace_array *tr = hist_data->event_file->tr;
647
648         u64 ts = ring_buffer_event_time_stamp(buffer, rbe);
649
650         if (hist_data->attrs->ts_in_usecs && trace_clock_in_ns(tr))
651                 ts = ns2usecs(ts);
652
653         return ts;
654 }
655
656 static u64 hist_field_cpu(struct hist_field *hist_field,
657                           struct tracing_map_elt *elt,
658                           struct trace_buffer *buffer,
659                           struct ring_buffer_event *rbe,
660                           void *event)
661 {
662         int cpu = smp_processor_id();
663
664         return cpu;
665 }
666
667 /**
668  * check_field_for_var_ref - Check if a VAR_REF field references a variable
669  * @hist_field: The VAR_REF field to check
670  * @var_data: The hist trigger that owns the variable
671  * @var_idx: The trigger variable identifier
672  *
673  * Check the given VAR_REF field to see whether or not it references
674  * the given variable associated with the given trigger.
675  *
676  * Return: The VAR_REF field if it does reference the variable, NULL if not
677  */
678 static struct hist_field *
679 check_field_for_var_ref(struct hist_field *hist_field,
680                         struct hist_trigger_data *var_data,
681                         unsigned int var_idx)
682 {
683         WARN_ON(!(hist_field && hist_field->flags & HIST_FIELD_FL_VAR_REF));
684
685         if (hist_field && hist_field->var.idx == var_idx &&
686             hist_field->var.hist_data == var_data)
687                 return hist_field;
688
689         return NULL;
690 }
691
692 /**
693  * find_var_ref - Check if a trigger has a reference to a trigger variable
694  * @hist_data: The hist trigger that might have a reference to the variable
695  * @var_data: The hist trigger that owns the variable
696  * @var_idx: The trigger variable identifier
697  *
698  * Check the list of var_refs[] on the first hist trigger to see
699  * whether any of them are references to the variable on the second
700  * trigger.
701  *
702  * Return: The VAR_REF field referencing the variable if so, NULL if not
703  */
704 static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data,
705                                        struct hist_trigger_data *var_data,
706                                        unsigned int var_idx)
707 {
708         struct hist_field *hist_field;
709         unsigned int i;
710
711         for (i = 0; i < hist_data->n_var_refs; i++) {
712                 hist_field = hist_data->var_refs[i];
713                 if (check_field_for_var_ref(hist_field, var_data, var_idx))
714                         return hist_field;
715         }
716
717         return NULL;
718 }
719
720 /**
721  * find_any_var_ref - Check if there is a reference to a given trigger variable
722  * @hist_data: The hist trigger
723  * @var_idx: The trigger variable identifier
724  *
725  * Check to see whether the given variable is currently referenced by
726  * any other trigger.
727  *
728  * The trigger the variable is defined on is explicitly excluded - the
729  * assumption being that a self-reference doesn't prevent a trigger
730  * from being removed.
731  *
732  * Return: The VAR_REF field referencing the variable if so, NULL if not
733  */
734 static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data,
735                                            unsigned int var_idx)
736 {
737         struct trace_array *tr = hist_data->event_file->tr;
738         struct hist_field *found = NULL;
739         struct hist_var_data *var_data;
740
741         list_for_each_entry(var_data, &tr->hist_vars, list) {
742                 if (var_data->hist_data == hist_data)
743                         continue;
744                 found = find_var_ref(var_data->hist_data, hist_data, var_idx);
745                 if (found)
746                         break;
747         }
748
749         return found;
750 }
751
752 /**
753  * check_var_refs - Check if there is a reference to any of trigger's variables
754  * @hist_data: The hist trigger
755  *
756  * A trigger can define one or more variables.  If any one of them is
757  * currently referenced by any other trigger, this function will
758  * determine that.
759
760  * Typically used to determine whether or not a trigger can be removed
761  * - if there are any references to a trigger's variables, it cannot.
762  *
763  * Return: True if there is a reference to any of trigger's variables
764  */
765 static bool check_var_refs(struct hist_trigger_data *hist_data)
766 {
767         struct hist_field *field;
768         bool found = false;
769         int i;
770
771         for_each_hist_field(i, hist_data) {
772                 field = hist_data->fields[i];
773                 if (field && field->flags & HIST_FIELD_FL_VAR) {
774                         if (find_any_var_ref(hist_data, field->var.idx)) {
775                                 found = true;
776                                 break;
777                         }
778                 }
779         }
780
781         return found;
782 }
783
784 static struct hist_var_data *find_hist_vars(struct hist_trigger_data *hist_data)
785 {
786         struct trace_array *tr = hist_data->event_file->tr;
787         struct hist_var_data *var_data, *found = NULL;
788
789         list_for_each_entry(var_data, &tr->hist_vars, list) {
790                 if (var_data->hist_data == hist_data) {
791                         found = var_data;
792                         break;
793                 }
794         }
795
796         return found;
797 }
798
799 static bool field_has_hist_vars(struct hist_field *hist_field,
800                                 unsigned int level)
801 {
802         int i;
803
804         if (level > 3)
805                 return false;
806
807         if (!hist_field)
808                 return false;
809
810         if (hist_field->flags & HIST_FIELD_FL_VAR ||
811             hist_field->flags & HIST_FIELD_FL_VAR_REF)
812                 return true;
813
814         for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) {
815                 struct hist_field *operand;
816
817                 operand = hist_field->operands[i];
818                 if (field_has_hist_vars(operand, level + 1))
819                         return true;
820         }
821
822         return false;
823 }
824
825 static bool has_hist_vars(struct hist_trigger_data *hist_data)
826 {
827         struct hist_field *hist_field;
828         int i;
829
830         for_each_hist_field(i, hist_data) {
831                 hist_field = hist_data->fields[i];
832                 if (field_has_hist_vars(hist_field, 0))
833                         return true;
834         }
835
836         return false;
837 }
838
839 static int save_hist_vars(struct hist_trigger_data *hist_data)
840 {
841         struct trace_array *tr = hist_data->event_file->tr;
842         struct hist_var_data *var_data;
843
844         var_data = find_hist_vars(hist_data);
845         if (var_data)
846                 return 0;
847
848         if (tracing_check_open_get_tr(tr))
849                 return -ENODEV;
850
851         var_data = kzalloc(sizeof(*var_data), GFP_KERNEL);
852         if (!var_data) {
853                 trace_array_put(tr);
854                 return -ENOMEM;
855         }
856
857         var_data->hist_data = hist_data;
858         list_add(&var_data->list, &tr->hist_vars);
859
860         return 0;
861 }
862
863 static void remove_hist_vars(struct hist_trigger_data *hist_data)
864 {
865         struct trace_array *tr = hist_data->event_file->tr;
866         struct hist_var_data *var_data;
867
868         var_data = find_hist_vars(hist_data);
869         if (!var_data)
870                 return;
871
872         if (WARN_ON(check_var_refs(hist_data)))
873                 return;
874
875         list_del(&var_data->list);
876
877         kfree(var_data);
878
879         trace_array_put(tr);
880 }
881
882 static struct hist_field *find_var_field(struct hist_trigger_data *hist_data,
883                                          const char *var_name)
884 {
885         struct hist_field *hist_field, *found = NULL;
886         int i;
887
888         for_each_hist_field(i, hist_data) {
889                 hist_field = hist_data->fields[i];
890                 if (hist_field && hist_field->flags & HIST_FIELD_FL_VAR &&
891                     strcmp(hist_field->var.name, var_name) == 0) {
892                         found = hist_field;
893                         break;
894                 }
895         }
896
897         return found;
898 }
899
900 static struct hist_field *find_var(struct hist_trigger_data *hist_data,
901                                    struct trace_event_file *file,
902                                    const char *var_name)
903 {
904         struct hist_trigger_data *test_data;
905         struct event_trigger_data *test;
906         struct hist_field *hist_field;
907
908         lockdep_assert_held(&event_mutex);
909
910         hist_field = find_var_field(hist_data, var_name);
911         if (hist_field)
912                 return hist_field;
913
914         list_for_each_entry(test, &file->triggers, list) {
915                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
916                         test_data = test->private_data;
917                         hist_field = find_var_field(test_data, var_name);
918                         if (hist_field)
919                                 return hist_field;
920                 }
921         }
922
923         return NULL;
924 }
925
926 static struct trace_event_file *find_var_file(struct trace_array *tr,
927                                               char *system,
928                                               char *event_name,
929                                               char *var_name)
930 {
931         struct hist_trigger_data *var_hist_data;
932         struct hist_var_data *var_data;
933         struct trace_event_file *file, *found = NULL;
934
935         if (system)
936                 return find_event_file(tr, system, event_name);
937
938         list_for_each_entry(var_data, &tr->hist_vars, list) {
939                 var_hist_data = var_data->hist_data;
940                 file = var_hist_data->event_file;
941                 if (file == found)
942                         continue;
943
944                 if (find_var_field(var_hist_data, var_name)) {
945                         if (found) {
946                                 hist_err(tr, HIST_ERR_VAR_NOT_UNIQUE, errpos(var_name));
947                                 return NULL;
948                         }
949
950                         found = file;
951                 }
952         }
953
954         return found;
955 }
956
957 static struct hist_field *find_file_var(struct trace_event_file *file,
958                                         const char *var_name)
959 {
960         struct hist_trigger_data *test_data;
961         struct event_trigger_data *test;
962         struct hist_field *hist_field;
963
964         lockdep_assert_held(&event_mutex);
965
966         list_for_each_entry(test, &file->triggers, list) {
967                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
968                         test_data = test->private_data;
969                         hist_field = find_var_field(test_data, var_name);
970                         if (hist_field)
971                                 return hist_field;
972                 }
973         }
974
975         return NULL;
976 }
977
978 static struct hist_field *
979 find_match_var(struct hist_trigger_data *hist_data, char *var_name)
980 {
981         struct trace_array *tr = hist_data->event_file->tr;
982         struct hist_field *hist_field, *found = NULL;
983         struct trace_event_file *file;
984         unsigned int i;
985
986         for (i = 0; i < hist_data->n_actions; i++) {
987                 struct action_data *data = hist_data->actions[i];
988
989                 if (data->handler == HANDLER_ONMATCH) {
990                         char *system = data->match_data.event_system;
991                         char *event_name = data->match_data.event;
992
993                         file = find_var_file(tr, system, event_name, var_name);
994                         if (!file)
995                                 continue;
996                         hist_field = find_file_var(file, var_name);
997                         if (hist_field) {
998                                 if (found) {
999                                         hist_err(tr, HIST_ERR_VAR_NOT_UNIQUE,
1000                                                  errpos(var_name));
1001                                         return ERR_PTR(-EINVAL);
1002                                 }
1003
1004                                 found = hist_field;
1005                         }
1006                 }
1007         }
1008         return found;
1009 }
1010
1011 static struct hist_field *find_event_var(struct hist_trigger_data *hist_data,
1012                                          char *system,
1013                                          char *event_name,
1014                                          char *var_name)
1015 {
1016         struct trace_array *tr = hist_data->event_file->tr;
1017         struct hist_field *hist_field = NULL;
1018         struct trace_event_file *file;
1019
1020         if (!system || !event_name) {
1021                 hist_field = find_match_var(hist_data, var_name);
1022                 if (IS_ERR(hist_field))
1023                         return NULL;
1024                 if (hist_field)
1025                         return hist_field;
1026         }
1027
1028         file = find_var_file(tr, system, event_name, var_name);
1029         if (!file)
1030                 return NULL;
1031
1032         hist_field = find_file_var(file, var_name);
1033
1034         return hist_field;
1035 }
1036
1037 static u64 hist_field_var_ref(struct hist_field *hist_field,
1038                               struct tracing_map_elt *elt,
1039                               struct trace_buffer *buffer,
1040                               struct ring_buffer_event *rbe,
1041                               void *event)
1042 {
1043         struct hist_elt_data *elt_data;
1044         u64 var_val = 0;
1045
1046         if (WARN_ON_ONCE(!elt))
1047                 return var_val;
1048
1049         elt_data = elt->private_data;
1050         var_val = elt_data->var_ref_vals[hist_field->var_ref_idx];
1051
1052         return var_val;
1053 }
1054
1055 static bool resolve_var_refs(struct hist_trigger_data *hist_data, void *key,
1056                              u64 *var_ref_vals, bool self)
1057 {
1058         struct hist_trigger_data *var_data;
1059         struct tracing_map_elt *var_elt;
1060         struct hist_field *hist_field;
1061         unsigned int i, var_idx;
1062         bool resolved = true;
1063         u64 var_val = 0;
1064
1065         for (i = 0; i < hist_data->n_var_refs; i++) {
1066                 hist_field = hist_data->var_refs[i];
1067                 var_idx = hist_field->var.idx;
1068                 var_data = hist_field->var.hist_data;
1069
1070                 if (var_data == NULL) {
1071                         resolved = false;
1072                         break;
1073                 }
1074
1075                 if ((self && var_data != hist_data) ||
1076                     (!self && var_data == hist_data))
1077                         continue;
1078
1079                 var_elt = tracing_map_lookup(var_data->map, key);
1080                 if (!var_elt) {
1081                         resolved = false;
1082                         break;
1083                 }
1084
1085                 if (!tracing_map_var_set(var_elt, var_idx)) {
1086                         resolved = false;
1087                         break;
1088                 }
1089
1090                 if (self || !hist_field->read_once)
1091                         var_val = tracing_map_read_var(var_elt, var_idx);
1092                 else
1093                         var_val = tracing_map_read_var_once(var_elt, var_idx);
1094
1095                 var_ref_vals[i] = var_val;
1096         }
1097
1098         return resolved;
1099 }
1100
1101 static const char *hist_field_name(struct hist_field *field,
1102                                    unsigned int level)
1103 {
1104         const char *field_name = "";
1105
1106         if (level > 1)
1107                 return field_name;
1108
1109         if (field->field)
1110                 field_name = field->field->name;
1111         else if (field->flags & HIST_FIELD_FL_LOG2 ||
1112                  field->flags & HIST_FIELD_FL_ALIAS)
1113                 field_name = hist_field_name(field->operands[0], ++level);
1114         else if (field->flags & HIST_FIELD_FL_CPU)
1115                 field_name = "common_cpu";
1116         else if (field->flags & HIST_FIELD_FL_EXPR ||
1117                  field->flags & HIST_FIELD_FL_VAR_REF) {
1118                 if (field->system) {
1119                         static char full_name[MAX_FILTER_STR_VAL];
1120
1121                         strcat(full_name, field->system);
1122                         strcat(full_name, ".");
1123                         strcat(full_name, field->event_name);
1124                         strcat(full_name, ".");
1125                         strcat(full_name, field->name);
1126                         field_name = full_name;
1127                 } else
1128                         field_name = field->name;
1129         } else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
1130                 field_name = "common_timestamp";
1131
1132         if (field_name == NULL)
1133                 field_name = "";
1134
1135         return field_name;
1136 }
1137
1138 static hist_field_fn_t select_value_fn(int field_size, int field_is_signed)
1139 {
1140         hist_field_fn_t fn = NULL;
1141
1142         switch (field_size) {
1143         case 8:
1144                 if (field_is_signed)
1145                         fn = hist_field_s64;
1146                 else
1147                         fn = hist_field_u64;
1148                 break;
1149         case 4:
1150                 if (field_is_signed)
1151                         fn = hist_field_s32;
1152                 else
1153                         fn = hist_field_u32;
1154                 break;
1155         case 2:
1156                 if (field_is_signed)
1157                         fn = hist_field_s16;
1158                 else
1159                         fn = hist_field_u16;
1160                 break;
1161         case 1:
1162                 if (field_is_signed)
1163                         fn = hist_field_s8;
1164                 else
1165                         fn = hist_field_u8;
1166                 break;
1167         }
1168
1169         return fn;
1170 }
1171
1172 static int parse_map_size(char *str)
1173 {
1174         unsigned long size, map_bits;
1175         int ret;
1176
1177         ret = kstrtoul(str, 0, &size);
1178         if (ret)
1179                 goto out;
1180
1181         map_bits = ilog2(roundup_pow_of_two(size));
1182         if (map_bits < TRACING_MAP_BITS_MIN ||
1183             map_bits > TRACING_MAP_BITS_MAX)
1184                 ret = -EINVAL;
1185         else
1186                 ret = map_bits;
1187  out:
1188         return ret;
1189 }
1190
1191 static void destroy_hist_trigger_attrs(struct hist_trigger_attrs *attrs)
1192 {
1193         unsigned int i;
1194
1195         if (!attrs)
1196                 return;
1197
1198         for (i = 0; i < attrs->n_assignments; i++)
1199                 kfree(attrs->assignment_str[i]);
1200
1201         for (i = 0; i < attrs->n_actions; i++)
1202                 kfree(attrs->action_str[i]);
1203
1204         kfree(attrs->name);
1205         kfree(attrs->sort_key_str);
1206         kfree(attrs->keys_str);
1207         kfree(attrs->vals_str);
1208         kfree(attrs->clock);
1209         kfree(attrs);
1210 }
1211
1212 static int parse_action(char *str, struct hist_trigger_attrs *attrs)
1213 {
1214         int ret = -EINVAL;
1215
1216         if (attrs->n_actions >= HIST_ACTIONS_MAX)
1217                 return ret;
1218
1219         if ((str_has_prefix(str, "onmatch(")) ||
1220             (str_has_prefix(str, "onmax(")) ||
1221             (str_has_prefix(str, "onchange("))) {
1222                 attrs->action_str[attrs->n_actions] = kstrdup(str, GFP_KERNEL);
1223                 if (!attrs->action_str[attrs->n_actions]) {
1224                         ret = -ENOMEM;
1225                         return ret;
1226                 }
1227                 attrs->n_actions++;
1228                 ret = 0;
1229         }
1230         return ret;
1231 }
1232
1233 static int parse_assignment(struct trace_array *tr,
1234                             char *str, struct hist_trigger_attrs *attrs)
1235 {
1236         int len, ret = 0;
1237
1238         if ((len = str_has_prefix(str, "key=")) ||
1239             (len = str_has_prefix(str, "keys="))) {
1240                 attrs->keys_str = kstrdup(str + len, GFP_KERNEL);
1241                 if (!attrs->keys_str) {
1242                         ret = -ENOMEM;
1243                         goto out;
1244                 }
1245         } else if ((len = str_has_prefix(str, "val=")) ||
1246                    (len = str_has_prefix(str, "vals=")) ||
1247                    (len = str_has_prefix(str, "values="))) {
1248                 attrs->vals_str = kstrdup(str + len, GFP_KERNEL);
1249                 if (!attrs->vals_str) {
1250                         ret = -ENOMEM;
1251                         goto out;
1252                 }
1253         } else if ((len = str_has_prefix(str, "sort="))) {
1254                 attrs->sort_key_str = kstrdup(str + len, GFP_KERNEL);
1255                 if (!attrs->sort_key_str) {
1256                         ret = -ENOMEM;
1257                         goto out;
1258                 }
1259         } else if (str_has_prefix(str, "name=")) {
1260                 attrs->name = kstrdup(str, GFP_KERNEL);
1261                 if (!attrs->name) {
1262                         ret = -ENOMEM;
1263                         goto out;
1264                 }
1265         } else if ((len = str_has_prefix(str, "clock="))) {
1266                 str += len;
1267
1268                 str = strstrip(str);
1269                 attrs->clock = kstrdup(str, GFP_KERNEL);
1270                 if (!attrs->clock) {
1271                         ret = -ENOMEM;
1272                         goto out;
1273                 }
1274         } else if ((len = str_has_prefix(str, "size="))) {
1275                 int map_bits = parse_map_size(str + len);
1276
1277                 if (map_bits < 0) {
1278                         ret = map_bits;
1279                         goto out;
1280                 }
1281                 attrs->map_bits = map_bits;
1282         } else {
1283                 char *assignment;
1284
1285                 if (attrs->n_assignments == TRACING_MAP_VARS_MAX) {
1286                         hist_err(tr, HIST_ERR_TOO_MANY_VARS, errpos(str));
1287                         ret = -EINVAL;
1288                         goto out;
1289                 }
1290
1291                 assignment = kstrdup(str, GFP_KERNEL);
1292                 if (!assignment) {
1293                         ret = -ENOMEM;
1294                         goto out;
1295                 }
1296
1297                 attrs->assignment_str[attrs->n_assignments++] = assignment;
1298         }
1299  out:
1300         return ret;
1301 }
1302
1303 static struct hist_trigger_attrs *
1304 parse_hist_trigger_attrs(struct trace_array *tr, char *trigger_str)
1305 {
1306         struct hist_trigger_attrs *attrs;
1307         int ret = 0;
1308
1309         attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
1310         if (!attrs)
1311                 return ERR_PTR(-ENOMEM);
1312
1313         while (trigger_str) {
1314                 char *str = strsep(&trigger_str, ":");
1315                 char *rhs;
1316
1317                 rhs = strchr(str, '=');
1318                 if (rhs) {
1319                         if (!strlen(++rhs)) {
1320                                 ret = -EINVAL;
1321                                 hist_err(tr, HIST_ERR_EMPTY_ASSIGNMENT, errpos(str));
1322                                 goto free;
1323                         }
1324                         ret = parse_assignment(tr, str, attrs);
1325                         if (ret)
1326                                 goto free;
1327                 } else if (strcmp(str, "pause") == 0)
1328                         attrs->pause = true;
1329                 else if ((strcmp(str, "cont") == 0) ||
1330                          (strcmp(str, "continue") == 0))
1331                         attrs->cont = true;
1332                 else if (strcmp(str, "clear") == 0)
1333                         attrs->clear = true;
1334                 else {
1335                         ret = parse_action(str, attrs);
1336                         if (ret)
1337                                 goto free;
1338                 }
1339         }
1340
1341         if (!attrs->keys_str) {
1342                 ret = -EINVAL;
1343                 goto free;
1344         }
1345
1346         if (!attrs->clock) {
1347                 attrs->clock = kstrdup("global", GFP_KERNEL);
1348                 if (!attrs->clock) {
1349                         ret = -ENOMEM;
1350                         goto free;
1351                 }
1352         }
1353
1354         return attrs;
1355  free:
1356         destroy_hist_trigger_attrs(attrs);
1357
1358         return ERR_PTR(ret);
1359 }
1360
1361 static inline void save_comm(char *comm, struct task_struct *task)
1362 {
1363         if (!task->pid) {
1364                 strcpy(comm, "<idle>");
1365                 return;
1366         }
1367
1368         if (WARN_ON_ONCE(task->pid < 0)) {
1369                 strcpy(comm, "<XXX>");
1370                 return;
1371         }
1372
1373         strncpy(comm, task->comm, TASK_COMM_LEN);
1374 }
1375
1376 static void hist_elt_data_free(struct hist_elt_data *elt_data)
1377 {
1378         unsigned int i;
1379
1380         for (i = 0; i < SYNTH_FIELDS_MAX; i++)
1381                 kfree(elt_data->field_var_str[i]);
1382
1383         kfree(elt_data->comm);
1384         kfree(elt_data);
1385 }
1386
1387 static void hist_trigger_elt_data_free(struct tracing_map_elt *elt)
1388 {
1389         struct hist_elt_data *elt_data = elt->private_data;
1390
1391         hist_elt_data_free(elt_data);
1392 }
1393
1394 static int hist_trigger_elt_data_alloc(struct tracing_map_elt *elt)
1395 {
1396         struct hist_trigger_data *hist_data = elt->map->private_data;
1397         unsigned int size = TASK_COMM_LEN;
1398         struct hist_elt_data *elt_data;
1399         struct hist_field *key_field;
1400         unsigned int i, n_str;
1401
1402         elt_data = kzalloc(sizeof(*elt_data), GFP_KERNEL);
1403         if (!elt_data)
1404                 return -ENOMEM;
1405
1406         for_each_hist_key_field(i, hist_data) {
1407                 key_field = hist_data->fields[i];
1408
1409                 if (key_field->flags & HIST_FIELD_FL_EXECNAME) {
1410                         elt_data->comm = kzalloc(size, GFP_KERNEL);
1411                         if (!elt_data->comm) {
1412                                 kfree(elt_data);
1413                                 return -ENOMEM;
1414                         }
1415                         break;
1416                 }
1417         }
1418
1419         n_str = hist_data->n_field_var_str + hist_data->n_save_var_str +
1420                 hist_data->n_var_str;
1421         if (n_str > SYNTH_FIELDS_MAX) {
1422                 hist_elt_data_free(elt_data);
1423                 return -EINVAL;
1424         }
1425
1426         BUILD_BUG_ON(STR_VAR_LEN_MAX & (sizeof(u64) - 1));
1427
1428         size = STR_VAR_LEN_MAX;
1429
1430         for (i = 0; i < n_str; i++) {
1431                 elt_data->field_var_str[i] = kzalloc(size, GFP_KERNEL);
1432                 if (!elt_data->field_var_str[i]) {
1433                         hist_elt_data_free(elt_data);
1434                         return -ENOMEM;
1435                 }
1436         }
1437
1438         elt->private_data = elt_data;
1439
1440         return 0;
1441 }
1442
1443 static void hist_trigger_elt_data_init(struct tracing_map_elt *elt)
1444 {
1445         struct hist_elt_data *elt_data = elt->private_data;
1446
1447         if (elt_data->comm)
1448                 save_comm(elt_data->comm, current);
1449 }
1450
1451 static const struct tracing_map_ops hist_trigger_elt_data_ops = {
1452         .elt_alloc      = hist_trigger_elt_data_alloc,
1453         .elt_free       = hist_trigger_elt_data_free,
1454         .elt_init       = hist_trigger_elt_data_init,
1455 };
1456
1457 static const char *get_hist_field_flags(struct hist_field *hist_field)
1458 {
1459         const char *flags_str = NULL;
1460
1461         if (hist_field->flags & HIST_FIELD_FL_HEX)
1462                 flags_str = "hex";
1463         else if (hist_field->flags & HIST_FIELD_FL_SYM)
1464                 flags_str = "sym";
1465         else if (hist_field->flags & HIST_FIELD_FL_SYM_OFFSET)
1466                 flags_str = "sym-offset";
1467         else if (hist_field->flags & HIST_FIELD_FL_EXECNAME)
1468                 flags_str = "execname";
1469         else if (hist_field->flags & HIST_FIELD_FL_SYSCALL)
1470                 flags_str = "syscall";
1471         else if (hist_field->flags & HIST_FIELD_FL_LOG2)
1472                 flags_str = "log2";
1473         else if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP_USECS)
1474                 flags_str = "usecs";
1475
1476         return flags_str;
1477 }
1478
1479 static void expr_field_str(struct hist_field *field, char *expr)
1480 {
1481         if (field->flags & HIST_FIELD_FL_VAR_REF)
1482                 strcat(expr, "$");
1483
1484         strcat(expr, hist_field_name(field, 0));
1485
1486         if (field->flags && !(field->flags & HIST_FIELD_FL_VAR_REF)) {
1487                 const char *flags_str = get_hist_field_flags(field);
1488
1489                 if (flags_str) {
1490                         strcat(expr, ".");
1491                         strcat(expr, flags_str);
1492                 }
1493         }
1494 }
1495
1496 static char *expr_str(struct hist_field *field, unsigned int level)
1497 {
1498         char *expr;
1499
1500         if (level > 1)
1501                 return NULL;
1502
1503         expr = kzalloc(MAX_FILTER_STR_VAL, GFP_KERNEL);
1504         if (!expr)
1505                 return NULL;
1506
1507         if (!field->operands[0]) {
1508                 expr_field_str(field, expr);
1509                 return expr;
1510         }
1511
1512         if (field->operator == FIELD_OP_UNARY_MINUS) {
1513                 char *subexpr;
1514
1515                 strcat(expr, "-(");
1516                 subexpr = expr_str(field->operands[0], ++level);
1517                 if (!subexpr) {
1518                         kfree(expr);
1519                         return NULL;
1520                 }
1521                 strcat(expr, subexpr);
1522                 strcat(expr, ")");
1523
1524                 kfree(subexpr);
1525
1526                 return expr;
1527         }
1528
1529         expr_field_str(field->operands[0], expr);
1530
1531         switch (field->operator) {
1532         case FIELD_OP_MINUS:
1533                 strcat(expr, "-");
1534                 break;
1535         case FIELD_OP_PLUS:
1536                 strcat(expr, "+");
1537                 break;
1538         default:
1539                 kfree(expr);
1540                 return NULL;
1541         }
1542
1543         expr_field_str(field->operands[1], expr);
1544
1545         return expr;
1546 }
1547
1548 static int contains_operator(char *str)
1549 {
1550         enum field_op_id field_op = FIELD_OP_NONE;
1551         char *op;
1552
1553         op = strpbrk(str, "+-");
1554         if (!op)
1555                 return FIELD_OP_NONE;
1556
1557         switch (*op) {
1558         case '-':
1559                 /*
1560                  * Unfortunately, the modifier ".sym-offset"
1561                  * can confuse things.
1562                  */
1563                 if (op - str >= 4 && !strncmp(op - 4, ".sym-offset", 11))
1564                         return FIELD_OP_NONE;
1565
1566                 if (*str == '-')
1567                         field_op = FIELD_OP_UNARY_MINUS;
1568                 else
1569                         field_op = FIELD_OP_MINUS;
1570                 break;
1571         case '+':
1572                 field_op = FIELD_OP_PLUS;
1573                 break;
1574         default:
1575                 break;
1576         }
1577
1578         return field_op;
1579 }
1580
1581 static void get_hist_field(struct hist_field *hist_field)
1582 {
1583         hist_field->ref++;
1584 }
1585
1586 static void __destroy_hist_field(struct hist_field *hist_field)
1587 {
1588         if (--hist_field->ref > 1)
1589                 return;
1590
1591         kfree(hist_field->var.name);
1592         kfree(hist_field->name);
1593         kfree(hist_field->type);
1594
1595         kfree(hist_field->system);
1596         kfree(hist_field->event_name);
1597
1598         kfree(hist_field);
1599 }
1600
1601 static void destroy_hist_field(struct hist_field *hist_field,
1602                                unsigned int level)
1603 {
1604         unsigned int i;
1605
1606         if (level > 3)
1607                 return;
1608
1609         if (!hist_field)
1610                 return;
1611
1612         if (hist_field->flags & HIST_FIELD_FL_VAR_REF)
1613                 return; /* var refs will be destroyed separately */
1614
1615         for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++)
1616                 destroy_hist_field(hist_field->operands[i], level + 1);
1617
1618         __destroy_hist_field(hist_field);
1619 }
1620
1621 static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
1622                                             struct ftrace_event_field *field,
1623                                             unsigned long flags,
1624                                             char *var_name)
1625 {
1626         struct hist_field *hist_field;
1627
1628         if (field && is_function_field(field))
1629                 return NULL;
1630
1631         hist_field = kzalloc(sizeof(struct hist_field), GFP_KERNEL);
1632         if (!hist_field)
1633                 return NULL;
1634
1635         hist_field->ref = 1;
1636
1637         hist_field->hist_data = hist_data;
1638
1639         if (flags & HIST_FIELD_FL_EXPR || flags & HIST_FIELD_FL_ALIAS)
1640                 goto out; /* caller will populate */
1641
1642         if (flags & HIST_FIELD_FL_VAR_REF) {
1643                 hist_field->fn = hist_field_var_ref;
1644                 goto out;
1645         }
1646
1647         if (flags & HIST_FIELD_FL_HITCOUNT) {
1648                 hist_field->fn = hist_field_counter;
1649                 hist_field->size = sizeof(u64);
1650                 hist_field->type = kstrdup("u64", GFP_KERNEL);
1651                 if (!hist_field->type)
1652                         goto free;
1653                 goto out;
1654         }
1655
1656         if (flags & HIST_FIELD_FL_STACKTRACE) {
1657                 hist_field->fn = hist_field_none;
1658                 goto out;
1659         }
1660
1661         if (flags & HIST_FIELD_FL_LOG2) {
1662                 unsigned long fl = flags & ~HIST_FIELD_FL_LOG2;
1663                 hist_field->fn = hist_field_log2;
1664                 hist_field->operands[0] = create_hist_field(hist_data, field, fl, NULL);
1665                 hist_field->size = hist_field->operands[0]->size;
1666                 hist_field->type = kstrdup(hist_field->operands[0]->type, GFP_KERNEL);
1667                 if (!hist_field->type)
1668                         goto free;
1669                 goto out;
1670         }
1671
1672         if (flags & HIST_FIELD_FL_TIMESTAMP) {
1673                 hist_field->fn = hist_field_timestamp;
1674                 hist_field->size = sizeof(u64);
1675                 hist_field->type = kstrdup("u64", GFP_KERNEL);
1676                 if (!hist_field->type)
1677                         goto free;
1678                 goto out;
1679         }
1680
1681         if (flags & HIST_FIELD_FL_CPU) {
1682                 hist_field->fn = hist_field_cpu;
1683                 hist_field->size = sizeof(int);
1684                 hist_field->type = kstrdup("unsigned int", GFP_KERNEL);
1685                 if (!hist_field->type)
1686                         goto free;
1687                 goto out;
1688         }
1689
1690         if (WARN_ON_ONCE(!field))
1691                 goto out;
1692
1693         /* Pointers to strings are just pointers and dangerous to dereference */
1694         if (is_string_field(field) &&
1695             (field->filter_type != FILTER_PTR_STRING)) {
1696                 flags |= HIST_FIELD_FL_STRING;
1697
1698                 hist_field->size = MAX_FILTER_STR_VAL;
1699                 hist_field->type = kstrdup(field->type, GFP_KERNEL);
1700                 if (!hist_field->type)
1701                         goto free;
1702
1703                 if (field->filter_type == FILTER_STATIC_STRING)
1704                         hist_field->fn = hist_field_string;
1705                 else if (field->filter_type == FILTER_DYN_STRING)
1706                         hist_field->fn = hist_field_dynstring;
1707                 else
1708                         hist_field->fn = hist_field_pstring;
1709         } else {
1710                 hist_field->size = field->size;
1711                 hist_field->is_signed = field->is_signed;
1712                 hist_field->type = kstrdup(field->type, GFP_KERNEL);
1713                 if (!hist_field->type)
1714                         goto free;
1715
1716                 hist_field->fn = select_value_fn(field->size,
1717                                                  field->is_signed);
1718                 if (!hist_field->fn) {
1719                         destroy_hist_field(hist_field, 0);
1720                         return NULL;
1721                 }
1722         }
1723  out:
1724         hist_field->field = field;
1725         hist_field->flags = flags;
1726
1727         if (var_name) {
1728                 hist_field->var.name = kstrdup(var_name, GFP_KERNEL);
1729                 if (!hist_field->var.name)
1730                         goto free;
1731         }
1732
1733         return hist_field;
1734  free:
1735         destroy_hist_field(hist_field, 0);
1736         return NULL;
1737 }
1738
1739 static void destroy_hist_fields(struct hist_trigger_data *hist_data)
1740 {
1741         unsigned int i;
1742
1743         for (i = 0; i < HIST_FIELDS_MAX; i++) {
1744                 if (hist_data->fields[i]) {
1745                         destroy_hist_field(hist_data->fields[i], 0);
1746                         hist_data->fields[i] = NULL;
1747                 }
1748         }
1749
1750         for (i = 0; i < hist_data->n_var_refs; i++) {
1751                 WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF));
1752                 __destroy_hist_field(hist_data->var_refs[i]);
1753                 hist_data->var_refs[i] = NULL;
1754         }
1755 }
1756
1757 static int init_var_ref(struct hist_field *ref_field,
1758                         struct hist_field *var_field,
1759                         char *system, char *event_name)
1760 {
1761         int err = 0;
1762
1763         ref_field->var.idx = var_field->var.idx;
1764         ref_field->var.hist_data = var_field->hist_data;
1765         ref_field->size = var_field->size;
1766         ref_field->is_signed = var_field->is_signed;
1767         ref_field->flags |= var_field->flags &
1768                 (HIST_FIELD_FL_TIMESTAMP | HIST_FIELD_FL_TIMESTAMP_USECS);
1769
1770         if (system) {
1771                 ref_field->system = kstrdup(system, GFP_KERNEL);
1772                 if (!ref_field->system)
1773                         return -ENOMEM;
1774         }
1775
1776         if (event_name) {
1777                 ref_field->event_name = kstrdup(event_name, GFP_KERNEL);
1778                 if (!ref_field->event_name) {
1779                         err = -ENOMEM;
1780                         goto free;
1781                 }
1782         }
1783
1784         if (var_field->var.name) {
1785                 ref_field->name = kstrdup(var_field->var.name, GFP_KERNEL);
1786                 if (!ref_field->name) {
1787                         err = -ENOMEM;
1788                         goto free;
1789                 }
1790         } else if (var_field->name) {
1791                 ref_field->name = kstrdup(var_field->name, GFP_KERNEL);
1792                 if (!ref_field->name) {
1793                         err = -ENOMEM;
1794                         goto free;
1795                 }
1796         }
1797
1798         ref_field->type = kstrdup(var_field->type, GFP_KERNEL);
1799         if (!ref_field->type) {
1800                 err = -ENOMEM;
1801                 goto free;
1802         }
1803  out:
1804         return err;
1805  free:
1806         kfree(ref_field->system);
1807         kfree(ref_field->event_name);
1808         kfree(ref_field->name);
1809
1810         goto out;
1811 }
1812
1813 static int find_var_ref_idx(struct hist_trigger_data *hist_data,
1814                             struct hist_field *var_field)
1815 {
1816         struct hist_field *ref_field;
1817         int i;
1818
1819         for (i = 0; i < hist_data->n_var_refs; i++) {
1820                 ref_field = hist_data->var_refs[i];
1821                 if (ref_field->var.idx == var_field->var.idx &&
1822                     ref_field->var.hist_data == var_field->hist_data)
1823                         return i;
1824         }
1825
1826         return -ENOENT;
1827 }
1828
1829 /**
1830  * create_var_ref - Create a variable reference and attach it to trigger
1831  * @hist_data: The trigger that will be referencing the variable
1832  * @var_field: The VAR field to create a reference to
1833  * @system: The optional system string
1834  * @event_name: The optional event_name string
1835  *
1836  * Given a variable hist_field, create a VAR_REF hist_field that
1837  * represents a reference to it.
1838  *
1839  * This function also adds the reference to the trigger that
1840  * now references the variable.
1841  *
1842  * Return: The VAR_REF field if successful, NULL if not
1843  */
1844 static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data,
1845                                          struct hist_field *var_field,
1846                                          char *system, char *event_name)
1847 {
1848         unsigned long flags = HIST_FIELD_FL_VAR_REF;
1849         struct hist_field *ref_field;
1850         int i;
1851
1852         /* Check if the variable already exists */
1853         for (i = 0; i < hist_data->n_var_refs; i++) {
1854                 ref_field = hist_data->var_refs[i];
1855                 if (ref_field->var.idx == var_field->var.idx &&
1856                     ref_field->var.hist_data == var_field->hist_data) {
1857                         get_hist_field(ref_field);
1858                         return ref_field;
1859                 }
1860         }
1861
1862         ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL);
1863         if (ref_field) {
1864                 if (init_var_ref(ref_field, var_field, system, event_name)) {
1865                         destroy_hist_field(ref_field, 0);
1866                         return NULL;
1867                 }
1868
1869                 hist_data->var_refs[hist_data->n_var_refs] = ref_field;
1870                 ref_field->var_ref_idx = hist_data->n_var_refs++;
1871         }
1872
1873         return ref_field;
1874 }
1875
1876 static bool is_var_ref(char *var_name)
1877 {
1878         if (!var_name || strlen(var_name) < 2 || var_name[0] != '$')
1879                 return false;
1880
1881         return true;
1882 }
1883
1884 static char *field_name_from_var(struct hist_trigger_data *hist_data,
1885                                  char *var_name)
1886 {
1887         char *name, *field;
1888         unsigned int i;
1889
1890         for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) {
1891                 name = hist_data->attrs->var_defs.name[i];
1892
1893                 if (strcmp(var_name, name) == 0) {
1894                         field = hist_data->attrs->var_defs.expr[i];
1895                         if (contains_operator(field) || is_var_ref(field))
1896                                 continue;
1897                         return field;
1898                 }
1899         }
1900
1901         return NULL;
1902 }
1903
1904 static char *local_field_var_ref(struct hist_trigger_data *hist_data,
1905                                  char *system, char *event_name,
1906                                  char *var_name)
1907 {
1908         struct trace_event_call *call;
1909
1910         if (system && event_name) {
1911                 call = hist_data->event_file->event_call;
1912
1913                 if (strcmp(system, call->class->system) != 0)
1914                         return NULL;
1915
1916                 if (strcmp(event_name, trace_event_name(call)) != 0)
1917                         return NULL;
1918         }
1919
1920         if (!!system != !!event_name)
1921                 return NULL;
1922
1923         if (!is_var_ref(var_name))
1924                 return NULL;
1925
1926         var_name++;
1927
1928         return field_name_from_var(hist_data, var_name);
1929 }
1930
1931 static struct hist_field *parse_var_ref(struct hist_trigger_data *hist_data,
1932                                         char *system, char *event_name,
1933                                         char *var_name)
1934 {
1935         struct hist_field *var_field = NULL, *ref_field = NULL;
1936         struct trace_array *tr = hist_data->event_file->tr;
1937
1938         if (!is_var_ref(var_name))
1939                 return NULL;
1940
1941         var_name++;
1942
1943         var_field = find_event_var(hist_data, system, event_name, var_name);
1944         if (var_field)
1945                 ref_field = create_var_ref(hist_data, var_field,
1946                                            system, event_name);
1947
1948         if (!ref_field)
1949                 hist_err(tr, HIST_ERR_VAR_NOT_FOUND, errpos(var_name));
1950
1951         return ref_field;
1952 }
1953
1954 static struct ftrace_event_field *
1955 parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
1956             char *field_str, unsigned long *flags)
1957 {
1958         struct ftrace_event_field *field = NULL;
1959         char *field_name, *modifier, *str;
1960         struct trace_array *tr = file->tr;
1961
1962         modifier = str = kstrdup(field_str, GFP_KERNEL);
1963         if (!modifier)
1964                 return ERR_PTR(-ENOMEM);
1965
1966         field_name = strsep(&modifier, ".");
1967         if (modifier) {
1968                 if (strcmp(modifier, "hex") == 0)
1969                         *flags |= HIST_FIELD_FL_HEX;
1970                 else if (strcmp(modifier, "sym") == 0)
1971                         *flags |= HIST_FIELD_FL_SYM;
1972                 else if (strcmp(modifier, "sym-offset") == 0)
1973                         *flags |= HIST_FIELD_FL_SYM_OFFSET;
1974                 else if ((strcmp(modifier, "execname") == 0) &&
1975                          (strcmp(field_name, "common_pid") == 0))
1976                         *flags |= HIST_FIELD_FL_EXECNAME;
1977                 else if (strcmp(modifier, "syscall") == 0)
1978                         *flags |= HIST_FIELD_FL_SYSCALL;
1979                 else if (strcmp(modifier, "log2") == 0)
1980                         *flags |= HIST_FIELD_FL_LOG2;
1981                 else if (strcmp(modifier, "usecs") == 0)
1982                         *flags |= HIST_FIELD_FL_TIMESTAMP_USECS;
1983                 else {
1984                         hist_err(tr, HIST_ERR_BAD_FIELD_MODIFIER, errpos(modifier));
1985                         field = ERR_PTR(-EINVAL);
1986                         goto out;
1987                 }
1988         }
1989
1990         if (strcmp(field_name, "common_timestamp") == 0) {
1991                 *flags |= HIST_FIELD_FL_TIMESTAMP;
1992                 hist_data->enable_timestamps = true;
1993                 if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
1994                         hist_data->attrs->ts_in_usecs = true;
1995         } else if (strcmp(field_name, "common_cpu") == 0)
1996                 *flags |= HIST_FIELD_FL_CPU;
1997         else {
1998                 field = trace_find_event_field(file->event_call, field_name);
1999                 if (!field || !field->size) {
2000                         /*
2001                          * For backward compatibility, if field_name
2002                          * was "cpu", then we treat this the same as
2003                          * common_cpu.
2004                          */
2005                         if (strcmp(field_name, "cpu") == 0) {
2006                                 *flags |= HIST_FIELD_FL_CPU;
2007                         } else {
2008                                 hist_err(tr, HIST_ERR_FIELD_NOT_FOUND,
2009                                          errpos(field_name));
2010                                 field = ERR_PTR(-EINVAL);
2011                                 goto out;
2012                         }
2013                 }
2014         }
2015  out:
2016         kfree(str);
2017
2018         return field;
2019 }
2020
2021 static struct hist_field *create_alias(struct hist_trigger_data *hist_data,
2022                                        struct hist_field *var_ref,
2023                                        char *var_name)
2024 {
2025         struct hist_field *alias = NULL;
2026         unsigned long flags = HIST_FIELD_FL_ALIAS | HIST_FIELD_FL_VAR;
2027
2028         alias = create_hist_field(hist_data, NULL, flags, var_name);
2029         if (!alias)
2030                 return NULL;
2031
2032         alias->fn = var_ref->fn;
2033         alias->operands[0] = var_ref;
2034
2035         if (init_var_ref(alias, var_ref, var_ref->system, var_ref->event_name)) {
2036                 destroy_hist_field(alias, 0);
2037                 return NULL;
2038         }
2039
2040         alias->var_ref_idx = var_ref->var_ref_idx;
2041
2042         return alias;
2043 }
2044
2045 static struct hist_field *parse_atom(struct hist_trigger_data *hist_data,
2046                                      struct trace_event_file *file, char *str,
2047                                      unsigned long *flags, char *var_name)
2048 {
2049         char *s, *ref_system = NULL, *ref_event = NULL, *ref_var = str;
2050         struct ftrace_event_field *field = NULL;
2051         struct hist_field *hist_field = NULL;
2052         int ret = 0;
2053
2054         s = strchr(str, '.');
2055         if (s) {
2056                 s = strchr(++s, '.');
2057                 if (s) {
2058                         ref_system = strsep(&str, ".");
2059                         if (!str) {
2060                                 ret = -EINVAL;
2061                                 goto out;
2062                         }
2063                         ref_event = strsep(&str, ".");
2064                         if (!str) {
2065                                 ret = -EINVAL;
2066                                 goto out;
2067                         }
2068                         ref_var = str;
2069                 }
2070         }
2071
2072         s = local_field_var_ref(hist_data, ref_system, ref_event, ref_var);
2073         if (!s) {
2074                 hist_field = parse_var_ref(hist_data, ref_system,
2075                                            ref_event, ref_var);
2076                 if (hist_field) {
2077                         if (var_name) {
2078                                 hist_field = create_alias(hist_data, hist_field, var_name);
2079                                 if (!hist_field) {
2080                                         ret = -ENOMEM;
2081                                         goto out;
2082                                 }
2083                         }
2084                         return hist_field;
2085                 }
2086         } else
2087                 str = s;
2088
2089         field = parse_field(hist_data, file, str, flags);
2090         if (IS_ERR(field)) {
2091                 ret = PTR_ERR(field);
2092                 goto out;
2093         }
2094
2095         hist_field = create_hist_field(hist_data, field, *flags, var_name);
2096         if (!hist_field) {
2097                 ret = -ENOMEM;
2098                 goto out;
2099         }
2100
2101         return hist_field;
2102  out:
2103         return ERR_PTR(ret);
2104 }
2105
2106 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2107                                      struct trace_event_file *file,
2108                                      char *str, unsigned long flags,
2109                                      char *var_name, unsigned int level);
2110
2111 static struct hist_field *parse_unary(struct hist_trigger_data *hist_data,
2112                                       struct trace_event_file *file,
2113                                       char *str, unsigned long flags,
2114                                       char *var_name, unsigned int level)
2115 {
2116         struct hist_field *operand1, *expr = NULL;
2117         unsigned long operand_flags;
2118         int ret = 0;
2119         char *s;
2120
2121         /* we support only -(xxx) i.e. explicit parens required */
2122
2123         if (level > 3) {
2124                 hist_err(file->tr, HIST_ERR_TOO_MANY_SUBEXPR, errpos(str));
2125                 ret = -EINVAL;
2126                 goto free;
2127         }
2128
2129         str++; /* skip leading '-' */
2130
2131         s = strchr(str, '(');
2132         if (s)
2133                 str++;
2134         else {
2135                 ret = -EINVAL;
2136                 goto free;
2137         }
2138
2139         s = strrchr(str, ')');
2140         if (s)
2141                 *s = '\0';
2142         else {
2143                 ret = -EINVAL; /* no closing ')' */
2144                 goto free;
2145         }
2146
2147         flags |= HIST_FIELD_FL_EXPR;
2148         expr = create_hist_field(hist_data, NULL, flags, var_name);
2149         if (!expr) {
2150                 ret = -ENOMEM;
2151                 goto free;
2152         }
2153
2154         operand_flags = 0;
2155         operand1 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level);
2156         if (IS_ERR(operand1)) {
2157                 ret = PTR_ERR(operand1);
2158                 goto free;
2159         }
2160         if (operand1->flags & HIST_FIELD_FL_STRING) {
2161                 /* String type can not be the operand of unary operator. */
2162                 hist_err(file->tr, HIST_ERR_INVALID_STR_OPERAND, errpos(str));
2163                 destroy_hist_field(operand1, 0);
2164                 ret = -EINVAL;
2165                 goto free;
2166         }
2167
2168         expr->flags |= operand1->flags &
2169                 (HIST_FIELD_FL_TIMESTAMP | HIST_FIELD_FL_TIMESTAMP_USECS);
2170         expr->fn = hist_field_unary_minus;
2171         expr->operands[0] = operand1;
2172         expr->operator = FIELD_OP_UNARY_MINUS;
2173         expr->name = expr_str(expr, 0);
2174         expr->type = kstrdup(operand1->type, GFP_KERNEL);
2175         if (!expr->type) {
2176                 ret = -ENOMEM;
2177                 goto free;
2178         }
2179
2180         return expr;
2181  free:
2182         destroy_hist_field(expr, 0);
2183         return ERR_PTR(ret);
2184 }
2185
2186 static int check_expr_operands(struct trace_array *tr,
2187                                struct hist_field *operand1,
2188                                struct hist_field *operand2)
2189 {
2190         unsigned long operand1_flags = operand1->flags;
2191         unsigned long operand2_flags = operand2->flags;
2192
2193         if ((operand1_flags & HIST_FIELD_FL_VAR_REF) ||
2194             (operand1_flags & HIST_FIELD_FL_ALIAS)) {
2195                 struct hist_field *var;
2196
2197                 var = find_var_field(operand1->var.hist_data, operand1->name);
2198                 if (!var)
2199                         return -EINVAL;
2200                 operand1_flags = var->flags;
2201         }
2202
2203         if ((operand2_flags & HIST_FIELD_FL_VAR_REF) ||
2204             (operand2_flags & HIST_FIELD_FL_ALIAS)) {
2205                 struct hist_field *var;
2206
2207                 var = find_var_field(operand2->var.hist_data, operand2->name);
2208                 if (!var)
2209                         return -EINVAL;
2210                 operand2_flags = var->flags;
2211         }
2212
2213         if ((operand1_flags & HIST_FIELD_FL_TIMESTAMP_USECS) !=
2214             (operand2_flags & HIST_FIELD_FL_TIMESTAMP_USECS)) {
2215                 hist_err(tr, HIST_ERR_TIMESTAMP_MISMATCH, 0);
2216                 return -EINVAL;
2217         }
2218
2219         return 0;
2220 }
2221
2222 static struct hist_field *parse_expr(struct hist_trigger_data *hist_data,
2223                                      struct trace_event_file *file,
2224                                      char *str, unsigned long flags,
2225                                      char *var_name, unsigned int level)
2226 {
2227         struct hist_field *operand1 = NULL, *operand2 = NULL, *expr = NULL;
2228         unsigned long operand_flags;
2229         int field_op, ret = -EINVAL;
2230         char *sep, *operand1_str;
2231
2232         if (level > 3) {
2233                 hist_err(file->tr, HIST_ERR_TOO_MANY_SUBEXPR, errpos(str));
2234                 return ERR_PTR(-EINVAL);
2235         }
2236
2237         field_op = contains_operator(str);
2238
2239         if (field_op == FIELD_OP_NONE)
2240                 return parse_atom(hist_data, file, str, &flags, var_name);
2241
2242         if (field_op == FIELD_OP_UNARY_MINUS)
2243                 return parse_unary(hist_data, file, str, flags, var_name, ++level);
2244
2245         switch (field_op) {
2246         case FIELD_OP_MINUS:
2247                 sep = "-";
2248                 break;
2249         case FIELD_OP_PLUS:
2250                 sep = "+";
2251                 break;
2252         default:
2253                 goto free;
2254         }
2255
2256         operand1_str = strsep(&str, sep);
2257         if (!operand1_str || !str)
2258                 goto free;
2259
2260         operand_flags = 0;
2261         operand1 = parse_atom(hist_data, file, operand1_str,
2262                               &operand_flags, NULL);
2263         if (IS_ERR(operand1)) {
2264                 ret = PTR_ERR(operand1);
2265                 operand1 = NULL;
2266                 goto free;
2267         }
2268         if (operand1->flags & HIST_FIELD_FL_STRING) {
2269                 hist_err(file->tr, HIST_ERR_INVALID_STR_OPERAND, errpos(operand1_str));
2270                 ret = -EINVAL;
2271                 goto free;
2272         }
2273
2274         /* rest of string could be another expression e.g. b+c in a+b+c */
2275         operand_flags = 0;
2276         operand2 = parse_expr(hist_data, file, str, operand_flags, NULL, ++level);
2277         if (IS_ERR(operand2)) {
2278                 ret = PTR_ERR(operand2);
2279                 operand2 = NULL;
2280                 goto free;
2281         }
2282         if (operand2->flags & HIST_FIELD_FL_STRING) {
2283                 hist_err(file->tr, HIST_ERR_INVALID_STR_OPERAND, errpos(str));
2284                 ret = -EINVAL;
2285                 goto free;
2286         }
2287
2288         ret = check_expr_operands(file->tr, operand1, operand2);
2289         if (ret)
2290                 goto free;
2291
2292         flags |= HIST_FIELD_FL_EXPR;
2293
2294         flags |= operand1->flags &
2295                 (HIST_FIELD_FL_TIMESTAMP | HIST_FIELD_FL_TIMESTAMP_USECS);
2296
2297         expr = create_hist_field(hist_data, NULL, flags, var_name);
2298         if (!expr) {
2299                 ret = -ENOMEM;
2300                 goto free;
2301         }
2302
2303         operand1->read_once = true;
2304         operand2->read_once = true;
2305
2306         expr->operands[0] = operand1;
2307         expr->operands[1] = operand2;
2308
2309         /* The operand sizes should be the same, so just pick one */
2310         expr->size = operand1->size;
2311
2312         expr->operator = field_op;
2313         expr->name = expr_str(expr, 0);
2314         expr->type = kstrdup(operand1->type, GFP_KERNEL);
2315         if (!expr->type) {
2316                 ret = -ENOMEM;
2317                 goto free;
2318         }
2319
2320         switch (field_op) {
2321         case FIELD_OP_MINUS:
2322                 expr->fn = hist_field_minus;
2323                 break;
2324         case FIELD_OP_PLUS:
2325                 expr->fn = hist_field_plus;
2326                 break;
2327         default:
2328                 ret = -EINVAL;
2329                 goto free;
2330         }
2331
2332         return expr;
2333  free:
2334         destroy_hist_field(operand1, 0);
2335         destroy_hist_field(operand2, 0);
2336         destroy_hist_field(expr, 0);
2337
2338         return ERR_PTR(ret);
2339 }
2340
2341 static char *find_trigger_filter(struct hist_trigger_data *hist_data,
2342                                  struct trace_event_file *file)
2343 {
2344         struct event_trigger_data *test;
2345
2346         lockdep_assert_held(&event_mutex);
2347
2348         list_for_each_entry(test, &file->triggers, list) {
2349                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
2350                         if (test->private_data == hist_data)
2351                                 return test->filter_str;
2352                 }
2353         }
2354
2355         return NULL;
2356 }
2357
2358 static struct event_command trigger_hist_cmd;
2359 static int event_hist_trigger_func(struct event_command *cmd_ops,
2360                                    struct trace_event_file *file,
2361                                    char *glob, char *cmd, char *param);
2362
2363 static bool compatible_keys(struct hist_trigger_data *target_hist_data,
2364                             struct hist_trigger_data *hist_data,
2365                             unsigned int n_keys)
2366 {
2367         struct hist_field *target_hist_field, *hist_field;
2368         unsigned int n, i, j;
2369
2370         if (hist_data->n_fields - hist_data->n_vals != n_keys)
2371                 return false;
2372
2373         i = hist_data->n_vals;
2374         j = target_hist_data->n_vals;
2375
2376         for (n = 0; n < n_keys; n++) {
2377                 hist_field = hist_data->fields[i + n];
2378                 target_hist_field = target_hist_data->fields[j + n];
2379
2380                 if (strcmp(hist_field->type, target_hist_field->type) != 0)
2381                         return false;
2382                 if (hist_field->size != target_hist_field->size)
2383                         return false;
2384                 if (hist_field->is_signed != target_hist_field->is_signed)
2385                         return false;
2386         }
2387
2388         return true;
2389 }
2390
2391 static struct hist_trigger_data *
2392 find_compatible_hist(struct hist_trigger_data *target_hist_data,
2393                      struct trace_event_file *file)
2394 {
2395         struct hist_trigger_data *hist_data;
2396         struct event_trigger_data *test;
2397         unsigned int n_keys;
2398
2399         lockdep_assert_held(&event_mutex);
2400
2401         n_keys = target_hist_data->n_fields - target_hist_data->n_vals;
2402
2403         list_for_each_entry(test, &file->triggers, list) {
2404                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
2405                         hist_data = test->private_data;
2406
2407                         if (compatible_keys(target_hist_data, hist_data, n_keys))
2408                                 return hist_data;
2409                 }
2410         }
2411
2412         return NULL;
2413 }
2414
2415 static struct trace_event_file *event_file(struct trace_array *tr,
2416                                            char *system, char *event_name)
2417 {
2418         struct trace_event_file *file;
2419
2420         file = __find_event_file(tr, system, event_name);
2421         if (!file)
2422                 return ERR_PTR(-EINVAL);
2423
2424         return file;
2425 }
2426
2427 static struct hist_field *
2428 find_synthetic_field_var(struct hist_trigger_data *target_hist_data,
2429                          char *system, char *event_name, char *field_name)
2430 {
2431         struct hist_field *event_var;
2432         char *synthetic_name;
2433
2434         synthetic_name = kzalloc(MAX_FILTER_STR_VAL, GFP_KERNEL);
2435         if (!synthetic_name)
2436                 return ERR_PTR(-ENOMEM);
2437
2438         strcpy(synthetic_name, "synthetic_");
2439         strcat(synthetic_name, field_name);
2440
2441         event_var = find_event_var(target_hist_data, system, event_name, synthetic_name);
2442
2443         kfree(synthetic_name);
2444
2445         return event_var;
2446 }
2447
2448 /**
2449  * create_field_var_hist - Automatically create a histogram and var for a field
2450  * @target_hist_data: The target hist trigger
2451  * @subsys_name: Optional subsystem name
2452  * @event_name: Optional event name
2453  * @field_name: The name of the field (and the resulting variable)
2454  *
2455  * Hist trigger actions fetch data from variables, not directly from
2456  * events.  However, for convenience, users are allowed to directly
2457  * specify an event field in an action, which will be automatically
2458  * converted into a variable on their behalf.
2459
2460  * If a user specifies a field on an event that isn't the event the
2461  * histogram currently being defined (the target event histogram), the
2462  * only way that can be accomplished is if a new hist trigger is
2463  * created and the field variable defined on that.
2464  *
2465  * This function creates a new histogram compatible with the target
2466  * event (meaning a histogram with the same key as the target
2467  * histogram), and creates a variable for the specified field, but
2468  * with 'synthetic_' prepended to the variable name in order to avoid
2469  * collision with normal field variables.
2470  *
2471  * Return: The variable created for the field.
2472  */
2473 static struct hist_field *
2474 create_field_var_hist(struct hist_trigger_data *target_hist_data,
2475                       char *subsys_name, char *event_name, char *field_name)
2476 {
2477         struct trace_array *tr = target_hist_data->event_file->tr;
2478         struct hist_trigger_data *hist_data;
2479         unsigned int i, n, first = true;
2480         struct field_var_hist *var_hist;
2481         struct trace_event_file *file;
2482         struct hist_field *key_field;
2483         struct hist_field *event_var;
2484         char *saved_filter;
2485         char *cmd;
2486         int ret;
2487
2488         if (target_hist_data->n_field_var_hists >= SYNTH_FIELDS_MAX) {
2489                 hist_err(tr, HIST_ERR_TOO_MANY_FIELD_VARS, errpos(field_name));
2490                 return ERR_PTR(-EINVAL);
2491         }
2492
2493         file = event_file(tr, subsys_name, event_name);
2494
2495         if (IS_ERR(file)) {
2496                 hist_err(tr, HIST_ERR_EVENT_FILE_NOT_FOUND, errpos(field_name));
2497                 ret = PTR_ERR(file);
2498                 return ERR_PTR(ret);
2499         }
2500
2501         /*
2502          * Look for a histogram compatible with target.  We'll use the
2503          * found histogram specification to create a new matching
2504          * histogram with our variable on it.  target_hist_data is not
2505          * yet a registered histogram so we can't use that.
2506          */
2507         hist_data = find_compatible_hist(target_hist_data, file);
2508         if (!hist_data) {
2509                 hist_err(tr, HIST_ERR_HIST_NOT_FOUND, errpos(field_name));
2510                 return ERR_PTR(-EINVAL);
2511         }
2512
2513         /* See if a synthetic field variable has already been created */
2514         event_var = find_synthetic_field_var(target_hist_data, subsys_name,
2515                                              event_name, field_name);
2516         if (!IS_ERR_OR_NULL(event_var))
2517                 return event_var;
2518
2519         var_hist = kzalloc(sizeof(*var_hist), GFP_KERNEL);
2520         if (!var_hist)
2521                 return ERR_PTR(-ENOMEM);
2522
2523         cmd = kzalloc(MAX_FILTER_STR_VAL, GFP_KERNEL);
2524         if (!cmd) {
2525                 kfree(var_hist);
2526                 return ERR_PTR(-ENOMEM);
2527         }
2528
2529         /* Use the same keys as the compatible histogram */
2530         strcat(cmd, "keys=");
2531
2532         for_each_hist_key_field(i, hist_data) {
2533                 key_field = hist_data->fields[i];
2534                 if (!first)
2535                         strcat(cmd, ",");
2536                 strcat(cmd, key_field->field->name);
2537                 first = false;
2538         }
2539
2540         /* Create the synthetic field variable specification */
2541         strcat(cmd, ":synthetic_");
2542         strcat(cmd, field_name);
2543         strcat(cmd, "=");
2544         strcat(cmd, field_name);
2545
2546         /* Use the same filter as the compatible histogram */
2547         saved_filter = find_trigger_filter(hist_data, file);
2548         if (saved_filter) {
2549                 strcat(cmd, " if ");
2550                 strcat(cmd, saved_filter);
2551         }
2552
2553         var_hist->cmd = kstrdup(cmd, GFP_KERNEL);
2554         if (!var_hist->cmd) {
2555                 kfree(cmd);
2556                 kfree(var_hist);
2557                 return ERR_PTR(-ENOMEM);
2558         }
2559
2560         /* Save the compatible histogram information */
2561         var_hist->hist_data = hist_data;
2562
2563         /* Create the new histogram with our variable */
2564         ret = event_hist_trigger_func(&trigger_hist_cmd, file,
2565                                       "", "hist", cmd);
2566         if (ret) {
2567                 kfree(cmd);
2568                 kfree(var_hist->cmd);
2569                 kfree(var_hist);
2570                 hist_err(tr, HIST_ERR_HIST_CREATE_FAIL, errpos(field_name));
2571                 return ERR_PTR(ret);
2572         }
2573
2574         kfree(cmd);
2575
2576         /* If we can't find the variable, something went wrong */
2577         event_var = find_synthetic_field_var(target_hist_data, subsys_name,
2578                                              event_name, field_name);
2579         if (IS_ERR_OR_NULL(event_var)) {
2580                 kfree(var_hist->cmd);
2581                 kfree(var_hist);
2582                 hist_err(tr, HIST_ERR_SYNTH_VAR_NOT_FOUND, errpos(field_name));
2583                 return ERR_PTR(-EINVAL);
2584         }
2585
2586         n = target_hist_data->n_field_var_hists;
2587         target_hist_data->field_var_hists[n] = var_hist;
2588         target_hist_data->n_field_var_hists++;
2589
2590         return event_var;
2591 }
2592
2593 static struct hist_field *
2594 find_target_event_var(struct hist_trigger_data *hist_data,
2595                       char *subsys_name, char *event_name, char *var_name)
2596 {
2597         struct trace_event_file *file = hist_data->event_file;
2598         struct hist_field *hist_field = NULL;
2599
2600         if (subsys_name) {
2601                 struct trace_event_call *call;
2602
2603                 if (!event_name)
2604                         return NULL;
2605
2606                 call = file->event_call;
2607
2608                 if (strcmp(subsys_name, call->class->system) != 0)
2609                         return NULL;
2610
2611                 if (strcmp(event_name, trace_event_name(call)) != 0)
2612                         return NULL;
2613         }
2614
2615         hist_field = find_var_field(hist_data, var_name);
2616
2617         return hist_field;
2618 }
2619
2620 static inline void __update_field_vars(struct tracing_map_elt *elt,
2621                                        struct trace_buffer *buffer,
2622                                        struct ring_buffer_event *rbe,
2623                                        void *rec,
2624                                        struct field_var **field_vars,
2625                                        unsigned int n_field_vars,
2626                                        unsigned int field_var_str_start)
2627 {
2628         struct hist_elt_data *elt_data = elt->private_data;
2629         unsigned int i, j, var_idx;
2630         u64 var_val;
2631
2632         for (i = 0, j = field_var_str_start; i < n_field_vars; i++) {
2633                 struct field_var *field_var = field_vars[i];
2634                 struct hist_field *var = field_var->var;
2635                 struct hist_field *val = field_var->val;
2636
2637                 var_val = val->fn(val, elt, buffer, rbe, rec);
2638                 var_idx = var->var.idx;
2639
2640                 if (val->flags & HIST_FIELD_FL_STRING) {
2641                         char *str = elt_data->field_var_str[j++];
2642                         char *val_str = (char *)(uintptr_t)var_val;
2643
2644                         strscpy(str, val_str, STR_VAR_LEN_MAX);
2645                         var_val = (u64)(uintptr_t)str;
2646                 }
2647                 tracing_map_set_var(elt, var_idx, var_val);
2648         }
2649 }
2650
2651 static void update_field_vars(struct hist_trigger_data *hist_data,
2652                               struct tracing_map_elt *elt,
2653                               struct trace_buffer *buffer,
2654                               struct ring_buffer_event *rbe,
2655                               void *rec)
2656 {
2657         __update_field_vars(elt, buffer, rbe, rec, hist_data->field_vars,
2658                             hist_data->n_field_vars, 0);
2659 }
2660
2661 static void save_track_data_vars(struct hist_trigger_data *hist_data,
2662                                  struct tracing_map_elt *elt,
2663                                  struct trace_buffer *buffer,  void *rec,
2664                                  struct ring_buffer_event *rbe, void *key,
2665                                  struct action_data *data, u64 *var_ref_vals)
2666 {
2667         __update_field_vars(elt, buffer, rbe, rec, hist_data->save_vars,
2668                             hist_data->n_save_vars, hist_data->n_field_var_str);
2669 }
2670
2671 static struct hist_field *create_var(struct hist_trigger_data *hist_data,
2672                                      struct trace_event_file *file,
2673                                      char *name, int size, const char *type)
2674 {
2675         struct hist_field *var;
2676         int idx;
2677
2678         if (find_var(hist_data, file, name) && !hist_data->remove) {
2679                 var = ERR_PTR(-EINVAL);
2680                 goto out;
2681         }
2682
2683         var = kzalloc(sizeof(struct hist_field), GFP_KERNEL);
2684         if (!var) {
2685                 var = ERR_PTR(-ENOMEM);
2686                 goto out;
2687         }
2688
2689         idx = tracing_map_add_var(hist_data->map);
2690         if (idx < 0) {
2691                 kfree(var);
2692                 var = ERR_PTR(-EINVAL);
2693                 goto out;
2694         }
2695
2696         var->ref = 1;
2697         var->flags = HIST_FIELD_FL_VAR;
2698         var->var.idx = idx;
2699         var->var.hist_data = var->hist_data = hist_data;
2700         var->size = size;
2701         var->var.name = kstrdup(name, GFP_KERNEL);
2702         var->type = kstrdup(type, GFP_KERNEL);
2703         if (!var->var.name || !var->type) {
2704                 kfree(var->var.name);
2705                 kfree(var->type);
2706                 kfree(var);
2707                 var = ERR_PTR(-ENOMEM);
2708         }
2709  out:
2710         return var;
2711 }
2712
2713 static struct field_var *create_field_var(struct hist_trigger_data *hist_data,
2714                                           struct trace_event_file *file,
2715                                           char *field_name)
2716 {
2717         struct hist_field *val = NULL, *var = NULL;
2718         unsigned long flags = HIST_FIELD_FL_VAR;
2719         struct trace_array *tr = file->tr;
2720         struct field_var *field_var;
2721         int ret = 0;
2722
2723         if (hist_data->n_field_vars >= SYNTH_FIELDS_MAX) {
2724                 hist_err(tr, HIST_ERR_TOO_MANY_FIELD_VARS, errpos(field_name));
2725                 ret = -EINVAL;
2726                 goto err;
2727         }
2728
2729         val = parse_atom(hist_data, file, field_name, &flags, NULL);
2730         if (IS_ERR(val)) {
2731                 hist_err(tr, HIST_ERR_FIELD_VAR_PARSE_FAIL, errpos(field_name));
2732                 ret = PTR_ERR(val);
2733                 goto err;
2734         }
2735
2736         var = create_var(hist_data, file, field_name, val->size, val->type);
2737         if (IS_ERR(var)) {
2738                 hist_err(tr, HIST_ERR_VAR_CREATE_FIND_FAIL, errpos(field_name));
2739                 kfree(val);
2740                 ret = PTR_ERR(var);
2741                 goto err;
2742         }
2743
2744         field_var = kzalloc(sizeof(struct field_var), GFP_KERNEL);
2745         if (!field_var) {
2746                 kfree(val);
2747                 kfree(var);
2748                 ret =  -ENOMEM;
2749                 goto err;
2750         }
2751
2752         field_var->var = var;
2753         field_var->val = val;
2754  out:
2755         return field_var;
2756  err:
2757         field_var = ERR_PTR(ret);
2758         goto out;
2759 }
2760
2761 /**
2762  * create_target_field_var - Automatically create a variable for a field
2763  * @target_hist_data: The target hist trigger
2764  * @subsys_name: Optional subsystem name
2765  * @event_name: Optional event name
2766  * @var_name: The name of the field (and the resulting variable)
2767  *
2768  * Hist trigger actions fetch data from variables, not directly from
2769  * events.  However, for convenience, users are allowed to directly
2770  * specify an event field in an action, which will be automatically
2771  * converted into a variable on their behalf.
2772
2773  * This function creates a field variable with the name var_name on
2774  * the hist trigger currently being defined on the target event.  If
2775  * subsys_name and event_name are specified, this function simply
2776  * verifies that they do in fact match the target event subsystem and
2777  * event name.
2778  *
2779  * Return: The variable created for the field.
2780  */
2781 static struct field_var *
2782 create_target_field_var(struct hist_trigger_data *target_hist_data,
2783                         char *subsys_name, char *event_name, char *var_name)
2784 {
2785         struct trace_event_file *file = target_hist_data->event_file;
2786
2787         if (subsys_name) {
2788                 struct trace_event_call *call;
2789
2790                 if (!event_name)
2791                         return NULL;
2792
2793                 call = file->event_call;
2794
2795                 if (strcmp(subsys_name, call->class->system) != 0)
2796                         return NULL;
2797
2798                 if (strcmp(event_name, trace_event_name(call)) != 0)
2799                         return NULL;
2800         }
2801
2802         return create_field_var(target_hist_data, file, var_name);
2803 }
2804
2805 static bool check_track_val_max(u64 track_val, u64 var_val)
2806 {
2807         if (var_val <= track_val)
2808                 return false;
2809
2810         return true;
2811 }
2812
2813 static bool check_track_val_changed(u64 track_val, u64 var_val)
2814 {
2815         if (var_val == track_val)
2816                 return false;
2817
2818         return true;
2819 }
2820
2821 static u64 get_track_val(struct hist_trigger_data *hist_data,
2822                          struct tracing_map_elt *elt,
2823                          struct action_data *data)
2824 {
2825         unsigned int track_var_idx = data->track_data.track_var->var.idx;
2826         u64 track_val;
2827
2828         track_val = tracing_map_read_var(elt, track_var_idx);
2829
2830         return track_val;
2831 }
2832
2833 static void save_track_val(struct hist_trigger_data *hist_data,
2834                            struct tracing_map_elt *elt,
2835                            struct action_data *data, u64 var_val)
2836 {
2837         unsigned int track_var_idx = data->track_data.track_var->var.idx;
2838
2839         tracing_map_set_var(elt, track_var_idx, var_val);
2840 }
2841
2842 static void save_track_data(struct hist_trigger_data *hist_data,
2843                             struct tracing_map_elt *elt,
2844                             struct trace_buffer *buffer, void *rec,
2845                             struct ring_buffer_event *rbe, void *key,
2846                             struct action_data *data, u64 *var_ref_vals)
2847 {
2848         if (data->track_data.save_data)
2849                 data->track_data.save_data(hist_data, elt, buffer, rec, rbe,
2850                                            key, data, var_ref_vals);
2851 }
2852
2853 static bool check_track_val(struct tracing_map_elt *elt,
2854                             struct action_data *data,
2855                             u64 var_val)
2856 {
2857         struct hist_trigger_data *hist_data;
2858         u64 track_val;
2859
2860         hist_data = data->track_data.track_var->hist_data;
2861         track_val = get_track_val(hist_data, elt, data);
2862
2863         return data->track_data.check_val(track_val, var_val);
2864 }
2865
2866 #ifdef CONFIG_TRACER_SNAPSHOT
2867 static bool cond_snapshot_update(struct trace_array *tr, void *cond_data)
2868 {
2869         /* called with tr->max_lock held */
2870         struct track_data *track_data = tr->cond_snapshot->cond_data;
2871         struct hist_elt_data *elt_data, *track_elt_data;
2872         struct snapshot_context *context = cond_data;
2873         struct action_data *action;
2874         u64 track_val;
2875
2876         if (!track_data)
2877                 return false;
2878
2879         action = track_data->action_data;
2880
2881         track_val = get_track_val(track_data->hist_data, context->elt,
2882                                   track_data->action_data);
2883
2884         if (!action->track_data.check_val(track_data->track_val, track_val))
2885                 return false;
2886
2887         track_data->track_val = track_val;
2888         memcpy(track_data->key, context->key, track_data->key_len);
2889
2890         elt_data = context->elt->private_data;
2891         track_elt_data = track_data->elt.private_data;
2892         if (elt_data->comm)
2893                 strncpy(track_elt_data->comm, elt_data->comm, TASK_COMM_LEN);
2894
2895         track_data->updated = true;
2896
2897         return true;
2898 }
2899
2900 static void save_track_data_snapshot(struct hist_trigger_data *hist_data,
2901                                      struct tracing_map_elt *elt,
2902                                      struct trace_buffer *buffer, void *rec,
2903                                      struct ring_buffer_event *rbe, void *key,
2904                                      struct action_data *data,
2905                                      u64 *var_ref_vals)
2906 {
2907         struct trace_event_file *file = hist_data->event_file;
2908         struct snapshot_context context;
2909
2910         context.elt = elt;
2911         context.key = key;
2912
2913         tracing_snapshot_cond(file->tr, &context);
2914 }
2915
2916 static void hist_trigger_print_key(struct seq_file *m,
2917                                    struct hist_trigger_data *hist_data,
2918                                    void *key,
2919                                    struct tracing_map_elt *elt);
2920
2921 static struct action_data *snapshot_action(struct hist_trigger_data *hist_data)
2922 {
2923         unsigned int i;
2924
2925         if (!hist_data->n_actions)
2926                 return NULL;
2927
2928         for (i = 0; i < hist_data->n_actions; i++) {
2929                 struct action_data *data = hist_data->actions[i];
2930
2931                 if (data->action == ACTION_SNAPSHOT)
2932                         return data;
2933         }
2934
2935         return NULL;
2936 }
2937
2938 static void track_data_snapshot_print(struct seq_file *m,
2939                                       struct hist_trigger_data *hist_data)
2940 {
2941         struct trace_event_file *file = hist_data->event_file;
2942         struct track_data *track_data;
2943         struct action_data *action;
2944
2945         track_data = tracing_cond_snapshot_data(file->tr);
2946         if (!track_data)
2947                 return;
2948
2949         if (!track_data->updated)
2950                 return;
2951
2952         action = snapshot_action(hist_data);
2953         if (!action)
2954                 return;
2955
2956         seq_puts(m, "\nSnapshot taken (see tracing/snapshot).  Details:\n");
2957         seq_printf(m, "\ttriggering value { %s(%s) }: %10llu",
2958                    action->handler == HANDLER_ONMAX ? "onmax" : "onchange",
2959                    action->track_data.var_str, track_data->track_val);
2960
2961         seq_puts(m, "\ttriggered by event with key: ");
2962         hist_trigger_print_key(m, hist_data, track_data->key, &track_data->elt);
2963         seq_putc(m, '\n');
2964 }
2965 #else
2966 static bool cond_snapshot_update(struct trace_array *tr, void *cond_data)
2967 {
2968         return false;
2969 }
2970 static void save_track_data_snapshot(struct hist_trigger_data *hist_data,
2971                                      struct tracing_map_elt *elt,
2972                                      struct trace_buffer *buffer, void *rec,
2973                                      struct ring_buffer_event *rbe, void *key,
2974                                      struct action_data *data,
2975                                      u64 *var_ref_vals) {}
2976 static void track_data_snapshot_print(struct seq_file *m,
2977                                       struct hist_trigger_data *hist_data) {}
2978 #endif /* CONFIG_TRACER_SNAPSHOT */
2979
2980 static void track_data_print(struct seq_file *m,
2981                              struct hist_trigger_data *hist_data,
2982                              struct tracing_map_elt *elt,
2983                              struct action_data *data)
2984 {
2985         u64 track_val = get_track_val(hist_data, elt, data);
2986         unsigned int i, save_var_idx;
2987
2988         if (data->handler == HANDLER_ONMAX)
2989                 seq_printf(m, "\n\tmax: %10llu", track_val);
2990         else if (data->handler == HANDLER_ONCHANGE)
2991                 seq_printf(m, "\n\tchanged: %10llu", track_val);
2992
2993         if (data->action == ACTION_SNAPSHOT)
2994                 return;
2995
2996         for (i = 0; i < hist_data->n_save_vars; i++) {
2997                 struct hist_field *save_val = hist_data->save_vars[i]->val;
2998                 struct hist_field *save_var = hist_data->save_vars[i]->var;
2999                 u64 val;
3000
3001                 save_var_idx = save_var->var.idx;
3002
3003                 val = tracing_map_read_var(elt, save_var_idx);
3004
3005                 if (save_val->flags & HIST_FIELD_FL_STRING) {
3006                         seq_printf(m, "  %s: %-32s", save_var->var.name,
3007                                    (char *)(uintptr_t)(val));
3008                 } else
3009                         seq_printf(m, "  %s: %10llu", save_var->var.name, val);
3010         }
3011 }
3012
3013 static void ontrack_action(struct hist_trigger_data *hist_data,
3014                            struct tracing_map_elt *elt,
3015                            struct trace_buffer *buffer, void *rec,
3016                            struct ring_buffer_event *rbe, void *key,
3017                            struct action_data *data, u64 *var_ref_vals)
3018 {
3019         u64 var_val = var_ref_vals[data->track_data.var_ref->var_ref_idx];
3020
3021         if (check_track_val(elt, data, var_val)) {
3022                 save_track_val(hist_data, elt, data, var_val);
3023                 save_track_data(hist_data, elt, buffer, rec, rbe,
3024                                 key, data, var_ref_vals);
3025         }
3026 }
3027
3028 static void action_data_destroy(struct action_data *data)
3029 {
3030         unsigned int i;
3031
3032         lockdep_assert_held(&event_mutex);
3033
3034         kfree(data->action_name);
3035
3036         for (i = 0; i < data->n_params; i++)
3037                 kfree(data->params[i]);
3038
3039         if (data->synth_event)
3040                 data->synth_event->ref--;
3041
3042         kfree(data->synth_event_name);
3043
3044         kfree(data);
3045 }
3046
3047 static void track_data_destroy(struct hist_trigger_data *hist_data,
3048                                struct action_data *data)
3049 {
3050         struct trace_event_file *file = hist_data->event_file;
3051
3052         destroy_hist_field(data->track_data.track_var, 0);
3053
3054         if (data->action == ACTION_SNAPSHOT) {
3055                 struct track_data *track_data;
3056
3057                 track_data = tracing_cond_snapshot_data(file->tr);
3058                 if (track_data && track_data->hist_data == hist_data) {
3059                         tracing_snapshot_cond_disable(file->tr);
3060                         track_data_free(track_data);
3061                 }
3062         }
3063
3064         kfree(data->track_data.var_str);
3065
3066         action_data_destroy(data);
3067 }
3068
3069 static int action_create(struct hist_trigger_data *hist_data,
3070                          struct action_data *data);
3071
3072 static int track_data_create(struct hist_trigger_data *hist_data,
3073                              struct action_data *data)
3074 {
3075         struct hist_field *var_field, *ref_field, *track_var = NULL;
3076         struct trace_event_file *file = hist_data->event_file;
3077         struct trace_array *tr = file->tr;
3078         char *track_data_var_str;
3079         int ret = 0;
3080
3081         track_data_var_str = data->track_data.var_str;
3082         if (track_data_var_str[0] != '$') {
3083                 hist_err(tr, HIST_ERR_ONX_NOT_VAR, errpos(track_data_var_str));
3084                 return -EINVAL;
3085         }
3086         track_data_var_str++;
3087
3088         var_field = find_target_event_var(hist_data, NULL, NULL, track_data_var_str);
3089         if (!var_field) {
3090                 hist_err(tr, HIST_ERR_ONX_VAR_NOT_FOUND, errpos(track_data_var_str));
3091                 return -EINVAL;
3092         }
3093
3094         ref_field = create_var_ref(hist_data, var_field, NULL, NULL);
3095         if (!ref_field)
3096                 return -ENOMEM;
3097
3098         data->track_data.var_ref = ref_field;
3099
3100         if (data->handler == HANDLER_ONMAX)
3101                 track_var = create_var(hist_data, file, "__max", sizeof(u64), "u64");
3102         if (IS_ERR(track_var)) {
3103                 hist_err(tr, HIST_ERR_ONX_VAR_CREATE_FAIL, 0);
3104                 ret = PTR_ERR(track_var);
3105                 goto out;
3106         }
3107
3108         if (data->handler == HANDLER_ONCHANGE)
3109                 track_var = create_var(hist_data, file, "__change", sizeof(u64), "u64");
3110         if (IS_ERR(track_var)) {
3111                 hist_err(tr, HIST_ERR_ONX_VAR_CREATE_FAIL, 0);
3112                 ret = PTR_ERR(track_var);
3113                 goto out;
3114         }
3115         data->track_data.track_var = track_var;
3116
3117         ret = action_create(hist_data, data);
3118  out:
3119         return ret;
3120 }
3121
3122 static int parse_action_params(struct trace_array *tr, char *params,
3123                                struct action_data *data)
3124 {
3125         char *param, *saved_param;
3126         bool first_param = true;
3127         int ret = 0;
3128
3129         while (params) {
3130                 if (data->n_params >= SYNTH_FIELDS_MAX) {
3131                         hist_err(tr, HIST_ERR_TOO_MANY_PARAMS, 0);
3132                         goto out;
3133                 }
3134
3135                 param = strsep(&params, ",");
3136                 if (!param) {
3137                         hist_err(tr, HIST_ERR_PARAM_NOT_FOUND, 0);
3138                         ret = -EINVAL;
3139                         goto out;
3140                 }
3141
3142                 param = strstrip(param);
3143                 if (strlen(param) < 2) {
3144                         hist_err(tr, HIST_ERR_INVALID_PARAM, errpos(param));
3145                         ret = -EINVAL;
3146                         goto out;
3147                 }
3148
3149                 saved_param = kstrdup(param, GFP_KERNEL);
3150                 if (!saved_param) {
3151                         ret = -ENOMEM;
3152                         goto out;
3153                 }
3154
3155                 if (first_param && data->use_trace_keyword) {
3156                         data->synth_event_name = saved_param;
3157                         first_param = false;
3158                         continue;
3159                 }
3160                 first_param = false;
3161
3162                 data->params[data->n_params++] = saved_param;
3163         }
3164  out:
3165         return ret;
3166 }
3167
3168 static int action_parse(struct trace_array *tr, char *str, struct action_data *data,
3169                         enum handler_id handler)
3170 {
3171         char *action_name;
3172         int ret = 0;
3173
3174         strsep(&str, ".");
3175         if (!str) {
3176                 hist_err(tr, HIST_ERR_ACTION_NOT_FOUND, 0);
3177                 ret = -EINVAL;
3178                 goto out;
3179         }
3180
3181         action_name = strsep(&str, "(");
3182         if (!action_name || !str) {
3183                 hist_err(tr, HIST_ERR_ACTION_NOT_FOUND, 0);
3184                 ret = -EINVAL;
3185                 goto out;
3186         }
3187
3188         if (str_has_prefix(action_name, "save")) {
3189                 char *params = strsep(&str, ")");
3190
3191                 if (!params) {
3192                         hist_err(tr, HIST_ERR_NO_SAVE_PARAMS, 0);
3193                         ret = -EINVAL;
3194                         goto out;
3195                 }
3196
3197                 ret = parse_action_params(tr, params, data);
3198                 if (ret)
3199                         goto out;
3200
3201                 if (handler == HANDLER_ONMAX)
3202                         data->track_data.check_val = check_track_val_max;
3203                 else if (handler == HANDLER_ONCHANGE)
3204                         data->track_data.check_val = check_track_val_changed;
3205                 else {
3206                         hist_err(tr, HIST_ERR_ACTION_MISMATCH, errpos(action_name));
3207                         ret = -EINVAL;
3208                         goto out;
3209                 }
3210
3211                 data->track_data.save_data = save_track_data_vars;
3212                 data->fn = ontrack_action;
3213                 data->action = ACTION_SAVE;
3214         } else if (str_has_prefix(action_name, "snapshot")) {
3215                 char *params = strsep(&str, ")");
3216
3217                 if (!str) {
3218                         hist_err(tr, HIST_ERR_NO_CLOSING_PAREN, errpos(params));
3219                         ret = -EINVAL;
3220                         goto out;
3221                 }
3222
3223                 if (handler == HANDLER_ONMAX)
3224                         data->track_data.check_val = check_track_val_max;
3225                 else if (handler == HANDLER_ONCHANGE)
3226                         data->track_data.check_val = check_track_val_changed;
3227                 else {
3228                         hist_err(tr, HIST_ERR_ACTION_MISMATCH, errpos(action_name));
3229                         ret = -EINVAL;
3230                         goto out;
3231                 }
3232
3233                 data->track_data.save_data = save_track_data_snapshot;
3234                 data->fn = ontrack_action;
3235                 data->action = ACTION_SNAPSHOT;
3236         } else {
3237                 char *params = strsep(&str, ")");
3238
3239                 if (str_has_prefix(action_name, "trace"))
3240                         data->use_trace_keyword = true;
3241
3242                 if (params) {
3243                         ret = parse_action_params(tr, params, data);
3244                         if (ret)
3245                                 goto out;
3246                 }
3247
3248                 if (handler == HANDLER_ONMAX)
3249                         data->track_data.check_val = check_track_val_max;
3250                 else if (handler == HANDLER_ONCHANGE)
3251                         data->track_data.check_val = check_track_val_changed;
3252
3253                 if (handler != HANDLER_ONMATCH) {
3254                         data->track_data.save_data = action_trace;
3255                         data->fn = ontrack_action;
3256                 } else
3257                         data->fn = action_trace;
3258
3259                 data->action = ACTION_TRACE;
3260         }
3261
3262         data->action_name = kstrdup(action_name, GFP_KERNEL);
3263         if (!data->action_name) {
3264                 ret = -ENOMEM;
3265                 goto out;
3266         }
3267
3268         data->handler = handler;
3269  out:
3270         return ret;
3271 }
3272
3273 static struct action_data *track_data_parse(struct hist_trigger_data *hist_data,
3274                                             char *str, enum handler_id handler)
3275 {
3276         struct action_data *data;
3277         int ret = -EINVAL;
3278         char *var_str;
3279
3280         data = kzalloc(sizeof(*data), GFP_KERNEL);
3281         if (!data)
3282                 return ERR_PTR(-ENOMEM);
3283
3284         var_str = strsep(&str, ")");
3285         if (!var_str || !str) {
3286                 ret = -EINVAL;
3287                 goto free;
3288         }
3289
3290         data->track_data.var_str = kstrdup(var_str, GFP_KERNEL);
3291         if (!data->track_data.var_str) {
3292                 ret = -ENOMEM;
3293                 goto free;
3294         }
3295
3296         ret = action_parse(hist_data->event_file->tr, str, data, handler);
3297         if (ret)
3298                 goto free;
3299  out:
3300         return data;
3301  free:
3302         track_data_destroy(hist_data, data);
3303         data = ERR_PTR(ret);
3304         goto out;
3305 }
3306
3307 static void onmatch_destroy(struct action_data *data)
3308 {
3309         kfree(data->match_data.event);
3310         kfree(data->match_data.event_system);
3311
3312         action_data_destroy(data);
3313 }
3314
3315 static void destroy_field_var(struct field_var *field_var)
3316 {
3317         if (!field_var)
3318                 return;
3319
3320         destroy_hist_field(field_var->var, 0);
3321         destroy_hist_field(field_var->val, 0);
3322
3323         kfree(field_var);
3324 }
3325
3326 static void destroy_field_vars(struct hist_trigger_data *hist_data)
3327 {
3328         unsigned int i;
3329
3330         for (i = 0; i < hist_data->n_field_vars; i++)
3331                 destroy_field_var(hist_data->field_vars[i]);
3332
3333         for (i = 0; i < hist_data->n_save_vars; i++)
3334                 destroy_field_var(hist_data->save_vars[i]);
3335 }
3336
3337 static void save_field_var(struct hist_trigger_data *hist_data,
3338                            struct field_var *field_var)
3339 {
3340         hist_data->field_vars[hist_data->n_field_vars++] = field_var;
3341
3342         if (field_var->val->flags & HIST_FIELD_FL_STRING)
3343                 hist_data->n_field_var_str++;
3344 }
3345
3346
3347 static int check_synth_field(struct synth_event *event,
3348                              struct hist_field *hist_field,
3349                              unsigned int field_pos)
3350 {
3351         struct synth_field *field;
3352
3353         if (field_pos >= event->n_fields)
3354                 return -EINVAL;
3355
3356         field = event->fields[field_pos];
3357
3358         /*
3359          * A dynamic string synth field can accept static or
3360          * dynamic. A static string synth field can only accept a
3361          * same-sized static string, which is checked for later.
3362          */
3363         if (strstr(hist_field->type, "char[") && field->is_string
3364             && field->is_dynamic)
3365                 return 0;
3366
3367         if (strcmp(field->type, hist_field->type) != 0) {
3368                 if (field->size != hist_field->size ||
3369                     field->is_signed != hist_field->is_signed)
3370                         return -EINVAL;
3371         }
3372
3373         return 0;
3374 }
3375
3376 static struct hist_field *
3377 trace_action_find_var(struct hist_trigger_data *hist_data,
3378                       struct action_data *data,
3379                       char *system, char *event, char *var)
3380 {
3381         struct trace_array *tr = hist_data->event_file->tr;
3382         struct hist_field *hist_field;
3383
3384         var++; /* skip '$' */
3385
3386         hist_field = find_target_event_var(hist_data, system, event, var);
3387         if (!hist_field) {
3388                 if (!system && data->handler == HANDLER_ONMATCH) {
3389                         system = data->match_data.event_system;
3390                         event = data->match_data.event;
3391                 }
3392
3393                 hist_field = find_event_var(hist_data, system, event, var);
3394         }
3395
3396         if (!hist_field)
3397                 hist_err(tr, HIST_ERR_PARAM_NOT_FOUND, errpos(var));
3398
3399         return hist_field;
3400 }
3401
3402 static struct hist_field *
3403 trace_action_create_field_var(struct hist_trigger_data *hist_data,
3404                               struct action_data *data, char *system,
3405                               char *event, char *var)
3406 {
3407         struct hist_field *hist_field = NULL;
3408         struct field_var *field_var;
3409
3410         /*
3411          * First try to create a field var on the target event (the
3412          * currently being defined).  This will create a variable for
3413          * unqualified fields on the target event, or if qualified,
3414          * target fields that have qualified names matching the target.
3415          */
3416         field_var = create_target_field_var(hist_data, system, event, var);
3417
3418         if (field_var && !IS_ERR(field_var)) {
3419                 save_field_var(hist_data, field_var);
3420                 hist_field = field_var->var;
3421         } else {
3422                 field_var = NULL;
3423                 /*
3424                  * If no explicit system.event is specified, default to
3425                  * looking for fields on the onmatch(system.event.xxx)
3426                  * event.
3427                  */
3428                 if (!system && data->handler == HANDLER_ONMATCH) {
3429                         system = data->match_data.event_system;
3430                         event = data->match_data.event;
3431                 }
3432
3433                 /*
3434                  * At this point, we're looking at a field on another
3435                  * event.  Because we can't modify a hist trigger on
3436                  * another event to add a variable for a field, we need
3437                  * to create a new trigger on that event and create the
3438                  * variable at the same time.
3439                  */
3440                 hist_field = create_field_var_hist(hist_data, system, event, var);
3441                 if (IS_ERR(hist_field))
3442                         goto free;
3443         }
3444  out:
3445         return hist_field;
3446  free:
3447         destroy_field_var(field_var);
3448         hist_field = NULL;
3449         goto out;
3450 }
3451
3452 static int trace_action_create(struct hist_trigger_data *hist_data,
3453                                struct action_data *data)
3454 {
3455         struct trace_array *tr = hist_data->event_file->tr;
3456         char *event_name, *param, *system = NULL;
3457         struct hist_field *hist_field, *var_ref;
3458         unsigned int i;
3459         unsigned int field_pos = 0;
3460         struct synth_event *event;
3461         char *synth_event_name;
3462         int var_ref_idx, ret = 0;
3463
3464         lockdep_assert_held(&event_mutex);
3465
3466         if (data->use_trace_keyword)
3467                 synth_event_name = data->synth_event_name;
3468         else
3469                 synth_event_name = data->action_name;
3470
3471         event = find_synth_event(synth_event_name);
3472         if (!event) {
3473                 hist_err(tr, HIST_ERR_SYNTH_EVENT_NOT_FOUND, errpos(synth_event_name));
3474                 return -EINVAL;
3475         }
3476
3477         event->ref++;
3478
3479         for (i = 0; i < data->n_params; i++) {
3480                 char *p;
3481
3482                 p = param = kstrdup(data->params[i], GFP_KERNEL);
3483                 if (!param) {
3484                         ret = -ENOMEM;
3485                         goto err;
3486                 }
3487
3488                 system = strsep(&param, ".");
3489                 if (!param) {
3490                         param = (char *)system;
3491                         system = event_name = NULL;
3492                 } else {
3493                         event_name = strsep(&param, ".");
3494                         if (!param) {
3495                                 kfree(p);
3496                                 ret = -EINVAL;
3497                                 goto err;
3498                         }
3499                 }
3500
3501                 if (param[0] == '$')
3502                         hist_field = trace_action_find_var(hist_data, data,
3503                                                            system, event_name,
3504                                                            param);
3505                 else
3506                         hist_field = trace_action_create_field_var(hist_data,
3507                                                                    data,
3508                                                                    system,
3509                                                                    event_name,
3510                                                                    param);
3511
3512                 if (!hist_field) {
3513                         kfree(p);
3514                         ret = -EINVAL;
3515                         goto err;
3516                 }
3517
3518                 if (check_synth_field(event, hist_field, field_pos) == 0) {
3519                         var_ref = create_var_ref(hist_data, hist_field,
3520                                                  system, event_name);
3521                         if (!var_ref) {
3522                                 kfree(p);
3523                                 ret = -ENOMEM;
3524                                 goto err;
3525                         }
3526
3527                         var_ref_idx = find_var_ref_idx(hist_data, var_ref);
3528                         if (WARN_ON(var_ref_idx < 0)) {
3529                                 ret = var_ref_idx;
3530                                 goto err;
3531                         }
3532
3533                         data->var_ref_idx[i] = var_ref_idx;
3534
3535                         field_pos++;
3536                         kfree(p);
3537                         continue;
3538                 }
3539
3540                 hist_err(tr, HIST_ERR_SYNTH_TYPE_MISMATCH, errpos(param));
3541                 kfree(p);
3542                 ret = -EINVAL;
3543                 goto err;
3544         }
3545
3546         if (field_pos != event->n_fields) {
3547                 hist_err(tr, HIST_ERR_SYNTH_COUNT_MISMATCH, errpos(event->name));
3548                 ret = -EINVAL;
3549                 goto err;
3550         }
3551
3552         data->synth_event = event;
3553  out:
3554         return ret;
3555  err:
3556         event->ref--;
3557
3558         goto out;
3559 }
3560
3561 static int action_create(struct hist_trigger_data *hist_data,
3562                          struct action_data *data)
3563 {
3564         struct trace_event_file *file = hist_data->event_file;
3565         struct trace_array *tr = file->tr;
3566         struct track_data *track_data;
3567         struct field_var *field_var;
3568         unsigned int i;
3569         char *param;
3570         int ret = 0;
3571
3572         if (data->action == ACTION_TRACE)
3573                 return trace_action_create(hist_data, data);
3574
3575         if (data->action == ACTION_SNAPSHOT) {
3576                 track_data = track_data_alloc(hist_data->key_size, data, hist_data);
3577                 if (IS_ERR(track_data)) {
3578                         ret = PTR_ERR(track_data);
3579                         goto out;
3580                 }
3581
3582                 ret = tracing_snapshot_cond_enable(file->tr, track_data,
3583                                                    cond_snapshot_update);
3584                 if (ret)
3585                         track_data_free(track_data);
3586
3587                 goto out;
3588         }
3589
3590         if (data->action == ACTION_SAVE) {
3591                 if (hist_data->n_save_vars) {
3592                         ret = -EEXIST;
3593                         hist_err(tr, HIST_ERR_TOO_MANY_SAVE_ACTIONS, 0);
3594                         goto out;
3595                 }
3596
3597                 for (i = 0; i < data->n_params; i++) {
3598                         param = kstrdup(data->params[i], GFP_KERNEL);
3599                         if (!param) {
3600                                 ret = -ENOMEM;
3601                                 goto out;
3602                         }
3603
3604                         field_var = create_target_field_var(hist_data, NULL, NULL, param);
3605                         if (IS_ERR(field_var)) {
3606                                 hist_err(tr, HIST_ERR_FIELD_VAR_CREATE_FAIL,
3607                                          errpos(param));
3608                                 ret = PTR_ERR(field_var);
3609                                 kfree(param);
3610                                 goto out;
3611                         }
3612
3613                         hist_data->save_vars[hist_data->n_save_vars++] = field_var;
3614                         if (field_var->val->flags & HIST_FIELD_FL_STRING)
3615                                 hist_data->n_save_var_str++;
3616                         kfree(param);
3617                 }
3618         }
3619  out:
3620         return ret;
3621 }
3622
3623 static int onmatch_create(struct hist_trigger_data *hist_data,
3624                           struct action_data *data)
3625 {
3626         return action_create(hist_data, data);
3627 }
3628
3629 static struct action_data *onmatch_parse(struct trace_array *tr, char *str)
3630 {
3631         char *match_event, *match_event_system;
3632         struct action_data *data;
3633         int ret = -EINVAL;
3634
3635         data = kzalloc(sizeof(*data), GFP_KERNEL);
3636         if (!data)
3637                 return ERR_PTR(-ENOMEM);
3638
3639         match_event = strsep(&str, ")");
3640         if (!match_event || !str) {
3641                 hist_err(tr, HIST_ERR_NO_CLOSING_PAREN, errpos(match_event));
3642                 goto free;
3643         }
3644
3645         match_event_system = strsep(&match_event, ".");
3646         if (!match_event) {
3647                 hist_err(tr, HIST_ERR_SUBSYS_NOT_FOUND, errpos(match_event_system));
3648                 goto free;
3649         }
3650
3651         if (IS_ERR(event_file(tr, match_event_system, match_event))) {
3652                 hist_err(tr, HIST_ERR_INVALID_SUBSYS_EVENT, errpos(match_event));
3653                 goto free;
3654         }
3655
3656         data->match_data.event = kstrdup(match_event, GFP_KERNEL);
3657         if (!data->match_data.event) {
3658                 ret = -ENOMEM;
3659                 goto free;
3660         }
3661
3662         data->match_data.event_system = kstrdup(match_event_system, GFP_KERNEL);
3663         if (!data->match_data.event_system) {
3664                 ret = -ENOMEM;
3665                 goto free;
3666         }
3667
3668         ret = action_parse(tr, str, data, HANDLER_ONMATCH);
3669         if (ret)
3670                 goto free;
3671  out:
3672         return data;
3673  free:
3674         onmatch_destroy(data);
3675         data = ERR_PTR(ret);
3676         goto out;
3677 }
3678
3679 static int create_hitcount_val(struct hist_trigger_data *hist_data)
3680 {
3681         hist_data->fields[HITCOUNT_IDX] =
3682                 create_hist_field(hist_data, NULL, HIST_FIELD_FL_HITCOUNT, NULL);
3683         if (!hist_data->fields[HITCOUNT_IDX])
3684                 return -ENOMEM;
3685
3686         hist_data->n_vals++;
3687         hist_data->n_fields++;
3688
3689         if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX))
3690                 return -EINVAL;
3691
3692         return 0;
3693 }
3694
3695 static int __create_val_field(struct hist_trigger_data *hist_data,
3696                               unsigned int val_idx,
3697                               struct trace_event_file *file,
3698                               char *var_name, char *field_str,
3699                               unsigned long flags)
3700 {
3701         struct hist_field *hist_field;
3702         int ret = 0;
3703
3704         hist_field = parse_expr(hist_data, file, field_str, flags, var_name, 0);
3705         if (IS_ERR(hist_field)) {
3706                 ret = PTR_ERR(hist_field);
3707                 goto out;
3708         }
3709
3710         hist_data->fields[val_idx] = hist_field;
3711
3712         ++hist_data->n_vals;
3713         ++hist_data->n_fields;
3714
3715         if (WARN_ON(hist_data->n_vals > TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
3716                 ret = -EINVAL;
3717  out:
3718         return ret;
3719 }
3720
3721 static int create_val_field(struct hist_trigger_data *hist_data,
3722                             unsigned int val_idx,
3723                             struct trace_event_file *file,
3724                             char *field_str)
3725 {
3726         if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX))
3727                 return -EINVAL;
3728
3729         return __create_val_field(hist_data, val_idx, file, NULL, field_str, 0);
3730 }
3731
3732 static int create_var_field(struct hist_trigger_data *hist_data,
3733                             unsigned int val_idx,
3734                             struct trace_event_file *file,
3735                             char *var_name, char *expr_str)
3736 {
3737         struct trace_array *tr = hist_data->event_file->tr;
3738         unsigned long flags = 0;
3739         int ret;
3740
3741         if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
3742                 return -EINVAL;
3743
3744         if (find_var(hist_data, file, var_name) && !hist_data->remove) {
3745                 hist_err(tr, HIST_ERR_DUPLICATE_VAR, errpos(var_name));
3746                 return -EINVAL;
3747         }
3748
3749         flags |= HIST_FIELD_FL_VAR;
3750         hist_data->n_vars++;
3751         if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX))
3752                 return -EINVAL;
3753
3754         ret = __create_val_field(hist_data, val_idx, file, var_name, expr_str, flags);
3755
3756         if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_STRING)
3757                 hist_data->fields[val_idx]->var_str_idx = hist_data->n_var_str++;
3758
3759         return ret;
3760 }
3761
3762 static int create_val_fields(struct hist_trigger_data *hist_data,
3763                              struct trace_event_file *file)
3764 {
3765         char *fields_str, *field_str;
3766         unsigned int i, j = 1;
3767         int ret;
3768
3769         ret = create_hitcount_val(hist_data);
3770         if (ret)
3771                 goto out;
3772
3773         fields_str = hist_data->attrs->vals_str;
3774         if (!fields_str)
3775                 goto out;
3776
3777         for (i = 0, j = 1; i < TRACING_MAP_VALS_MAX &&
3778                      j < TRACING_MAP_VALS_MAX; i++) {
3779                 field_str = strsep(&fields_str, ",");
3780                 if (!field_str)
3781                         break;
3782
3783                 if (strcmp(field_str, "hitcount") == 0)
3784                         continue;
3785
3786                 ret = create_val_field(hist_data, j++, file, field_str);
3787                 if (ret)
3788                         goto out;
3789         }
3790
3791         if (fields_str && (strcmp(fields_str, "hitcount") != 0))
3792                 ret = -EINVAL;
3793  out:
3794         return ret;
3795 }
3796
3797 static int create_key_field(struct hist_trigger_data *hist_data,
3798                             unsigned int key_idx,
3799                             unsigned int key_offset,
3800                             struct trace_event_file *file,
3801                             char *field_str)
3802 {
3803         struct trace_array *tr = hist_data->event_file->tr;
3804         struct hist_field *hist_field = NULL;
3805         unsigned long flags = 0;
3806         unsigned int key_size;
3807         int ret = 0;
3808
3809         if (WARN_ON(key_idx >= HIST_FIELDS_MAX))
3810                 return -EINVAL;
3811
3812         flags |= HIST_FIELD_FL_KEY;
3813
3814         if (strcmp(field_str, "stacktrace") == 0) {
3815                 flags |= HIST_FIELD_FL_STACKTRACE;
3816                 key_size = sizeof(unsigned long) * HIST_STACKTRACE_DEPTH;
3817                 hist_field = create_hist_field(hist_data, NULL, flags, NULL);
3818         } else {
3819                 hist_field = parse_expr(hist_data, file, field_str, flags,
3820                                         NULL, 0);
3821                 if (IS_ERR(hist_field)) {
3822                         ret = PTR_ERR(hist_field);
3823                         goto out;
3824                 }
3825
3826                 if (field_has_hist_vars(hist_field, 0)) {
3827                         hist_err(tr, HIST_ERR_INVALID_REF_KEY, errpos(field_str));
3828                         destroy_hist_field(hist_field, 0);
3829                         ret = -EINVAL;
3830                         goto out;
3831                 }
3832
3833                 key_size = hist_field->size;
3834         }
3835
3836         hist_data->fields[key_idx] = hist_field;
3837
3838         key_size = ALIGN(key_size, sizeof(u64));
3839         hist_data->fields[key_idx]->size = key_size;
3840         hist_data->fields[key_idx]->offset = key_offset;
3841
3842         hist_data->key_size += key_size;
3843
3844         if (hist_data->key_size > HIST_KEY_SIZE_MAX) {
3845                 ret = -EINVAL;
3846                 goto out;
3847         }
3848
3849         hist_data->n_keys++;
3850         hist_data->n_fields++;
3851
3852         if (WARN_ON(hist_data->n_keys > TRACING_MAP_KEYS_MAX))
3853                 return -EINVAL;
3854
3855         ret = key_size;
3856  out:
3857         return ret;
3858 }
3859
3860 static int create_key_fields(struct hist_trigger_data *hist_data,
3861                              struct trace_event_file *file)
3862 {
3863         unsigned int i, key_offset = 0, n_vals = hist_data->n_vals;
3864         char *fields_str, *field_str;
3865         int ret = -EINVAL;
3866
3867         fields_str = hist_data->attrs->keys_str;
3868         if (!fields_str)
3869                 goto out;
3870
3871         for (i = n_vals; i < n_vals + TRACING_MAP_KEYS_MAX; i++) {
3872                 field_str = strsep(&fields_str, ",");
3873                 if (!field_str)
3874                         break;
3875                 ret = create_key_field(hist_data, i, key_offset,
3876                                        file, field_str);
3877                 if (ret < 0)
3878                         goto out;
3879                 key_offset += ret;
3880         }
3881         if (fields_str) {
3882                 ret = -EINVAL;
3883                 goto out;
3884         }
3885         ret = 0;
3886  out:
3887         return ret;
3888 }
3889
3890 static int create_var_fields(struct hist_trigger_data *hist_data,
3891                              struct trace_event_file *file)
3892 {
3893         unsigned int i, j = hist_data->n_vals;
3894         int ret = 0;
3895
3896         unsigned int n_vars = hist_data->attrs->var_defs.n_vars;
3897
3898         for (i = 0; i < n_vars; i++) {
3899                 char *var_name = hist_data->attrs->var_defs.name[i];
3900                 char *expr = hist_data->attrs->var_defs.expr[i];
3901
3902                 ret = create_var_field(hist_data, j++, file, var_name, expr);
3903                 if (ret)
3904                         goto out;
3905         }
3906  out:
3907         return ret;
3908 }
3909
3910 static void free_var_defs(struct hist_trigger_data *hist_data)
3911 {
3912         unsigned int i;
3913
3914         for (i = 0; i < hist_data->attrs->var_defs.n_vars; i++) {
3915                 kfree(hist_data->attrs->var_defs.name[i]);
3916                 kfree(hist_data->attrs->var_defs.expr[i]);
3917         }
3918
3919         hist_data->attrs->var_defs.n_vars = 0;
3920 }
3921
3922 static int parse_var_defs(struct hist_trigger_data *hist_data)
3923 {
3924         struct trace_array *tr = hist_data->event_file->tr;
3925         char *s, *str, *var_name, *field_str;
3926         unsigned int i, j, n_vars = 0;
3927         int ret = 0;
3928
3929         for (i = 0; i < hist_data->attrs->n_assignments; i++) {
3930                 str = hist_data->attrs->assignment_str[i];
3931                 for (j = 0; j < TRACING_MAP_VARS_MAX; j++) {
3932                         field_str = strsep(&str, ",");
3933                         if (!field_str)
3934                                 break;
3935
3936                         var_name = strsep(&field_str, "=");
3937                         if (!var_name || !field_str) {
3938                                 hist_err(tr, HIST_ERR_MALFORMED_ASSIGNMENT,
3939                                          errpos(var_name));
3940                                 ret = -EINVAL;
3941                                 goto free;
3942                         }
3943
3944                         if (n_vars == TRACING_MAP_VARS_MAX) {
3945                                 hist_err(tr, HIST_ERR_TOO_MANY_VARS, errpos(var_name));
3946                                 ret = -EINVAL;
3947                                 goto free;
3948                         }
3949
3950                         s = kstrdup(var_name, GFP_KERNEL);
3951                         if (!s) {
3952                                 ret = -ENOMEM;
3953                                 goto free;
3954                         }
3955                         hist_data->attrs->var_defs.name[n_vars] = s;
3956
3957                         s = kstrdup(field_str, GFP_KERNEL);
3958                         if (!s) {
3959                                 ret = -ENOMEM;
3960                                 goto free;
3961                         }
3962                         hist_data->attrs->var_defs.expr[n_vars++] = s;
3963
3964                         hist_data->attrs->var_defs.n_vars = n_vars;
3965                 }
3966         }
3967
3968         return ret;
3969  free:
3970         free_var_defs(hist_data);
3971
3972         return ret;
3973 }
3974
3975 static int create_hist_fields(struct hist_trigger_data *hist_data,
3976                               struct trace_event_file *file)
3977 {
3978         int ret;
3979
3980         ret = parse_var_defs(hist_data);
3981         if (ret)
3982                 goto out;
3983
3984         ret = create_val_fields(hist_data, file);
3985         if (ret)
3986                 goto out;
3987
3988         ret = create_var_fields(hist_data, file);
3989         if (ret)
3990                 goto out;
3991
3992         ret = create_key_fields(hist_data, file);
3993         if (ret)
3994                 goto out;
3995  out:
3996         free_var_defs(hist_data);
3997
3998         return ret;
3999 }
4000
4001 static int is_descending(struct trace_array *tr, const char *str)
4002 {
4003         if (!str)
4004                 return 0;
4005
4006         if (strcmp(str, "descending") == 0)
4007                 return 1;
4008
4009         if (strcmp(str, "ascending") == 0)
4010                 return 0;
4011
4012         hist_err(tr, HIST_ERR_INVALID_SORT_MODIFIER, errpos((char *)str));
4013
4014         return -EINVAL;
4015 }
4016
4017 static int create_sort_keys(struct hist_trigger_data *hist_data)
4018 {
4019         struct trace_array *tr = hist_data->event_file->tr;
4020         char *fields_str = hist_data->attrs->sort_key_str;
4021         struct tracing_map_sort_key *sort_key;
4022         int descending, ret = 0;
4023         unsigned int i, j, k;
4024
4025         hist_data->n_sort_keys = 1; /* we always have at least one, hitcount */
4026
4027         if (!fields_str)
4028                 goto out;
4029
4030         for (i = 0; i < TRACING_MAP_SORT_KEYS_MAX; i++) {
4031                 struct hist_field *hist_field;
4032                 char *field_str, *field_name;
4033                 const char *test_name;
4034
4035                 sort_key = &hist_data->sort_keys[i];
4036
4037                 field_str = strsep(&fields_str, ",");
4038                 if (!field_str)
4039                         break;
4040
4041                 if (!*field_str) {
4042                         ret = -EINVAL;
4043                         hist_err(tr, HIST_ERR_EMPTY_SORT_FIELD, errpos("sort="));
4044                         break;
4045                 }
4046
4047                 if ((i == TRACING_MAP_SORT_KEYS_MAX - 1) && fields_str) {
4048                         hist_err(tr, HIST_ERR_TOO_MANY_SORT_FIELDS, errpos("sort="));
4049                         ret = -EINVAL;
4050                         break;
4051                 }
4052
4053                 field_name = strsep(&field_str, ".");
4054                 if (!field_name || !*field_name) {
4055                         ret = -EINVAL;
4056                         hist_err(tr, HIST_ERR_EMPTY_SORT_FIELD, errpos("sort="));
4057                         break;
4058                 }
4059
4060                 if (strcmp(field_name, "hitcount") == 0) {
4061                         descending = is_descending(tr, field_str);
4062                         if (descending < 0) {
4063                                 ret = descending;
4064                                 break;
4065                         }
4066                         sort_key->descending = descending;
4067                         continue;
4068                 }
4069
4070                 for (j = 1, k = 1; j < hist_data->n_fields; j++) {
4071                         unsigned int idx;
4072
4073                         hist_field = hist_data->fields[j];
4074                         if (hist_field->flags & HIST_FIELD_FL_VAR)
4075                                 continue;
4076
4077                         idx = k++;
4078
4079                         test_name = hist_field_name(hist_field, 0);
4080
4081                         if (strcmp(field_name, test_name) == 0) {
4082                                 sort_key->field_idx = idx;
4083                                 descending = is_descending(tr, field_str);
4084                                 if (descending < 0) {
4085                                         ret = descending;
4086                                         goto out;
4087                                 }
4088                                 sort_key->descending = descending;
4089                                 break;
4090                         }
4091                 }
4092                 if (j == hist_data->n_fields) {
4093                         ret = -EINVAL;
4094                         hist_err(tr, HIST_ERR_INVALID_SORT_FIELD, errpos(field_name));
4095                         break;
4096                 }
4097         }
4098
4099         hist_data->n_sort_keys = i;
4100  out:
4101         return ret;
4102 }
4103
4104 static void destroy_actions(struct hist_trigger_data *hist_data)
4105 {
4106         unsigned int i;
4107
4108         for (i = 0; i < hist_data->n_actions; i++) {
4109                 struct action_data *data = hist_data->actions[i];
4110
4111                 if (data->handler == HANDLER_ONMATCH)
4112                         onmatch_destroy(data);
4113                 else if (data->handler == HANDLER_ONMAX ||
4114                          data->handler == HANDLER_ONCHANGE)
4115                         track_data_destroy(hist_data, data);
4116                 else
4117                         kfree(data);
4118         }
4119 }
4120
4121 static int parse_actions(struct hist_trigger_data *hist_data)
4122 {
4123         struct trace_array *tr = hist_data->event_file->tr;
4124         struct action_data *data;
4125         unsigned int i;
4126         int ret = 0;
4127         char *str;
4128         int len;
4129
4130         for (i = 0; i < hist_data->attrs->n_actions; i++) {
4131                 str = hist_data->attrs->action_str[i];
4132
4133                 if ((len = str_has_prefix(str, "onmatch("))) {
4134                         char *action_str = str + len;
4135
4136                         data = onmatch_parse(tr, action_str);
4137                         if (IS_ERR(data)) {
4138                                 ret = PTR_ERR(data);
4139                                 break;
4140                         }
4141                 } else if ((len = str_has_prefix(str, "onmax("))) {
4142                         char *action_str = str + len;
4143
4144                         data = track_data_parse(hist_data, action_str,
4145                                                 HANDLER_ONMAX);
4146                         if (IS_ERR(data)) {
4147                                 ret = PTR_ERR(data);
4148                                 break;
4149                         }
4150                 } else if ((len = str_has_prefix(str, "onchange("))) {
4151                         char *action_str = str + len;
4152
4153                         data = track_data_parse(hist_data, action_str,
4154                                                 HANDLER_ONCHANGE);
4155                         if (IS_ERR(data)) {
4156                                 ret = PTR_ERR(data);
4157                                 break;
4158                         }
4159                 } else {
4160                         ret = -EINVAL;
4161                         break;
4162                 }
4163
4164                 hist_data->actions[hist_data->n_actions++] = data;
4165         }
4166
4167         return ret;
4168 }
4169
4170 static int create_actions(struct hist_trigger_data *hist_data)
4171 {
4172         struct action_data *data;
4173         unsigned int i;
4174         int ret = 0;
4175
4176         for (i = 0; i < hist_data->attrs->n_actions; i++) {
4177                 data = hist_data->actions[i];
4178
4179                 if (data->handler == HANDLER_ONMATCH) {
4180                         ret = onmatch_create(hist_data, data);
4181                         if (ret)
4182                                 break;
4183                 } else if (data->handler == HANDLER_ONMAX ||
4184                            data->handler == HANDLER_ONCHANGE) {
4185                         ret = track_data_create(hist_data, data);
4186                         if (ret)
4187                                 break;
4188                 } else {
4189                         ret = -EINVAL;
4190                         break;
4191                 }
4192         }
4193
4194         return ret;
4195 }
4196
4197 static void print_actions(struct seq_file *m,
4198                           struct hist_trigger_data *hist_data,
4199                           struct tracing_map_elt *elt)
4200 {
4201         unsigned int i;
4202
4203         for (i = 0; i < hist_data->n_actions; i++) {
4204                 struct action_data *data = hist_data->actions[i];
4205
4206                 if (data->action == ACTION_SNAPSHOT)
4207                         continue;
4208
4209                 if (data->handler == HANDLER_ONMAX ||
4210                     data->handler == HANDLER_ONCHANGE)
4211                         track_data_print(m, hist_data, elt, data);
4212         }
4213 }
4214
4215 static void print_action_spec(struct seq_file *m,
4216                               struct hist_trigger_data *hist_data,
4217                               struct action_data *data)
4218 {
4219         unsigned int i;
4220
4221         if (data->action == ACTION_SAVE) {
4222                 for (i = 0; i < hist_data->n_save_vars; i++) {
4223                         seq_printf(m, "%s", hist_data->save_vars[i]->var->var.name);
4224                         if (i < hist_data->n_save_vars - 1)
4225                                 seq_puts(m, ",");
4226                 }
4227         } else if (data->action == ACTION_TRACE) {
4228                 if (data->use_trace_keyword)
4229                         seq_printf(m, "%s", data->synth_event_name);
4230                 for (i = 0; i < data->n_params; i++) {
4231                         if (i || data->use_trace_keyword)
4232                                 seq_puts(m, ",");
4233                         seq_printf(m, "%s", data->params[i]);
4234                 }
4235         }
4236 }
4237
4238 static void print_track_data_spec(struct seq_file *m,
4239                                   struct hist_trigger_data *hist_data,
4240                                   struct action_data *data)
4241 {
4242         if (data->handler == HANDLER_ONMAX)
4243                 seq_puts(m, ":onmax(");
4244         else if (data->handler == HANDLER_ONCHANGE)
4245                 seq_puts(m, ":onchange(");
4246         seq_printf(m, "%s", data->track_data.var_str);
4247         seq_printf(m, ").%s(", data->action_name);
4248
4249         print_action_spec(m, hist_data, data);
4250
4251         seq_puts(m, ")");
4252 }
4253
4254 static void print_onmatch_spec(struct seq_file *m,
4255                                struct hist_trigger_data *hist_data,
4256                                struct action_data *data)
4257 {
4258         seq_printf(m, ":onmatch(%s.%s).", data->match_data.event_system,
4259                    data->match_data.event);
4260
4261         seq_printf(m, "%s(", data->action_name);
4262
4263         print_action_spec(m, hist_data, data);
4264
4265         seq_puts(m, ")");
4266 }
4267
4268 static bool actions_match(struct hist_trigger_data *hist_data,
4269                           struct hist_trigger_data *hist_data_test)
4270 {
4271         unsigned int i, j;
4272
4273         if (hist_data->n_actions != hist_data_test->n_actions)
4274                 return false;
4275
4276         for (i = 0; i < hist_data->n_actions; i++) {
4277                 struct action_data *data = hist_data->actions[i];
4278                 struct action_data *data_test = hist_data_test->actions[i];
4279                 char *action_name, *action_name_test;
4280
4281                 if (data->handler != data_test->handler)
4282                         return false;
4283                 if (data->action != data_test->action)
4284                         return false;
4285
4286                 if (data->n_params != data_test->n_params)
4287                         return false;
4288
4289                 for (j = 0; j < data->n_params; j++) {
4290                         if (strcmp(data->params[j], data_test->params[j]) != 0)
4291                                 return false;
4292                 }
4293
4294                 if (data->use_trace_keyword)
4295                         action_name = data->synth_event_name;
4296                 else
4297                         action_name = data->action_name;
4298
4299                 if (data_test->use_trace_keyword)
4300                         action_name_test = data_test->synth_event_name;
4301                 else
4302                         action_name_test = data_test->action_name;
4303
4304                 if (strcmp(action_name, action_name_test) != 0)
4305                         return false;
4306
4307                 if (data->handler == HANDLER_ONMATCH) {
4308                         if (strcmp(data->match_data.event_system,
4309                                    data_test->match_data.event_system) != 0)
4310                                 return false;
4311                         if (strcmp(data->match_data.event,
4312                                    data_test->match_data.event) != 0)
4313                                 return false;
4314                 } else if (data->handler == HANDLER_ONMAX ||
4315                            data->handler == HANDLER_ONCHANGE) {
4316                         if (strcmp(data->track_data.var_str,
4317                                    data_test->track_data.var_str) != 0)
4318                                 return false;
4319                 }
4320         }
4321
4322         return true;
4323 }
4324
4325
4326 static void print_actions_spec(struct seq_file *m,
4327                                struct hist_trigger_data *hist_data)
4328 {
4329         unsigned int i;
4330
4331         for (i = 0; i < hist_data->n_actions; i++) {
4332                 struct action_data *data = hist_data->actions[i];
4333
4334                 if (data->handler == HANDLER_ONMATCH)
4335                         print_onmatch_spec(m, hist_data, data);
4336                 else if (data->handler == HANDLER_ONMAX ||
4337                          data->handler == HANDLER_ONCHANGE)
4338                         print_track_data_spec(m, hist_data, data);
4339         }
4340 }
4341
4342 static void destroy_field_var_hists(struct hist_trigger_data *hist_data)
4343 {
4344         unsigned int i;
4345
4346         for (i = 0; i < hist_data->n_field_var_hists; i++) {
4347                 kfree(hist_data->field_var_hists[i]->cmd);
4348                 kfree(hist_data->field_var_hists[i]);
4349         }
4350 }
4351
4352 static void destroy_hist_data(struct hist_trigger_data *hist_data)
4353 {
4354         if (!hist_data)
4355                 return;
4356
4357         destroy_hist_trigger_attrs(hist_data->attrs);
4358         destroy_hist_fields(hist_data);
4359         tracing_map_destroy(hist_data->map);
4360
4361         destroy_actions(hist_data);
4362         destroy_field_vars(hist_data);
4363         destroy_field_var_hists(hist_data);
4364
4365         kfree(hist_data);
4366 }
4367
4368 static int create_tracing_map_fields(struct hist_trigger_data *hist_data)
4369 {
4370         struct tracing_map *map = hist_data->map;
4371         struct ftrace_event_field *field;
4372         struct hist_field *hist_field;
4373         int i, idx = 0;
4374
4375         for_each_hist_field(i, hist_data) {
4376                 hist_field = hist_data->fields[i];
4377                 if (hist_field->flags & HIST_FIELD_FL_KEY) {
4378                         tracing_map_cmp_fn_t cmp_fn;
4379
4380                         field = hist_field->field;
4381
4382                         if (hist_field->flags & HIST_FIELD_FL_STACKTRACE)
4383                                 cmp_fn = tracing_map_cmp_none;
4384                         else if (!field)
4385                                 cmp_fn = tracing_map_cmp_num(hist_field->size,
4386                                                              hist_field->is_signed);
4387                         else if (is_string_field(field))
4388                                 cmp_fn = tracing_map_cmp_string;
4389                         else
4390                                 cmp_fn = tracing_map_cmp_num(field->size,
4391                                                              field->is_signed);
4392                         idx = tracing_map_add_key_field(map,
4393                                                         hist_field->offset,
4394                                                         cmp_fn);
4395                 } else if (!(hist_field->flags & HIST_FIELD_FL_VAR))
4396                         idx = tracing_map_add_sum_field(map);
4397
4398                 if (idx < 0)
4399                         return idx;
4400
4401                 if (hist_field->flags & HIST_FIELD_FL_VAR) {
4402                         idx = tracing_map_add_var(map);
4403                         if (idx < 0)
4404                                 return idx;
4405                         hist_field->var.idx = idx;
4406                         hist_field->var.hist_data = hist_data;
4407                 }
4408         }
4409
4410         return 0;
4411 }
4412
4413 static struct hist_trigger_data *
4414 create_hist_data(unsigned int map_bits,
4415                  struct hist_trigger_attrs *attrs,
4416                  struct trace_event_file *file,
4417                  bool remove)
4418 {
4419         const struct tracing_map_ops *map_ops = NULL;
4420         struct hist_trigger_data *hist_data;
4421         int ret = 0;
4422
4423         hist_data = kzalloc(sizeof(*hist_data), GFP_KERNEL);
4424         if (!hist_data)
4425                 return ERR_PTR(-ENOMEM);
4426
4427         hist_data->attrs = attrs;
4428         hist_data->remove = remove;
4429         hist_data->event_file = file;
4430
4431         ret = parse_actions(hist_data);
4432         if (ret)
4433                 goto free;
4434
4435         ret = create_hist_fields(hist_data, file);
4436         if (ret)
4437                 goto free;
4438
4439         ret = create_sort_keys(hist_data);
4440         if (ret)
4441                 goto free;
4442
4443         map_ops = &hist_trigger_elt_data_ops;
4444
4445         hist_data->map = tracing_map_create(map_bits, hist_data->key_size,
4446                                             map_ops, hist_data);
4447         if (IS_ERR(hist_data->map)) {
4448                 ret = PTR_ERR(hist_data->map);
4449                 hist_data->map = NULL;
4450                 goto free;
4451         }
4452
4453         ret = create_tracing_map_fields(hist_data);
4454         if (ret)
4455                 goto free;
4456  out:
4457         return hist_data;
4458  free:
4459         hist_data->attrs = NULL;
4460
4461         destroy_hist_data(hist_data);
4462
4463         hist_data = ERR_PTR(ret);
4464
4465         goto out;
4466 }
4467
4468 static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
4469                                     struct tracing_map_elt *elt,
4470                                     struct trace_buffer *buffer, void *rec,
4471                                     struct ring_buffer_event *rbe,
4472                                     u64 *var_ref_vals)
4473 {
4474         struct hist_elt_data *elt_data;
4475         struct hist_field *hist_field;
4476         unsigned int i, var_idx;
4477         u64 hist_val;
4478
4479         elt_data = elt->private_data;
4480         elt_data->var_ref_vals = var_ref_vals;
4481
4482         for_each_hist_val_field(i, hist_data) {
4483                 hist_field = hist_data->fields[i];
4484                 hist_val = hist_field->fn(hist_field, elt, buffer, rbe, rec);
4485                 if (hist_field->flags & HIST_FIELD_FL_VAR) {
4486                         var_idx = hist_field->var.idx;
4487
4488                         if (hist_field->flags & HIST_FIELD_FL_STRING) {
4489                                 unsigned int str_start, var_str_idx, idx;
4490                                 char *str, *val_str;
4491
4492                                 str_start = hist_data->n_field_var_str +
4493                                         hist_data->n_save_var_str;
4494                                 var_str_idx = hist_field->var_str_idx;
4495                                 idx = str_start + var_str_idx;
4496
4497                                 str = elt_data->field_var_str[idx];
4498                                 val_str = (char *)(uintptr_t)hist_val;
4499                                 strscpy(str, val_str, STR_VAR_LEN_MAX);
4500
4501                                 hist_val = (u64)(uintptr_t)str;
4502                         }
4503                         tracing_map_set_var(elt, var_idx, hist_val);
4504                         continue;
4505                 }
4506                 tracing_map_update_sum(elt, i, hist_val);
4507         }
4508
4509         for_each_hist_key_field(i, hist_data) {
4510                 hist_field = hist_data->fields[i];
4511                 if (hist_field->flags & HIST_FIELD_FL_VAR) {
4512                         hist_val = hist_field->fn(hist_field, elt, buffer, rbe, rec);
4513                         var_idx = hist_field->var.idx;
4514                         tracing_map_set_var(elt, var_idx, hist_val);
4515                 }
4516         }
4517
4518         update_field_vars(hist_data, elt, buffer, rbe, rec);
4519 }
4520
4521 static inline void add_to_key(char *compound_key, void *key,
4522                               struct hist_field *key_field, void *rec)
4523 {
4524         size_t size = key_field->size;
4525
4526         if (key_field->flags & HIST_FIELD_FL_STRING) {
4527                 struct ftrace_event_field *field;
4528
4529                 field = key_field->field;
4530                 if (field->filter_type == FILTER_DYN_STRING)
4531                         size = *(u32 *)(rec + field->offset) >> 16;
4532                 else if (field->filter_type == FILTER_STATIC_STRING)
4533                         size = field->size;
4534
4535                 /* ensure NULL-termination */
4536                 if (size > key_field->size - 1)
4537                         size = key_field->size - 1;
4538
4539                 strncpy(compound_key + key_field->offset, (char *)key, size);
4540         } else
4541                 memcpy(compound_key + key_field->offset, key, size);
4542 }
4543
4544 static void
4545 hist_trigger_actions(struct hist_trigger_data *hist_data,
4546                      struct tracing_map_elt *elt,
4547                      struct trace_buffer *buffer, void *rec,
4548                      struct ring_buffer_event *rbe, void *key,
4549                      u64 *var_ref_vals)
4550 {
4551         struct action_data *data;
4552         unsigned int i;
4553
4554         for (i = 0; i < hist_data->n_actions; i++) {
4555                 data = hist_data->actions[i];
4556                 data->fn(hist_data, elt, buffer, rec, rbe, key, data, var_ref_vals);
4557         }
4558 }
4559
4560 static void event_hist_trigger(struct event_trigger_data *data,
4561                                struct trace_buffer *buffer, void *rec,
4562                                struct ring_buffer_event *rbe)
4563 {
4564         struct hist_trigger_data *hist_data = data->private_data;
4565         bool use_compound_key = (hist_data->n_keys > 1);
4566         unsigned long entries[HIST_STACKTRACE_DEPTH];
4567         u64 var_ref_vals[TRACING_MAP_VARS_MAX];
4568         char compound_key[HIST_KEY_SIZE_MAX];
4569         struct tracing_map_elt *elt = NULL;
4570         struct hist_field *key_field;
4571         u64 field_contents;
4572         void *key = NULL;
4573         unsigned int i;
4574
4575         memset(compound_key, 0, hist_data->key_size);
4576
4577         for_each_hist_key_field(i, hist_data) {
4578                 key_field = hist_data->fields[i];
4579
4580                 if (key_field->flags & HIST_FIELD_FL_STACKTRACE) {
4581                         memset(entries, 0, HIST_STACKTRACE_SIZE);
4582                         stack_trace_save(entries, HIST_STACKTRACE_DEPTH,
4583                                          HIST_STACKTRACE_SKIP);
4584                         key = entries;
4585                 } else {
4586                         field_contents = key_field->fn(key_field, elt, buffer, rbe, rec);
4587                         if (key_field->flags & HIST_FIELD_FL_STRING) {
4588                                 key = (void *)(unsigned long)field_contents;
4589                                 use_compound_key = true;
4590                         } else
4591                                 key = (void *)&field_contents;
4592                 }
4593
4594                 if (use_compound_key)
4595                         add_to_key(compound_key, key, key_field, rec);
4596         }
4597
4598         if (use_compound_key)
4599                 key = compound_key;
4600
4601         if (hist_data->n_var_refs &&
4602             !resolve_var_refs(hist_data, key, var_ref_vals, false))
4603                 return;
4604
4605         elt = tracing_map_insert(hist_data->map, key);
4606         if (!elt)
4607                 return;
4608
4609         hist_trigger_elt_update(hist_data, elt, buffer, rec, rbe, var_ref_vals);
4610
4611         if (resolve_var_refs(hist_data, key, var_ref_vals, true))
4612                 hist_trigger_actions(hist_data, elt, buffer, rec, rbe, key, var_ref_vals);
4613 }
4614
4615 static void hist_trigger_stacktrace_print(struct seq_file *m,
4616                                           unsigned long *stacktrace_entries,
4617                                           unsigned int max_entries)
4618 {
4619         char str[KSYM_SYMBOL_LEN];
4620         unsigned int spaces = 8;
4621         unsigned int i;
4622
4623         for (i = 0; i < max_entries; i++) {
4624                 if (!stacktrace_entries[i])
4625                         return;
4626
4627                 seq_printf(m, "%*c", 1 + spaces, ' ');
4628                 sprint_symbol(str, stacktrace_entries[i]);
4629                 seq_printf(m, "%s\n", str);
4630         }
4631 }
4632
4633 static void hist_trigger_print_key(struct seq_file *m,
4634                                    struct hist_trigger_data *hist_data,
4635                                    void *key,
4636                                    struct tracing_map_elt *elt)
4637 {
4638         struct hist_field *key_field;
4639         char str[KSYM_SYMBOL_LEN];
4640         bool multiline = false;
4641         const char *field_name;
4642         unsigned int i;
4643         u64 uval;
4644
4645         seq_puts(m, "{ ");
4646
4647         for_each_hist_key_field(i, hist_data) {
4648                 key_field = hist_data->fields[i];
4649
4650                 if (i > hist_data->n_vals)
4651                         seq_puts(m, ", ");
4652
4653                 field_name = hist_field_name(key_field, 0);
4654
4655                 if (key_field->flags & HIST_FIELD_FL_HEX) {
4656                         uval = *(u64 *)(key + key_field->offset);
4657                         seq_printf(m, "%s: %llx", field_name, uval);
4658                 } else if (key_field->flags & HIST_FIELD_FL_SYM) {
4659                         uval = *(u64 *)(key + key_field->offset);
4660                         sprint_symbol_no_offset(str, uval);
4661                         seq_printf(m, "%s: [%llx] %-45s", field_name,
4662                                    uval, str);
4663                 } else if (key_field->flags & HIST_FIELD_FL_SYM_OFFSET) {
4664                         uval = *(u64 *)(key + key_field->offset);
4665                         sprint_symbol(str, uval);
4666                         seq_printf(m, "%s: [%llx] %-55s", field_name,
4667                                    uval, str);
4668                 } else if (key_field->flags & HIST_FIELD_FL_EXECNAME) {
4669                         struct hist_elt_data *elt_data = elt->private_data;
4670                         char *comm;
4671
4672                         if (WARN_ON_ONCE(!elt_data))
4673                                 return;
4674
4675                         comm = elt_data->comm;
4676
4677                         uval = *(u64 *)(key + key_field->offset);
4678                         seq_printf(m, "%s: %-16s[%10llu]", field_name,
4679                                    comm, uval);
4680                 } else if (key_field->flags & HIST_FIELD_FL_SYSCALL) {
4681                         const char *syscall_name;
4682
4683                         uval = *(u64 *)(key + key_field->offset);
4684                         syscall_name = get_syscall_name(uval);
4685                         if (!syscall_name)
4686                                 syscall_name = "unknown_syscall";
4687
4688                         seq_printf(m, "%s: %-30s[%3llu]", field_name,
4689                                    syscall_name, uval);
4690                 } else if (key_field->flags & HIST_FIELD_FL_STACKTRACE) {
4691                         seq_puts(m, "stacktrace:\n");
4692                         hist_trigger_stacktrace_print(m,
4693                                                       key + key_field->offset,
4694                                                       HIST_STACKTRACE_DEPTH);
4695                         multiline = true;
4696                 } else if (key_field->flags & HIST_FIELD_FL_LOG2) {
4697                         seq_printf(m, "%s: ~ 2^%-2llu", field_name,
4698                                    *(u64 *)(key + key_field->offset));
4699                 } else if (key_field->flags & HIST_FIELD_FL_STRING) {
4700                         seq_printf(m, "%s: %-50s", field_name,
4701                                    (char *)(key + key_field->offset));
4702                 } else {
4703                         uval = *(u64 *)(key + key_field->offset);
4704                         seq_printf(m, "%s: %10llu", field_name, uval);
4705                 }
4706         }
4707
4708         if (!multiline)
4709                 seq_puts(m, " ");
4710
4711         seq_puts(m, "}");
4712 }
4713
4714 static void hist_trigger_entry_print(struct seq_file *m,
4715                                      struct hist_trigger_data *hist_data,
4716                                      void *key,
4717                                      struct tracing_map_elt *elt)
4718 {
4719         const char *field_name;
4720         unsigned int i;
4721
4722         hist_trigger_print_key(m, hist_data, key, elt);
4723
4724         seq_printf(m, " hitcount: %10llu",
4725                    tracing_map_read_sum(elt, HITCOUNT_IDX));
4726
4727         for (i = 1; i < hist_data->n_vals; i++) {
4728                 field_name = hist_field_name(hist_data->fields[i], 0);
4729
4730                 if (hist_data->fields[i]->flags & HIST_FIELD_FL_VAR ||
4731                     hist_data->fields[i]->flags & HIST_FIELD_FL_EXPR)
4732                         continue;
4733
4734                 if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) {
4735                         seq_printf(m, "  %s: %10llx", field_name,
4736                                    tracing_map_read_sum(elt, i));
4737                 } else {
4738                         seq_printf(m, "  %s: %10llu", field_name,
4739                                    tracing_map_read_sum(elt, i));
4740                 }
4741         }
4742
4743         print_actions(m, hist_data, elt);
4744
4745         seq_puts(m, "\n");
4746 }
4747
4748 static int print_entries(struct seq_file *m,
4749                          struct hist_trigger_data *hist_data)
4750 {
4751         struct tracing_map_sort_entry **sort_entries = NULL;
4752         struct tracing_map *map = hist_data->map;
4753         int i, n_entries;
4754
4755         n_entries = tracing_map_sort_entries(map, hist_data->sort_keys,
4756                                              hist_data->n_sort_keys,
4757                                              &sort_entries);
4758         if (n_entries < 0)
4759                 return n_entries;
4760
4761         for (i = 0; i < n_entries; i++)
4762                 hist_trigger_entry_print(m, hist_data,
4763                                          sort_entries[i]->key,
4764                                          sort_entries[i]->elt);
4765
4766         tracing_map_destroy_sort_entries(sort_entries, n_entries);
4767
4768         return n_entries;
4769 }
4770
4771 static void hist_trigger_show(struct seq_file *m,
4772                               struct event_trigger_data *data, int n)
4773 {
4774         struct hist_trigger_data *hist_data;
4775         int n_entries;
4776
4777         if (n > 0)
4778                 seq_puts(m, "\n\n");
4779
4780         seq_puts(m, "# event histogram\n#\n# trigger info: ");
4781         data->ops->print(m, data->ops, data);
4782         seq_puts(m, "#\n\n");
4783
4784         hist_data = data->private_data;
4785         n_entries = print_entries(m, hist_data);
4786         if (n_entries < 0)
4787                 n_entries = 0;
4788
4789         track_data_snapshot_print(m, hist_data);
4790
4791         seq_printf(m, "\nTotals:\n    Hits: %llu\n    Entries: %u\n    Dropped: %llu\n",
4792                    (u64)atomic64_read(&hist_data->map->hits),
4793                    n_entries, (u64)atomic64_read(&hist_data->map->drops));
4794 }
4795
4796 static int hist_show(struct seq_file *m, void *v)
4797 {
4798         struct event_trigger_data *data;
4799         struct trace_event_file *event_file;
4800         int n = 0, ret = 0;
4801
4802         mutex_lock(&event_mutex);
4803
4804         event_file = event_file_data(m->private);
4805         if (unlikely(!event_file)) {
4806                 ret = -ENODEV;
4807                 goto out_unlock;
4808         }
4809
4810         list_for_each_entry(data, &event_file->triggers, list) {
4811                 if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
4812                         hist_trigger_show(m, data, n++);
4813         }
4814
4815  out_unlock:
4816         mutex_unlock(&event_mutex);
4817
4818         return ret;
4819 }
4820
4821 static int event_hist_open(struct inode *inode, struct file *file)
4822 {
4823         int ret;
4824
4825         ret = security_locked_down(LOCKDOWN_TRACEFS);
4826         if (ret)
4827                 return ret;
4828
4829         return single_open(file, hist_show, file);
4830 }
4831
4832 const struct file_operations event_hist_fops = {
4833         .open = event_hist_open,
4834         .read = seq_read,
4835         .llseek = seq_lseek,
4836         .release = single_release,
4837 };
4838
4839 #ifdef CONFIG_HIST_TRIGGERS_DEBUG
4840 static void hist_field_debug_show_flags(struct seq_file *m,
4841                                         unsigned long flags)
4842 {
4843         seq_puts(m, "      flags:\n");
4844
4845         if (flags & HIST_FIELD_FL_KEY)
4846                 seq_puts(m, "        HIST_FIELD_FL_KEY\n");
4847         else if (flags & HIST_FIELD_FL_HITCOUNT)
4848                 seq_puts(m, "        VAL: HIST_FIELD_FL_HITCOUNT\n");
4849         else if (flags & HIST_FIELD_FL_VAR)
4850                 seq_puts(m, "        HIST_FIELD_FL_VAR\n");
4851         else if (flags & HIST_FIELD_FL_VAR_REF)
4852                 seq_puts(m, "        HIST_FIELD_FL_VAR_REF\n");
4853         else
4854                 seq_puts(m, "        VAL: normal u64 value\n");
4855
4856         if (flags & HIST_FIELD_FL_ALIAS)
4857                 seq_puts(m, "        HIST_FIELD_FL_ALIAS\n");
4858 }
4859
4860 static int hist_field_debug_show(struct seq_file *m,
4861                                  struct hist_field *field, unsigned long flags)
4862 {
4863         if ((field->flags & flags) != flags) {
4864                 seq_printf(m, "ERROR: bad flags - %lx\n", flags);
4865                 return -EINVAL;
4866         }
4867
4868         hist_field_debug_show_flags(m, field->flags);
4869         if (field->field)
4870                 seq_printf(m, "      ftrace_event_field name: %s\n",
4871                            field->field->name);
4872
4873         if (field->flags & HIST_FIELD_FL_VAR) {
4874                 seq_printf(m, "      var.name: %s\n", field->var.name);
4875                 seq_printf(m, "      var.idx (into tracing_map_elt.vars[]): %u\n",
4876                            field->var.idx);
4877         }
4878
4879         if (field->flags & HIST_FIELD_FL_ALIAS)
4880                 seq_printf(m, "      var_ref_idx (into hist_data->var_refs[]): %u\n",
4881                            field->var_ref_idx);
4882
4883         if (field->flags & HIST_FIELD_FL_VAR_REF) {
4884                 seq_printf(m, "      name: %s\n", field->name);
4885                 seq_printf(m, "      var.idx (into tracing_map_elt.vars[]): %u\n",
4886                            field->var.idx);
4887                 seq_printf(m, "      var.hist_data: %p\n", field->var.hist_data);
4888                 seq_printf(m, "      var_ref_idx (into hist_data->var_refs[]): %u\n",
4889                            field->var_ref_idx);
4890                 if (field->system)
4891                         seq_printf(m, "      system: %s\n", field->system);
4892                 if (field->event_name)
4893                         seq_printf(m, "      event_name: %s\n", field->event_name);
4894         }
4895
4896         seq_printf(m, "      type: %s\n", field->type);
4897         seq_printf(m, "      size: %u\n", field->size);
4898         seq_printf(m, "      is_signed: %u\n", field->is_signed);
4899
4900         return 0;
4901 }
4902
4903 static int field_var_debug_show(struct seq_file *m,
4904                                 struct field_var *field_var, unsigned int i,
4905                                 bool save_vars)
4906 {
4907         const char *vars_name = save_vars ? "save_vars" : "field_vars";
4908         struct hist_field *field;
4909         int ret = 0;
4910
4911         seq_printf(m, "\n    hist_data->%s[%d]:\n", vars_name, i);
4912
4913         field = field_var->var;
4914
4915         seq_printf(m, "\n      %s[%d].var:\n", vars_name, i);
4916
4917         hist_field_debug_show_flags(m, field->flags);
4918         seq_printf(m, "      var.name: %s\n", field->var.name);
4919         seq_printf(m, "      var.idx (into tracing_map_elt.vars[]): %u\n",
4920                    field->var.idx);
4921
4922         field = field_var->val;
4923
4924         seq_printf(m, "\n      %s[%d].val:\n", vars_name, i);
4925         if (field->field)
4926                 seq_printf(m, "      ftrace_event_field name: %s\n",
4927                            field->field->name);
4928         else {
4929                 ret = -EINVAL;
4930                 goto out;
4931         }
4932
4933         seq_printf(m, "      type: %s\n", field->type);
4934         seq_printf(m, "      size: %u\n", field->size);
4935         seq_printf(m, "      is_signed: %u\n", field->is_signed);
4936 out:
4937         return ret;
4938 }
4939
4940 static int hist_action_debug_show(struct seq_file *m,
4941                                   struct action_data *data, int i)
4942 {
4943         int ret = 0;
4944
4945         if (data->handler == HANDLER_ONMAX ||
4946             data->handler == HANDLER_ONCHANGE) {
4947                 seq_printf(m, "\n    hist_data->actions[%d].track_data.var_ref:\n", i);
4948                 ret = hist_field_debug_show(m, data->track_data.var_ref,
4949                                             HIST_FIELD_FL_VAR_REF);
4950                 if (ret)
4951                         goto out;
4952
4953                 seq_printf(m, "\n    hist_data->actions[%d].track_data.track_var:\n", i);
4954                 ret = hist_field_debug_show(m, data->track_data.track_var,
4955                                             HIST_FIELD_FL_VAR);
4956                 if (ret)
4957                         goto out;
4958         }
4959
4960         if (data->handler == HANDLER_ONMATCH) {
4961                 seq_printf(m, "\n    hist_data->actions[%d].match_data.event_system: %s\n",
4962                            i, data->match_data.event_system);
4963                 seq_printf(m, "    hist_data->actions[%d].match_data.event: %s\n",
4964                            i, data->match_data.event);
4965         }
4966 out:
4967         return ret;
4968 }
4969
4970 static int hist_actions_debug_show(struct seq_file *m,
4971                                    struct hist_trigger_data *hist_data)
4972 {
4973         int i, ret = 0;
4974
4975         if (hist_data->n_actions)
4976                 seq_puts(m, "\n  action tracking variables (for onmax()/onchange()/onmatch()):\n");
4977
4978         for (i = 0; i < hist_data->n_actions; i++) {
4979                 struct action_data *action = hist_data->actions[i];
4980
4981                 ret = hist_action_debug_show(m, action, i);
4982                 if (ret)
4983                         goto out;
4984         }
4985
4986         if (hist_data->n_save_vars)
4987                 seq_puts(m, "\n  save action variables (save() params):\n");
4988
4989         for (i = 0; i < hist_data->n_save_vars; i++) {
4990                 ret = field_var_debug_show(m, hist_data->save_vars[i], i, true);
4991                 if (ret)
4992                         goto out;
4993         }
4994 out:
4995         return ret;
4996 }
4997
4998 static void hist_trigger_debug_show(struct seq_file *m,
4999                                     struct event_trigger_data *data, int n)
5000 {
5001         struct hist_trigger_data *hist_data;
5002         int i, ret;
5003
5004         if (n > 0)
5005                 seq_puts(m, "\n\n");
5006
5007         seq_puts(m, "# event histogram\n#\n# trigger info: ");
5008         data->ops->print(m, data->ops, data);
5009         seq_puts(m, "#\n\n");
5010
5011         hist_data = data->private_data;
5012
5013         seq_printf(m, "hist_data: %p\n\n", hist_data);
5014         seq_printf(m, "  n_vals: %u\n", hist_data->n_vals);
5015         seq_printf(m, "  n_keys: %u\n", hist_data->n_keys);
5016         seq_printf(m, "  n_fields: %u\n", hist_data->n_fields);
5017
5018         seq_puts(m, "\n  val fields:\n\n");
5019
5020         seq_puts(m, "    hist_data->fields[0]:\n");
5021         ret = hist_field_debug_show(m, hist_data->fields[0],
5022                                     HIST_FIELD_FL_HITCOUNT);
5023         if (ret)
5024                 return;
5025
5026         for (i = 1; i < hist_data->n_vals; i++) {
5027                 seq_printf(m, "\n    hist_data->fields[%d]:\n", i);
5028                 ret = hist_field_debug_show(m, hist_data->fields[i], 0);
5029                 if (ret)
5030                         return;
5031         }
5032
5033         seq_puts(m, "\n  key fields:\n");
5034
5035         for (i = hist_data->n_vals; i < hist_data->n_fields; i++) {
5036                 seq_printf(m, "\n    hist_data->fields[%d]:\n", i);
5037                 ret = hist_field_debug_show(m, hist_data->fields[i],
5038                                             HIST_FIELD_FL_KEY);
5039                 if (ret)
5040                         return;
5041         }
5042
5043         if (hist_data->n_var_refs)
5044                 seq_puts(m, "\n  variable reference fields:\n");
5045
5046         for (i = 0; i < hist_data->n_var_refs; i++) {
5047                 seq_printf(m, "\n    hist_data->var_refs[%d]:\n", i);
5048                 ret = hist_field_debug_show(m, hist_data->var_refs[i],
5049                                             HIST_FIELD_FL_VAR_REF);
5050                 if (ret)
5051                         return;
5052         }
5053
5054         if (hist_data->n_field_vars)
5055                 seq_puts(m, "\n  field variables:\n");
5056
5057         for (i = 0; i < hist_data->n_field_vars; i++) {
5058                 ret = field_var_debug_show(m, hist_data->field_vars[i], i, false);
5059                 if (ret)
5060                         return;
5061         }
5062
5063         ret = hist_actions_debug_show(m, hist_data);
5064         if (ret)
5065                 return;
5066 }
5067
5068 static int hist_debug_show(struct seq_file *m, void *v)
5069 {
5070         struct event_trigger_data *data;
5071         struct trace_event_file *event_file;
5072         int n = 0, ret = 0;
5073
5074         mutex_lock(&event_mutex);
5075
5076         event_file = event_file_data(m->private);
5077         if (unlikely(!event_file)) {
5078                 ret = -ENODEV;
5079                 goto out_unlock;
5080         }
5081
5082         list_for_each_entry(data, &event_file->triggers, list) {
5083                 if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
5084                         hist_trigger_debug_show(m, data, n++);
5085         }
5086
5087  out_unlock:
5088         mutex_unlock(&event_mutex);
5089
5090         return ret;
5091 }
5092
5093 static int event_hist_debug_open(struct inode *inode, struct file *file)
5094 {
5095         int ret;
5096
5097         ret = security_locked_down(LOCKDOWN_TRACEFS);
5098         if (ret)
5099                 return ret;
5100
5101         return single_open(file, hist_debug_show, file);
5102 }
5103
5104 const struct file_operations event_hist_debug_fops = {
5105         .open = event_hist_debug_open,
5106         .read = seq_read,
5107         .llseek = seq_lseek,
5108         .release = single_release,
5109 };
5110 #endif
5111
5112 static void hist_field_print(struct seq_file *m, struct hist_field *hist_field)
5113 {
5114         const char *field_name = hist_field_name(hist_field, 0);
5115
5116         if (hist_field->var.name)
5117                 seq_printf(m, "%s=", hist_field->var.name);
5118
5119         if (hist_field->flags & HIST_FIELD_FL_CPU)
5120                 seq_puts(m, "common_cpu");
5121         else if (field_name) {
5122                 if (hist_field->flags & HIST_FIELD_FL_VAR_REF ||
5123                     hist_field->flags & HIST_FIELD_FL_ALIAS)
5124                         seq_putc(m, '$');
5125                 seq_printf(m, "%s", field_name);
5126         } else if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
5127                 seq_puts(m, "common_timestamp");
5128
5129         if (hist_field->flags) {
5130                 if (!(hist_field->flags & HIST_FIELD_FL_VAR_REF) &&
5131                     !(hist_field->flags & HIST_FIELD_FL_EXPR)) {
5132                         const char *flags = get_hist_field_flags(hist_field);
5133
5134                         if (flags)
5135                                 seq_printf(m, ".%s", flags);
5136                 }
5137         }
5138 }
5139
5140 static int event_hist_trigger_print(struct seq_file *m,
5141                                     struct event_trigger_ops *ops,
5142                                     struct event_trigger_data *data)
5143 {
5144         struct hist_trigger_data *hist_data = data->private_data;
5145         struct hist_field *field;
5146         bool have_var = false;
5147         unsigned int i;
5148
5149         seq_puts(m, "hist:");
5150
5151         if (data->name)
5152                 seq_printf(m, "%s:", data->name);
5153
5154         seq_puts(m, "keys=");
5155
5156         for_each_hist_key_field(i, hist_data) {
5157                 field = hist_data->fields[i];
5158
5159                 if (i > hist_data->n_vals)
5160                         seq_puts(m, ",");
5161
5162                 if (field->flags & HIST_FIELD_FL_STACKTRACE)
5163                         seq_puts(m, "stacktrace");
5164                 else
5165                         hist_field_print(m, field);
5166         }
5167
5168         seq_puts(m, ":vals=");
5169
5170         for_each_hist_val_field(i, hist_data) {
5171                 field = hist_data->fields[i];
5172                 if (field->flags & HIST_FIELD_FL_VAR) {
5173                         have_var = true;
5174                         continue;
5175                 }
5176
5177                 if (i == HITCOUNT_IDX)
5178                         seq_puts(m, "hitcount");
5179                 else {
5180                         seq_puts(m, ",");
5181                         hist_field_print(m, field);
5182                 }
5183         }
5184
5185         if (have_var) {
5186                 unsigned int n = 0;
5187
5188                 seq_puts(m, ":");
5189
5190                 for_each_hist_val_field(i, hist_data) {
5191                         field = hist_data->fields[i];
5192
5193                         if (field->flags & HIST_FIELD_FL_VAR) {
5194                                 if (n++)
5195                                         seq_puts(m, ",");
5196                                 hist_field_print(m, field);
5197                         }
5198                 }
5199         }
5200
5201         seq_puts(m, ":sort=");
5202
5203         for (i = 0; i < hist_data->n_sort_keys; i++) {
5204                 struct tracing_map_sort_key *sort_key;
5205                 unsigned int idx, first_key_idx;
5206
5207                 /* skip VAR vals */
5208                 first_key_idx = hist_data->n_vals - hist_data->n_vars;
5209
5210                 sort_key = &hist_data->sort_keys[i];
5211                 idx = sort_key->field_idx;
5212
5213                 if (WARN_ON(idx >= HIST_FIELDS_MAX))
5214                         return -EINVAL;
5215
5216                 if (i > 0)
5217                         seq_puts(m, ",");
5218
5219                 if (idx == HITCOUNT_IDX)
5220                         seq_puts(m, "hitcount");
5221                 else {
5222                         if (idx >= first_key_idx)
5223                                 idx += hist_data->n_vars;
5224                         hist_field_print(m, hist_data->fields[idx]);
5225                 }
5226
5227                 if (sort_key->descending)
5228                         seq_puts(m, ".descending");
5229         }
5230         seq_printf(m, ":size=%u", (1 << hist_data->map->map_bits));
5231         if (hist_data->enable_timestamps)
5232                 seq_printf(m, ":clock=%s", hist_data->attrs->clock);
5233
5234         print_actions_spec(m, hist_data);
5235
5236         if (data->filter_str)
5237                 seq_printf(m, " if %s", data->filter_str);
5238
5239         if (data->paused)
5240                 seq_puts(m, " [paused]");
5241         else
5242                 seq_puts(m, " [active]");
5243
5244         seq_putc(m, '\n');
5245
5246         return 0;
5247 }
5248
5249 static int event_hist_trigger_init(struct event_trigger_ops *ops,
5250                                    struct event_trigger_data *data)
5251 {
5252         struct hist_trigger_data *hist_data = data->private_data;
5253
5254         if (!data->ref && hist_data->attrs->name)
5255                 save_named_trigger(hist_data->attrs->name, data);
5256
5257         data->ref++;
5258
5259         return 0;
5260 }
5261
5262 static void unregister_field_var_hists(struct hist_trigger_data *hist_data)
5263 {
5264         struct trace_event_file *file;
5265         unsigned int i;
5266         char *cmd;
5267         int ret;
5268
5269         for (i = 0; i < hist_data->n_field_var_hists; i++) {
5270                 file = hist_data->field_var_hists[i]->hist_data->event_file;
5271                 cmd = hist_data->field_var_hists[i]->cmd;
5272                 ret = event_hist_trigger_func(&trigger_hist_cmd, file,
5273                                               "!hist", "hist", cmd);
5274                 WARN_ON_ONCE(ret < 0);
5275         }
5276 }
5277
5278 static void event_hist_trigger_free(struct event_trigger_ops *ops,
5279                                     struct event_trigger_data *data)
5280 {
5281         struct hist_trigger_data *hist_data = data->private_data;
5282
5283         if (WARN_ON_ONCE(data->ref <= 0))
5284                 return;
5285
5286         data->ref--;
5287         if (!data->ref) {
5288                 if (data->name)
5289                         del_named_trigger(data);
5290
5291                 trigger_data_free(data);
5292
5293                 remove_hist_vars(hist_data);
5294
5295                 unregister_field_var_hists(hist_data);
5296
5297                 destroy_hist_data(hist_data);
5298         }
5299 }
5300
5301 static struct event_trigger_ops event_hist_trigger_ops = {
5302         .func                   = event_hist_trigger,
5303         .print                  = event_hist_trigger_print,
5304         .init                   = event_hist_trigger_init,
5305         .free                   = event_hist_trigger_free,
5306 };
5307
5308 static int event_hist_trigger_named_init(struct event_trigger_ops *ops,
5309                                          struct event_trigger_data *data)
5310 {
5311         data->ref++;
5312
5313         save_named_trigger(data->named_data->name, data);
5314
5315         event_hist_trigger_init(ops, data->named_data);
5316
5317         return 0;
5318 }
5319
5320 static void event_hist_trigger_named_free(struct event_trigger_ops *ops,
5321                                           struct event_trigger_data *data)
5322 {
5323         if (WARN_ON_ONCE(data->ref <= 0))
5324                 return;
5325
5326         event_hist_trigger_free(ops, data->named_data);
5327
5328         data->ref--;
5329         if (!data->ref) {
5330                 del_named_trigger(data);
5331                 trigger_data_free(data);
5332         }
5333 }
5334
5335 static struct event_trigger_ops event_hist_trigger_named_ops = {
5336         .func                   = event_hist_trigger,
5337         .print                  = event_hist_trigger_print,
5338         .init                   = event_hist_trigger_named_init,
5339         .free                   = event_hist_trigger_named_free,
5340 };
5341
5342 static struct event_trigger_ops *event_hist_get_trigger_ops(char *cmd,
5343                                                             char *param)
5344 {
5345         return &event_hist_trigger_ops;
5346 }
5347
5348 static void hist_clear(struct event_trigger_data *data)
5349 {
5350         struct hist_trigger_data *hist_data = data->private_data;
5351
5352         if (data->name)
5353                 pause_named_trigger(data);
5354
5355         tracepoint_synchronize_unregister();
5356
5357         tracing_map_clear(hist_data->map);
5358
5359         if (data->name)
5360                 unpause_named_trigger(data);
5361 }
5362
5363 static bool compatible_field(struct ftrace_event_field *field,
5364                              struct ftrace_event_field *test_field)
5365 {
5366         if (field == test_field)
5367                 return true;
5368         if (field == NULL || test_field == NULL)
5369                 return false;
5370         if (strcmp(field->name, test_field->name) != 0)
5371                 return false;
5372         if (strcmp(field->type, test_field->type) != 0)
5373                 return false;
5374         if (field->size != test_field->size)
5375                 return false;
5376         if (field->is_signed != test_field->is_signed)
5377                 return false;
5378
5379         return true;
5380 }
5381
5382 static bool hist_trigger_match(struct event_trigger_data *data,
5383                                struct event_trigger_data *data_test,
5384                                struct event_trigger_data *named_data,
5385                                bool ignore_filter)
5386 {
5387         struct tracing_map_sort_key *sort_key, *sort_key_test;
5388         struct hist_trigger_data *hist_data, *hist_data_test;
5389         struct hist_field *key_field, *key_field_test;
5390         unsigned int i;
5391
5392         if (named_data && (named_data != data_test) &&
5393             (named_data != data_test->named_data))
5394                 return false;
5395
5396         if (!named_data && is_named_trigger(data_test))
5397                 return false;
5398
5399         hist_data = data->private_data;
5400         hist_data_test = data_test->private_data;
5401
5402         if (hist_data->n_vals != hist_data_test->n_vals ||
5403             hist_data->n_fields != hist_data_test->n_fields ||
5404             hist_data->n_sort_keys != hist_data_test->n_sort_keys)
5405                 return false;
5406
5407         if (!ignore_filter) {
5408                 if ((data->filter_str && !data_test->filter_str) ||
5409                    (!data->filter_str && data_test->filter_str))
5410                         return false;
5411         }
5412
5413         for_each_hist_field(i, hist_data) {
5414                 key_field = hist_data->fields[i];
5415                 key_field_test = hist_data_test->fields[i];
5416
5417                 if (key_field->flags != key_field_test->flags)
5418                         return false;
5419                 if (!compatible_field(key_field->field, key_field_test->field))
5420                         return false;
5421                 if (key_field->offset != key_field_test->offset)
5422                         return false;
5423                 if (key_field->size != key_field_test->size)
5424                         return false;
5425                 if (key_field->is_signed != key_field_test->is_signed)
5426                         return false;
5427                 if (!!key_field->var.name != !!key_field_test->var.name)
5428                         return false;
5429                 if (key_field->var.name &&
5430                     strcmp(key_field->var.name, key_field_test->var.name) != 0)
5431                         return false;
5432         }
5433
5434         for (i = 0; i < hist_data->n_sort_keys; i++) {
5435                 sort_key = &hist_data->sort_keys[i];
5436                 sort_key_test = &hist_data_test->sort_keys[i];
5437
5438                 if (sort_key->field_idx != sort_key_test->field_idx ||
5439                     sort_key->descending != sort_key_test->descending)
5440                         return false;
5441         }
5442
5443         if (!ignore_filter && data->filter_str &&
5444             (strcmp(data->filter_str, data_test->filter_str) != 0))
5445                 return false;
5446
5447         if (!actions_match(hist_data, hist_data_test))
5448                 return false;
5449
5450         return true;
5451 }
5452
5453 static int hist_register_trigger(char *glob, struct event_trigger_ops *ops,
5454                                  struct event_trigger_data *data,
5455                                  struct trace_event_file *file)
5456 {
5457         struct hist_trigger_data *hist_data = data->private_data;
5458         struct event_trigger_data *test, *named_data = NULL;
5459         struct trace_array *tr = file->tr;
5460         int ret = 0;
5461
5462         if (hist_data->attrs->name) {
5463                 named_data = find_named_trigger(hist_data->attrs->name);
5464                 if (named_data) {
5465                         if (!hist_trigger_match(data, named_data, named_data,
5466                                                 true)) {
5467                                 hist_err(tr, HIST_ERR_NAMED_MISMATCH, errpos(hist_data->attrs->name));
5468                                 ret = -EINVAL;
5469                                 goto out;
5470                         }
5471                 }
5472         }
5473
5474         if (hist_data->attrs->name && !named_data)
5475                 goto new;
5476
5477         lockdep_assert_held(&event_mutex);
5478
5479         list_for_each_entry(test, &file->triggers, list) {
5480                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5481                         if (!hist_trigger_match(data, test, named_data, false))
5482                                 continue;
5483                         if (hist_data->attrs->pause)
5484                                 test->paused = true;
5485                         else if (hist_data->attrs->cont)
5486                                 test->paused = false;
5487                         else if (hist_data->attrs->clear)
5488                                 hist_clear(test);
5489                         else {
5490                                 hist_err(tr, HIST_ERR_TRIGGER_EEXIST, 0);
5491                                 ret = -EEXIST;
5492                         }
5493                         goto out;
5494                 }
5495         }
5496  new:
5497         if (hist_data->attrs->cont || hist_data->attrs->clear) {
5498                 hist_err(tr, HIST_ERR_TRIGGER_ENOENT_CLEAR, 0);
5499                 ret = -ENOENT;
5500                 goto out;
5501         }
5502
5503         if (hist_data->attrs->pause)
5504                 data->paused = true;
5505
5506         if (named_data) {
5507                 data->private_data = named_data->private_data;
5508                 set_named_trigger_data(data, named_data);
5509                 data->ops = &event_hist_trigger_named_ops;
5510         }
5511
5512         if (data->ops->init) {
5513                 ret = data->ops->init(data->ops, data);
5514                 if (ret < 0)
5515                         goto out;
5516         }
5517
5518         if (hist_data->enable_timestamps) {
5519                 char *clock = hist_data->attrs->clock;
5520
5521                 ret = tracing_set_clock(file->tr, hist_data->attrs->clock);
5522                 if (ret) {
5523                         hist_err(tr, HIST_ERR_SET_CLOCK_FAIL, errpos(clock));
5524                         goto out;
5525                 }
5526
5527                 tracing_set_filter_buffering(file->tr, true);
5528         }
5529
5530         if (named_data)
5531                 destroy_hist_data(hist_data);
5532
5533         ret++;
5534  out:
5535         return ret;
5536 }
5537
5538 static int hist_trigger_enable(struct event_trigger_data *data,
5539                                struct trace_event_file *file)
5540 {
5541         int ret = 0;
5542
5543         list_add_tail_rcu(&data->list, &file->triggers);
5544
5545         update_cond_flag(file);
5546
5547         if (trace_event_trigger_enable_disable(file, 1) < 0) {
5548                 list_del_rcu(&data->list);
5549                 update_cond_flag(file);
5550                 ret--;
5551         }
5552
5553         return ret;
5554 }
5555
5556 static bool have_hist_trigger_match(struct event_trigger_data *data,
5557                                     struct trace_event_file *file)
5558 {
5559         struct hist_trigger_data *hist_data = data->private_data;
5560         struct event_trigger_data *test, *named_data = NULL;
5561         bool match = false;
5562
5563         lockdep_assert_held(&event_mutex);
5564
5565         if (hist_data->attrs->name)
5566                 named_data = find_named_trigger(hist_data->attrs->name);
5567
5568         list_for_each_entry(test, &file->triggers, list) {
5569                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5570                         if (hist_trigger_match(data, test, named_data, false)) {
5571                                 match = true;
5572                                 break;
5573                         }
5574                 }
5575         }
5576
5577         return match;
5578 }
5579
5580 static bool hist_trigger_check_refs(struct event_trigger_data *data,
5581                                     struct trace_event_file *file)
5582 {
5583         struct hist_trigger_data *hist_data = data->private_data;
5584         struct event_trigger_data *test, *named_data = NULL;
5585
5586         lockdep_assert_held(&event_mutex);
5587
5588         if (hist_data->attrs->name)
5589                 named_data = find_named_trigger(hist_data->attrs->name);
5590
5591         list_for_each_entry(test, &file->triggers, list) {
5592                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5593                         if (!hist_trigger_match(data, test, named_data, false))
5594                                 continue;
5595                         hist_data = test->private_data;
5596                         if (check_var_refs(hist_data))
5597                                 return true;
5598                         break;
5599                 }
5600         }
5601
5602         return false;
5603 }
5604
5605 static void hist_unregister_trigger(char *glob, struct event_trigger_ops *ops,
5606                                     struct event_trigger_data *data,
5607                                     struct trace_event_file *file)
5608 {
5609         struct hist_trigger_data *hist_data = data->private_data;
5610         struct event_trigger_data *test, *named_data = NULL;
5611         bool unregistered = false;
5612
5613         lockdep_assert_held(&event_mutex);
5614
5615         if (hist_data->attrs->name)
5616                 named_data = find_named_trigger(hist_data->attrs->name);
5617
5618         list_for_each_entry(test, &file->triggers, list) {
5619                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5620                         if (!hist_trigger_match(data, test, named_data, false))
5621                                 continue;
5622                         unregistered = true;
5623                         list_del_rcu(&test->list);
5624                         trace_event_trigger_enable_disable(file, 0);
5625                         update_cond_flag(file);
5626                         break;
5627                 }
5628         }
5629
5630         if (unregistered && test->ops->free)
5631                 test->ops->free(test->ops, test);
5632
5633         if (hist_data->enable_timestamps) {
5634                 if (!hist_data->remove || unregistered)
5635                         tracing_set_filter_buffering(file->tr, false);
5636         }
5637 }
5638
5639 static bool hist_file_check_refs(struct trace_event_file *file)
5640 {
5641         struct hist_trigger_data *hist_data;
5642         struct event_trigger_data *test;
5643
5644         lockdep_assert_held(&event_mutex);
5645
5646         list_for_each_entry(test, &file->triggers, list) {
5647                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5648                         hist_data = test->private_data;
5649                         if (check_var_refs(hist_data))
5650                                 return true;
5651                 }
5652         }
5653
5654         return false;
5655 }
5656
5657 static void hist_unreg_all(struct trace_event_file *file)
5658 {
5659         struct event_trigger_data *test, *n;
5660         struct hist_trigger_data *hist_data;
5661         struct synth_event *se;
5662         const char *se_name;
5663
5664         lockdep_assert_held(&event_mutex);
5665
5666         if (hist_file_check_refs(file))
5667                 return;
5668
5669         list_for_each_entry_safe(test, n, &file->triggers, list) {
5670                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5671                         hist_data = test->private_data;
5672                         list_del_rcu(&test->list);
5673                         trace_event_trigger_enable_disable(file, 0);
5674
5675                         se_name = trace_event_name(file->event_call);
5676                         se = find_synth_event(se_name);
5677                         if (se)
5678                                 se->ref--;
5679
5680                         update_cond_flag(file);
5681                         if (hist_data->enable_timestamps)
5682                                 tracing_set_filter_buffering(file->tr, false);
5683                         if (test->ops->free)
5684                                 test->ops->free(test->ops, test);
5685                 }
5686         }
5687 }
5688
5689 static int event_hist_trigger_func(struct event_command *cmd_ops,
5690                                    struct trace_event_file *file,
5691                                    char *glob, char *cmd, char *param)
5692 {
5693         unsigned int hist_trigger_bits = TRACING_MAP_BITS_DEFAULT;
5694         struct event_trigger_data *trigger_data;
5695         struct hist_trigger_attrs *attrs;
5696         struct event_trigger_ops *trigger_ops;
5697         struct hist_trigger_data *hist_data;
5698         struct synth_event *se;
5699         const char *se_name;
5700         bool remove = false;
5701         char *trigger, *p;
5702         int ret = 0;
5703
5704         lockdep_assert_held(&event_mutex);
5705
5706         if (glob && strlen(glob)) {
5707                 hist_err_clear();
5708                 last_cmd_set(file, param);
5709         }
5710
5711         if (!param)
5712                 return -EINVAL;
5713
5714         if (glob[0] == '!')
5715                 remove = true;
5716
5717         /*
5718          * separate the trigger from the filter (k:v [if filter])
5719          * allowing for whitespace in the trigger
5720          */
5721         p = trigger = param;
5722         do {
5723                 p = strstr(p, "if");
5724                 if (!p)
5725                         break;
5726                 if (p == param)
5727                         return -EINVAL;
5728                 if (*(p - 1) != ' ' && *(p - 1) != '\t') {
5729                         p++;
5730                         continue;
5731                 }
5732                 if (p >= param + strlen(param) - (sizeof("if") - 1) - 1)
5733                         return -EINVAL;
5734                 if (*(p + sizeof("if") - 1) != ' ' && *(p + sizeof("if") - 1) != '\t') {
5735                         p++;
5736                         continue;
5737                 }
5738                 break;
5739         } while (p);
5740
5741         if (!p)
5742                 param = NULL;
5743         else {
5744                 *(p - 1) = '\0';
5745                 param = strstrip(p);
5746                 trigger = strstrip(trigger);
5747         }
5748
5749         attrs = parse_hist_trigger_attrs(file->tr, trigger);
5750         if (IS_ERR(attrs))
5751                 return PTR_ERR(attrs);
5752
5753         if (attrs->map_bits)
5754                 hist_trigger_bits = attrs->map_bits;
5755
5756         hist_data = create_hist_data(hist_trigger_bits, attrs, file, remove);
5757         if (IS_ERR(hist_data)) {
5758                 destroy_hist_trigger_attrs(attrs);
5759                 return PTR_ERR(hist_data);
5760         }
5761
5762         trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
5763
5764         trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
5765         if (!trigger_data) {
5766                 ret = -ENOMEM;
5767                 goto out_free;
5768         }
5769
5770         trigger_data->count = -1;
5771         trigger_data->ops = trigger_ops;
5772         trigger_data->cmd_ops = cmd_ops;
5773
5774         INIT_LIST_HEAD(&trigger_data->list);
5775         RCU_INIT_POINTER(trigger_data->filter, NULL);
5776
5777         trigger_data->private_data = hist_data;
5778
5779         /* if param is non-empty, it's supposed to be a filter */
5780         if (param && cmd_ops->set_filter) {
5781                 ret = cmd_ops->set_filter(param, trigger_data, file);
5782                 if (ret < 0)
5783                         goto out_free;
5784         }
5785
5786         if (remove) {
5787                 if (!have_hist_trigger_match(trigger_data, file))
5788                         goto out_free;
5789
5790                 if (hist_trigger_check_refs(trigger_data, file)) {
5791                         ret = -EBUSY;
5792                         goto out_free;
5793                 }
5794
5795                 cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
5796                 se_name = trace_event_name(file->event_call);
5797                 se = find_synth_event(se_name);
5798                 if (se)
5799                         se->ref--;
5800                 ret = 0;
5801                 goto out_free;
5802         }
5803
5804         ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
5805         /*
5806          * The above returns on success the # of triggers registered,
5807          * but if it didn't register any it returns zero.  Consider no
5808          * triggers registered a failure too.
5809          */
5810         if (!ret) {
5811                 if (!(attrs->pause || attrs->cont || attrs->clear))
5812                         ret = -ENOENT;
5813                 goto out_free;
5814         } else if (ret < 0)
5815                 goto out_free;
5816
5817         if (get_named_trigger_data(trigger_data))
5818                 goto enable;
5819
5820         if (has_hist_vars(hist_data))
5821                 save_hist_vars(hist_data);
5822
5823         ret = create_actions(hist_data);
5824         if (ret)
5825                 goto out_unreg;
5826
5827         ret = tracing_map_init(hist_data->map);
5828         if (ret)
5829                 goto out_unreg;
5830 enable:
5831         ret = hist_trigger_enable(trigger_data, file);
5832         if (ret)
5833                 goto out_unreg;
5834
5835         se_name = trace_event_name(file->event_call);
5836         se = find_synth_event(se_name);
5837         if (se)
5838                 se->ref++;
5839         /* Just return zero, not the number of registered triggers */
5840         ret = 0;
5841  out:
5842         if (ret == 0)
5843                 hist_err_clear();
5844
5845         return ret;
5846  out_unreg:
5847         cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
5848  out_free:
5849         if (cmd_ops->set_filter)
5850                 cmd_ops->set_filter(NULL, trigger_data, NULL);
5851
5852         remove_hist_vars(hist_data);
5853
5854         kfree(trigger_data);
5855
5856         destroy_hist_data(hist_data);
5857         goto out;
5858 }
5859
5860 static struct event_command trigger_hist_cmd = {
5861         .name                   = "hist",
5862         .trigger_type           = ETT_EVENT_HIST,
5863         .flags                  = EVENT_CMD_FL_NEEDS_REC,
5864         .func                   = event_hist_trigger_func,
5865         .reg                    = hist_register_trigger,
5866         .unreg                  = hist_unregister_trigger,
5867         .unreg_all              = hist_unreg_all,
5868         .get_trigger_ops        = event_hist_get_trigger_ops,
5869         .set_filter             = set_trigger_filter,
5870 };
5871
5872 __init int register_trigger_hist_cmd(void)
5873 {
5874         int ret;
5875
5876         ret = register_event_command(&trigger_hist_cmd);
5877         WARN_ON(ret < 0);
5878
5879         return ret;
5880 }
5881
5882 static void
5883 hist_enable_trigger(struct event_trigger_data *data,
5884                     struct trace_buffer *buffer,  void *rec,
5885                     struct ring_buffer_event *event)
5886 {
5887         struct enable_trigger_data *enable_data = data->private_data;
5888         struct event_trigger_data *test;
5889
5890         list_for_each_entry_rcu(test, &enable_data->file->triggers, list,
5891                                 lockdep_is_held(&event_mutex)) {
5892                 if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) {
5893                         if (enable_data->enable)
5894                                 test->paused = false;
5895                         else
5896                                 test->paused = true;
5897                 }
5898         }
5899 }
5900
5901 static void
5902 hist_enable_count_trigger(struct event_trigger_data *data,
5903                           struct trace_buffer *buffer,  void *rec,
5904                           struct ring_buffer_event *event)
5905 {
5906         if (!data->count)
5907                 return;
5908
5909         if (data->count != -1)
5910                 (data->count)--;
5911
5912         hist_enable_trigger(data, buffer, rec, event);
5913 }
5914
5915 static struct event_trigger_ops hist_enable_trigger_ops = {
5916         .func                   = hist_enable_trigger,
5917         .print                  = event_enable_trigger_print,
5918         .init                   = event_trigger_init,
5919         .free                   = event_enable_trigger_free,
5920 };
5921
5922 static struct event_trigger_ops hist_enable_count_trigger_ops = {
5923         .func                   = hist_enable_count_trigger,
5924         .print                  = event_enable_trigger_print,
5925         .init                   = event_trigger_init,
5926         .free                   = event_enable_trigger_free,
5927 };
5928
5929 static struct event_trigger_ops hist_disable_trigger_ops = {
5930         .func                   = hist_enable_trigger,
5931         .print                  = event_enable_trigger_print,
5932         .init                   = event_trigger_init,
5933         .free                   = event_enable_trigger_free,
5934 };
5935
5936 static struct event_trigger_ops hist_disable_count_trigger_ops = {
5937         .func                   = hist_enable_count_trigger,
5938         .print                  = event_enable_trigger_print,
5939         .init                   = event_trigger_init,
5940         .free                   = event_enable_trigger_free,
5941 };
5942
5943 static struct event_trigger_ops *
5944 hist_enable_get_trigger_ops(char *cmd, char *param)
5945 {
5946         struct event_trigger_ops *ops;
5947         bool enable;
5948
5949         enable = (strcmp(cmd, ENABLE_HIST_STR) == 0);
5950
5951         if (enable)
5952                 ops = param ? &hist_enable_count_trigger_ops :
5953                         &hist_enable_trigger_ops;
5954         else
5955                 ops = param ? &hist_disable_count_trigger_ops :
5956                         &hist_disable_trigger_ops;
5957
5958         return ops;
5959 }
5960
5961 static void hist_enable_unreg_all(struct trace_event_file *file)
5962 {
5963         struct event_trigger_data *test, *n;
5964
5965         list_for_each_entry_safe(test, n, &file->triggers, list) {
5966                 if (test->cmd_ops->trigger_type == ETT_HIST_ENABLE) {
5967                         list_del_rcu(&test->list);
5968                         update_cond_flag(file);
5969                         trace_event_trigger_enable_disable(file, 0);
5970                         if (test->ops->free)
5971                                 test->ops->free(test->ops, test);
5972                 }
5973         }
5974 }
5975
5976 static struct event_command trigger_hist_enable_cmd = {
5977         .name                   = ENABLE_HIST_STR,
5978         .trigger_type           = ETT_HIST_ENABLE,
5979         .func                   = event_enable_trigger_func,
5980         .reg                    = event_enable_register_trigger,
5981         .unreg                  = event_enable_unregister_trigger,
5982         .unreg_all              = hist_enable_unreg_all,
5983         .get_trigger_ops        = hist_enable_get_trigger_ops,
5984         .set_filter             = set_trigger_filter,
5985 };
5986
5987 static struct event_command trigger_hist_disable_cmd = {
5988         .name                   = DISABLE_HIST_STR,
5989         .trigger_type           = ETT_HIST_ENABLE,
5990         .func                   = event_enable_trigger_func,
5991         .reg                    = event_enable_register_trigger,
5992         .unreg                  = event_enable_unregister_trigger,
5993         .unreg_all              = hist_enable_unreg_all,
5994         .get_trigger_ops        = hist_enable_get_trigger_ops,
5995         .set_filter             = set_trigger_filter,
5996 };
5997
5998 static __init void unregister_trigger_hist_enable_disable_cmds(void)
5999 {
6000         unregister_event_command(&trigger_hist_enable_cmd);
6001         unregister_event_command(&trigger_hist_disable_cmd);
6002 }
6003
6004 __init int register_trigger_hist_enable_disable_cmds(void)
6005 {
6006         int ret;
6007
6008         ret = register_event_command(&trigger_hist_enable_cmd);
6009         if (WARN_ON(ret < 0))
6010                 return ret;
6011         ret = register_event_command(&trigger_hist_disable_cmd);
6012         if (WARN_ON(ret < 0))
6013                 unregister_trigger_hist_enable_disable_cmds();
6014
6015         return ret;
6016 }