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