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