1 /*
2  * trace_events_filter - generic event filtering
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  *
18  * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
19  */
20 
21 #include <linux/module.h>
22 #include <linux/ctype.h>
23 #include <linux/mutex.h>
24 #include <linux/perf_event.h>
25 #include <linux/slab.h>
26 
27 #include "trace.h"
28 #include "trace_output.h"
29 
30 #define DEFAULT_SYS_FILTER_MESSAGE					\
31 	"### global filter ###\n"					\
32 	"# Use this to set filters for multiple events.\n"		\
33 	"# Only events with the given fields will be affected.\n"	\
34 	"# If no events are modified, an error message will be displayed here"
35 
36 enum filter_op_ids
37 {
38 	OP_OR,
39 	OP_AND,
40 	OP_GLOB,
41 	OP_NE,
42 	OP_EQ,
43 	OP_LT,
44 	OP_LE,
45 	OP_GT,
46 	OP_GE,
47 	OP_BAND,
48 	OP_NOT,
49 	OP_NONE,
50 	OP_OPEN_PAREN,
51 };
52 
53 struct filter_op {
54 	int id;
55 	char *string;
56 	int precedence;
57 };
58 
59 /* Order must be the same as enum filter_op_ids above */
60 static struct filter_op filter_ops[] = {
61 	{ OP_OR,	"||",		1 },
62 	{ OP_AND,	"&&",		2 },
63 	{ OP_GLOB,	"~",		4 },
64 	{ OP_NE,	"!=",		4 },
65 	{ OP_EQ,	"==",		4 },
66 	{ OP_LT,	"<",		5 },
67 	{ OP_LE,	"<=",		5 },
68 	{ OP_GT,	">",		5 },
69 	{ OP_GE,	">=",		5 },
70 	{ OP_BAND,	"&",		6 },
71 	{ OP_NOT,	"!",		6 },
72 	{ OP_NONE,	"OP_NONE",	0 },
73 	{ OP_OPEN_PAREN, "(",		0 },
74 };
75 
76 enum {
77 	FILT_ERR_NONE,
78 	FILT_ERR_INVALID_OP,
79 	FILT_ERR_UNBALANCED_PAREN,
80 	FILT_ERR_TOO_MANY_OPERANDS,
81 	FILT_ERR_OPERAND_TOO_LONG,
82 	FILT_ERR_FIELD_NOT_FOUND,
83 	FILT_ERR_ILLEGAL_FIELD_OP,
84 	FILT_ERR_ILLEGAL_INTVAL,
85 	FILT_ERR_BAD_SUBSYS_FILTER,
86 	FILT_ERR_TOO_MANY_PREDS,
87 	FILT_ERR_MISSING_FIELD,
88 	FILT_ERR_INVALID_FILTER,
89 	FILT_ERR_IP_FIELD_ONLY,
90 	FILT_ERR_ILLEGAL_NOT_OP,
91 };
92 
93 static char *err_text[] = {
94 	"No error",
95 	"Invalid operator",
96 	"Unbalanced parens",
97 	"Too many operands",
98 	"Operand too long",
99 	"Field not found",
100 	"Illegal operation for field type",
101 	"Illegal integer value",
102 	"Couldn't find or set field in one of a subsystem's events",
103 	"Too many terms in predicate expression",
104 	"Missing field name and/or value",
105 	"Meaningless filter expression",
106 	"Only 'ip' field is supported for function trace",
107 	"Illegal use of '!'",
108 };
109 
110 struct opstack_op {
111 	int op;
112 	struct list_head list;
113 };
114 
115 struct postfix_elt {
116 	int op;
117 	char *operand;
118 	struct list_head list;
119 };
120 
121 struct filter_parse_state {
122 	struct filter_op *ops;
123 	struct list_head opstack;
124 	struct list_head postfix;
125 	int lasterr;
126 	int lasterr_pos;
127 
128 	struct {
129 		char *string;
130 		unsigned int cnt;
131 		unsigned int tail;
132 	} infix;
133 
134 	struct {
135 		char string[MAX_FILTER_STR_VAL];
136 		int pos;
137 		unsigned int tail;
138 	} operand;
139 };
140 
141 struct pred_stack {
142 	struct filter_pred	**preds;
143 	int			index;
144 };
145 
146 /* If not of not match is equal to not of not, then it is a match */
147 #define DEFINE_COMPARISON_PRED(type)					\
148 static int filter_pred_##type(struct filter_pred *pred, void *event)	\
149 {									\
150 	type *addr = (type *)(event + pred->offset);			\
151 	type val = (type)pred->val;					\
152 	int match = 0;							\
153 									\
154 	switch (pred->op) {						\
155 	case OP_LT:							\
156 		match = (*addr < val);					\
157 		break;							\
158 	case OP_LE:							\
159 		match = (*addr <= val);					\
160 		break;							\
161 	case OP_GT:							\
162 		match = (*addr > val);					\
163 		break;							\
164 	case OP_GE:							\
165 		match = (*addr >= val);					\
166 		break;							\
167 	case OP_BAND:							\
168 		match = (*addr & val);					\
169 		break;							\
170 	default:							\
171 		break;							\
172 	}								\
173 									\
174 	return !!match == !pred->not;					\
175 }
176 
177 #define DEFINE_EQUALITY_PRED(size)					\
178 static int filter_pred_##size(struct filter_pred *pred, void *event)	\
179 {									\
180 	u##size *addr = (u##size *)(event + pred->offset);		\
181 	u##size val = (u##size)pred->val;				\
182 	int match;							\
183 									\
184 	match = (val == *addr) ^ pred->not;				\
185 									\
186 	return match;							\
187 }
188 
189 DEFINE_COMPARISON_PRED(s64);
190 DEFINE_COMPARISON_PRED(u64);
191 DEFINE_COMPARISON_PRED(s32);
192 DEFINE_COMPARISON_PRED(u32);
193 DEFINE_COMPARISON_PRED(s16);
194 DEFINE_COMPARISON_PRED(u16);
195 DEFINE_COMPARISON_PRED(s8);
196 DEFINE_COMPARISON_PRED(u8);
197 
198 DEFINE_EQUALITY_PRED(64);
199 DEFINE_EQUALITY_PRED(32);
200 DEFINE_EQUALITY_PRED(16);
201 DEFINE_EQUALITY_PRED(8);
202 
203 /* Filter predicate for fixed sized arrays of characters */
filter_pred_string(struct filter_pred * pred,void * event)204 static int filter_pred_string(struct filter_pred *pred, void *event)
205 {
206 	char *addr = (char *)(event + pred->offset);
207 	int cmp, match;
208 
209 	cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
210 
211 	match = cmp ^ pred->not;
212 
213 	return match;
214 }
215 
216 /* Filter predicate for char * pointers */
filter_pred_pchar(struct filter_pred * pred,void * event)217 static int filter_pred_pchar(struct filter_pred *pred, void *event)
218 {
219 	char **addr = (char **)(event + pred->offset);
220 	int cmp, match;
221 	int len = strlen(*addr) + 1;	/* including tailing '\0' */
222 
223 	cmp = pred->regex.match(*addr, &pred->regex, len);
224 
225 	match = cmp ^ pred->not;
226 
227 	return match;
228 }
229 
230 /*
231  * Filter predicate for dynamic sized arrays of characters.
232  * These are implemented through a list of strings at the end
233  * of the entry.
234  * Also each of these strings have a field in the entry which
235  * contains its offset from the beginning of the entry.
236  * We have then first to get this field, dereference it
237  * and add it to the address of the entry, and at last we have
238  * the address of the string.
239  */
filter_pred_strloc(struct filter_pred * pred,void * event)240 static int filter_pred_strloc(struct filter_pred *pred, void *event)
241 {
242 	u32 str_item = *(u32 *)(event + pred->offset);
243 	int str_loc = str_item & 0xffff;
244 	int str_len = str_item >> 16;
245 	char *addr = (char *)(event + str_loc);
246 	int cmp, match;
247 
248 	cmp = pred->regex.match(addr, &pred->regex, str_len);
249 
250 	match = cmp ^ pred->not;
251 
252 	return match;
253 }
254 
255 /* Filter predicate for CPUs. */
filter_pred_cpu(struct filter_pred * pred,void * event)256 static int filter_pred_cpu(struct filter_pred *pred, void *event)
257 {
258 	int cpu, cmp;
259 	int match = 0;
260 
261 	cpu = raw_smp_processor_id();
262 	cmp = pred->val;
263 
264 	switch (pred->op) {
265 	case OP_EQ:
266 		match = cpu == cmp;
267 		break;
268 	case OP_LT:
269 		match = cpu < cmp;
270 		break;
271 	case OP_LE:
272 		match = cpu <= cmp;
273 		break;
274 	case OP_GT:
275 		match = cpu > cmp;
276 		break;
277 	case OP_GE:
278 		match = cpu >= cmp;
279 		break;
280 	default:
281 		break;
282 	}
283 
284 	return !!match == !pred->not;
285 }
286 
287 /* Filter predicate for COMM. */
filter_pred_comm(struct filter_pred * pred,void * event)288 static int filter_pred_comm(struct filter_pred *pred, void *event)
289 {
290 	int cmp, match;
291 
292 	cmp = pred->regex.match(current->comm, &pred->regex,
293 				pred->regex.field_len);
294 	match = cmp ^ pred->not;
295 
296 	return match;
297 }
298 
filter_pred_none(struct filter_pred * pred,void * event)299 static int filter_pred_none(struct filter_pred *pred, void *event)
300 {
301 	return 0;
302 }
303 
304 /*
305  * regex_match_foo - Basic regex callbacks
306  *
307  * @str: the string to be searched
308  * @r:   the regex structure containing the pattern string
309  * @len: the length of the string to be searched (including '\0')
310  *
311  * Note:
312  * - @str might not be NULL-terminated if it's of type DYN_STRING
313  *   or STATIC_STRING
314  */
315 
regex_match_full(char * str,struct regex * r,int len)316 static int regex_match_full(char *str, struct regex *r, int len)
317 {
318 	if (strncmp(str, r->pattern, len) == 0)
319 		return 1;
320 	return 0;
321 }
322 
regex_match_front(char * str,struct regex * r,int len)323 static int regex_match_front(char *str, struct regex *r, int len)
324 {
325 	if (strncmp(str, r->pattern, r->len) == 0)
326 		return 1;
327 	return 0;
328 }
329 
regex_match_middle(char * str,struct regex * r,int len)330 static int regex_match_middle(char *str, struct regex *r, int len)
331 {
332 	if (strnstr(str, r->pattern, len))
333 		return 1;
334 	return 0;
335 }
336 
regex_match_end(char * str,struct regex * r,int len)337 static int regex_match_end(char *str, struct regex *r, int len)
338 {
339 	int strlen = len - 1;
340 
341 	if (strlen >= r->len &&
342 	    memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
343 		return 1;
344 	return 0;
345 }
346 
347 /**
348  * filter_parse_regex - parse a basic regex
349  * @buff:   the raw regex
350  * @len:    length of the regex
351  * @search: will point to the beginning of the string to compare
352  * @not:    tell whether the match will have to be inverted
353  *
354  * This passes in a buffer containing a regex and this function will
355  * set search to point to the search part of the buffer and
356  * return the type of search it is (see enum above).
357  * This does modify buff.
358  *
359  * Returns enum type.
360  *  search returns the pointer to use for comparison.
361  *  not returns 1 if buff started with a '!'
362  *     0 otherwise.
363  */
filter_parse_regex(char * buff,int len,char ** search,int * not)364 enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
365 {
366 	int type = MATCH_FULL;
367 	int i;
368 
369 	if (buff[0] == '!') {
370 		*not = 1;
371 		buff++;
372 		len--;
373 	} else
374 		*not = 0;
375 
376 	*search = buff;
377 
378 	for (i = 0; i < len; i++) {
379 		if (buff[i] == '*') {
380 			if (!i) {
381 				*search = buff + 1;
382 				type = MATCH_END_ONLY;
383 			} else {
384 				if (type == MATCH_END_ONLY)
385 					type = MATCH_MIDDLE_ONLY;
386 				else
387 					type = MATCH_FRONT_ONLY;
388 				buff[i] = 0;
389 				break;
390 			}
391 		}
392 	}
393 
394 	return type;
395 }
396 
filter_build_regex(struct filter_pred * pred)397 static void filter_build_regex(struct filter_pred *pred)
398 {
399 	struct regex *r = &pred->regex;
400 	char *search;
401 	enum regex_type type = MATCH_FULL;
402 	int not = 0;
403 
404 	if (pred->op == OP_GLOB) {
405 		type = filter_parse_regex(r->pattern, r->len, &search, &not);
406 		r->len = strlen(search);
407 		memmove(r->pattern, search, r->len+1);
408 	}
409 
410 	switch (type) {
411 	case MATCH_FULL:
412 		r->match = regex_match_full;
413 		break;
414 	case MATCH_FRONT_ONLY:
415 		r->match = regex_match_front;
416 		break;
417 	case MATCH_MIDDLE_ONLY:
418 		r->match = regex_match_middle;
419 		break;
420 	case MATCH_END_ONLY:
421 		r->match = regex_match_end;
422 		break;
423 	}
424 
425 	pred->not ^= not;
426 }
427 
428 enum move_type {
429 	MOVE_DOWN,
430 	MOVE_UP_FROM_LEFT,
431 	MOVE_UP_FROM_RIGHT
432 };
433 
434 static struct filter_pred *
get_pred_parent(struct filter_pred * pred,struct filter_pred * preds,int index,enum move_type * move)435 get_pred_parent(struct filter_pred *pred, struct filter_pred *preds,
436 		int index, enum move_type *move)
437 {
438 	if (pred->parent & FILTER_PRED_IS_RIGHT)
439 		*move = MOVE_UP_FROM_RIGHT;
440 	else
441 		*move = MOVE_UP_FROM_LEFT;
442 	pred = &preds[pred->parent & ~FILTER_PRED_IS_RIGHT];
443 
444 	return pred;
445 }
446 
447 enum walk_return {
448 	WALK_PRED_ABORT,
449 	WALK_PRED_PARENT,
450 	WALK_PRED_DEFAULT,
451 };
452 
453 typedef int (*filter_pred_walkcb_t) (enum move_type move,
454 				     struct filter_pred *pred,
455 				     int *err, void *data);
456 
walk_pred_tree(struct filter_pred * preds,struct filter_pred * root,filter_pred_walkcb_t cb,void * data)457 static int walk_pred_tree(struct filter_pred *preds,
458 			  struct filter_pred *root,
459 			  filter_pred_walkcb_t cb, void *data)
460 {
461 	struct filter_pred *pred = root;
462 	enum move_type move = MOVE_DOWN;
463 	int done = 0;
464 
465 	if  (!preds)
466 		return -EINVAL;
467 
468 	do {
469 		int err = 0, ret;
470 
471 		ret = cb(move, pred, &err, data);
472 		if (ret == WALK_PRED_ABORT)
473 			return err;
474 		if (ret == WALK_PRED_PARENT)
475 			goto get_parent;
476 
477 		switch (move) {
478 		case MOVE_DOWN:
479 			if (pred->left != FILTER_PRED_INVALID) {
480 				pred = &preds[pred->left];
481 				continue;
482 			}
483 			goto get_parent;
484 		case MOVE_UP_FROM_LEFT:
485 			pred = &preds[pred->right];
486 			move = MOVE_DOWN;
487 			continue;
488 		case MOVE_UP_FROM_RIGHT:
489  get_parent:
490 			if (pred == root)
491 				break;
492 			pred = get_pred_parent(pred, preds,
493 					       pred->parent,
494 					       &move);
495 			continue;
496 		}
497 		done = 1;
498 	} while (!done);
499 
500 	/* We are fine. */
501 	return 0;
502 }
503 
504 /*
505  * A series of AND or ORs where found together. Instead of
506  * climbing up and down the tree branches, an array of the
507  * ops were made in order of checks. We can just move across
508  * the array and short circuit if needed.
509  */
process_ops(struct filter_pred * preds,struct filter_pred * op,void * rec)510 static int process_ops(struct filter_pred *preds,
511 		       struct filter_pred *op, void *rec)
512 {
513 	struct filter_pred *pred;
514 	int match = 0;
515 	int type;
516 	int i;
517 
518 	/*
519 	 * Micro-optimization: We set type to true if op
520 	 * is an OR and false otherwise (AND). Then we
521 	 * just need to test if the match is equal to
522 	 * the type, and if it is, we can short circuit the
523 	 * rest of the checks:
524 	 *
525 	 * if ((match && op->op == OP_OR) ||
526 	 *     (!match && op->op == OP_AND))
527 	 *	  return match;
528 	 */
529 	type = op->op == OP_OR;
530 
531 	for (i = 0; i < op->val; i++) {
532 		pred = &preds[op->ops[i]];
533 		if (!WARN_ON_ONCE(!pred->fn))
534 			match = pred->fn(pred, rec);
535 		if (!!match == type)
536 			break;
537 	}
538 	/* If not of not match is equal to not of not, then it is a match */
539 	return !!match == !op->not;
540 }
541 
542 struct filter_match_preds_data {
543 	struct filter_pred *preds;
544 	int match;
545 	void *rec;
546 };
547 
filter_match_preds_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)548 static int filter_match_preds_cb(enum move_type move, struct filter_pred *pred,
549 				 int *err, void *data)
550 {
551 	struct filter_match_preds_data *d = data;
552 
553 	*err = 0;
554 	switch (move) {
555 	case MOVE_DOWN:
556 		/* only AND and OR have children */
557 		if (pred->left != FILTER_PRED_INVALID) {
558 			/* If ops is set, then it was folded. */
559 			if (!pred->ops)
560 				return WALK_PRED_DEFAULT;
561 			/* We can treat folded ops as a leaf node */
562 			d->match = process_ops(d->preds, pred, d->rec);
563 		} else {
564 			if (!WARN_ON_ONCE(!pred->fn))
565 				d->match = pred->fn(pred, d->rec);
566 		}
567 
568 		return WALK_PRED_PARENT;
569 	case MOVE_UP_FROM_LEFT:
570 		/*
571 		 * Check for short circuits.
572 		 *
573 		 * Optimization: !!match == (pred->op == OP_OR)
574 		 *   is the same as:
575 		 * if ((match && pred->op == OP_OR) ||
576 		 *     (!match && pred->op == OP_AND))
577 		 */
578 		if (!!d->match == (pred->op == OP_OR))
579 			return WALK_PRED_PARENT;
580 		break;
581 	case MOVE_UP_FROM_RIGHT:
582 		break;
583 	}
584 
585 	return WALK_PRED_DEFAULT;
586 }
587 
588 /* return 1 if event matches, 0 otherwise (discard) */
filter_match_preds(struct event_filter * filter,void * rec)589 int filter_match_preds(struct event_filter *filter, void *rec)
590 {
591 	struct filter_pred *preds;
592 	struct filter_pred *root;
593 	struct filter_match_preds_data data = {
594 		/* match is currently meaningless */
595 		.match = -1,
596 		.rec   = rec,
597 	};
598 	int n_preds, ret;
599 
600 	/* no filter is considered a match */
601 	if (!filter)
602 		return 1;
603 
604 	n_preds = filter->n_preds;
605 	if (!n_preds)
606 		return 1;
607 
608 	/*
609 	 * n_preds, root and filter->preds are protect with preemption disabled.
610 	 */
611 	root = rcu_dereference_sched(filter->root);
612 	if (!root)
613 		return 1;
614 
615 	data.preds = preds = rcu_dereference_sched(filter->preds);
616 	ret = walk_pred_tree(preds, root, filter_match_preds_cb, &data);
617 	WARN_ON(ret);
618 	return data.match;
619 }
620 EXPORT_SYMBOL_GPL(filter_match_preds);
621 
parse_error(struct filter_parse_state * ps,int err,int pos)622 static void parse_error(struct filter_parse_state *ps, int err, int pos)
623 {
624 	ps->lasterr = err;
625 	ps->lasterr_pos = pos;
626 }
627 
remove_filter_string(struct event_filter * filter)628 static void remove_filter_string(struct event_filter *filter)
629 {
630 	if (!filter)
631 		return;
632 
633 	kfree(filter->filter_string);
634 	filter->filter_string = NULL;
635 }
636 
replace_filter_string(struct event_filter * filter,char * filter_string)637 static int replace_filter_string(struct event_filter *filter,
638 				 char *filter_string)
639 {
640 	kfree(filter->filter_string);
641 	filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
642 	if (!filter->filter_string)
643 		return -ENOMEM;
644 
645 	return 0;
646 }
647 
append_filter_string(struct event_filter * filter,char * string)648 static int append_filter_string(struct event_filter *filter,
649 				char *string)
650 {
651 	int newlen;
652 	char *new_filter_string;
653 
654 	BUG_ON(!filter->filter_string);
655 	newlen = strlen(filter->filter_string) + strlen(string) + 1;
656 	new_filter_string = kmalloc(newlen, GFP_KERNEL);
657 	if (!new_filter_string)
658 		return -ENOMEM;
659 
660 	strcpy(new_filter_string, filter->filter_string);
661 	strcat(new_filter_string, string);
662 	kfree(filter->filter_string);
663 	filter->filter_string = new_filter_string;
664 
665 	return 0;
666 }
667 
append_filter_err(struct filter_parse_state * ps,struct event_filter * filter)668 static void append_filter_err(struct filter_parse_state *ps,
669 			      struct event_filter *filter)
670 {
671 	int pos = ps->lasterr_pos;
672 	char *buf, *pbuf;
673 
674 	buf = (char *)__get_free_page(GFP_TEMPORARY);
675 	if (!buf)
676 		return;
677 
678 	append_filter_string(filter, "\n");
679 	memset(buf, ' ', PAGE_SIZE);
680 	if (pos > PAGE_SIZE - 128)
681 		pos = 0;
682 	buf[pos] = '^';
683 	pbuf = &buf[pos] + 1;
684 
685 	sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
686 	append_filter_string(filter, buf);
687 	free_page((unsigned long) buf);
688 }
689 
event_filter(struct trace_event_file * file)690 static inline struct event_filter *event_filter(struct trace_event_file *file)
691 {
692 	if (file->event_call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
693 		return file->event_call->filter;
694 	else
695 		return file->filter;
696 }
697 
698 /* caller must hold event_mutex */
print_event_filter(struct trace_event_file * file,struct trace_seq * s)699 void print_event_filter(struct trace_event_file *file, struct trace_seq *s)
700 {
701 	struct event_filter *filter = event_filter(file);
702 
703 	if (filter && filter->filter_string)
704 		trace_seq_printf(s, "%s\n", filter->filter_string);
705 	else
706 		trace_seq_puts(s, "none\n");
707 }
708 
print_subsystem_event_filter(struct event_subsystem * system,struct trace_seq * s)709 void print_subsystem_event_filter(struct event_subsystem *system,
710 				  struct trace_seq *s)
711 {
712 	struct event_filter *filter;
713 
714 	mutex_lock(&event_mutex);
715 	filter = system->filter;
716 	if (filter && filter->filter_string)
717 		trace_seq_printf(s, "%s\n", filter->filter_string);
718 	else
719 		trace_seq_puts(s, DEFAULT_SYS_FILTER_MESSAGE "\n");
720 	mutex_unlock(&event_mutex);
721 }
722 
__alloc_pred_stack(struct pred_stack * stack,int n_preds)723 static int __alloc_pred_stack(struct pred_stack *stack, int n_preds)
724 {
725 	stack->preds = kcalloc(n_preds + 1, sizeof(*stack->preds), GFP_KERNEL);
726 	if (!stack->preds)
727 		return -ENOMEM;
728 	stack->index = n_preds;
729 	return 0;
730 }
731 
__free_pred_stack(struct pred_stack * stack)732 static void __free_pred_stack(struct pred_stack *stack)
733 {
734 	kfree(stack->preds);
735 	stack->index = 0;
736 }
737 
__push_pred_stack(struct pred_stack * stack,struct filter_pred * pred)738 static int __push_pred_stack(struct pred_stack *stack,
739 			     struct filter_pred *pred)
740 {
741 	int index = stack->index;
742 
743 	if (WARN_ON(index == 0))
744 		return -ENOSPC;
745 
746 	stack->preds[--index] = pred;
747 	stack->index = index;
748 	return 0;
749 }
750 
751 static struct filter_pred *
__pop_pred_stack(struct pred_stack * stack)752 __pop_pred_stack(struct pred_stack *stack)
753 {
754 	struct filter_pred *pred;
755 	int index = stack->index;
756 
757 	pred = stack->preds[index++];
758 	if (!pred)
759 		return NULL;
760 
761 	stack->index = index;
762 	return pred;
763 }
764 
filter_set_pred(struct event_filter * filter,int idx,struct pred_stack * stack,struct filter_pred * src)765 static int filter_set_pred(struct event_filter *filter,
766 			   int idx,
767 			   struct pred_stack *stack,
768 			   struct filter_pred *src)
769 {
770 	struct filter_pred *dest = &filter->preds[idx];
771 	struct filter_pred *left;
772 	struct filter_pred *right;
773 
774 	*dest = *src;
775 	dest->index = idx;
776 
777 	if (dest->op == OP_OR || dest->op == OP_AND) {
778 		right = __pop_pred_stack(stack);
779 		left = __pop_pred_stack(stack);
780 		if (!left || !right)
781 			return -EINVAL;
782 		/*
783 		 * If both children can be folded
784 		 * and they are the same op as this op or a leaf,
785 		 * then this op can be folded.
786 		 */
787 		if (left->index & FILTER_PRED_FOLD &&
788 		    ((left->op == dest->op && !left->not) ||
789 		     left->left == FILTER_PRED_INVALID) &&
790 		    right->index & FILTER_PRED_FOLD &&
791 		    ((right->op == dest->op && !right->not) ||
792 		     right->left == FILTER_PRED_INVALID))
793 			dest->index |= FILTER_PRED_FOLD;
794 
795 		dest->left = left->index & ~FILTER_PRED_FOLD;
796 		dest->right = right->index & ~FILTER_PRED_FOLD;
797 		left->parent = dest->index & ~FILTER_PRED_FOLD;
798 		right->parent = dest->index | FILTER_PRED_IS_RIGHT;
799 	} else {
800 		/*
801 		 * Make dest->left invalid to be used as a quick
802 		 * way to know this is a leaf node.
803 		 */
804 		dest->left = FILTER_PRED_INVALID;
805 
806 		/* All leafs allow folding the parent ops. */
807 		dest->index |= FILTER_PRED_FOLD;
808 	}
809 
810 	return __push_pred_stack(stack, dest);
811 }
812 
__free_preds(struct event_filter * filter)813 static void __free_preds(struct event_filter *filter)
814 {
815 	int i;
816 
817 	if (filter->preds) {
818 		for (i = 0; i < filter->n_preds; i++)
819 			kfree(filter->preds[i].ops);
820 		kfree(filter->preds);
821 		filter->preds = NULL;
822 	}
823 	filter->a_preds = 0;
824 	filter->n_preds = 0;
825 }
826 
filter_disable(struct trace_event_file * file)827 static void filter_disable(struct trace_event_file *file)
828 {
829 	struct trace_event_call *call = file->event_call;
830 
831 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
832 		call->flags &= ~TRACE_EVENT_FL_FILTERED;
833 	else
834 		file->flags &= ~EVENT_FILE_FL_FILTERED;
835 }
836 
__free_filter(struct event_filter * filter)837 static void __free_filter(struct event_filter *filter)
838 {
839 	if (!filter)
840 		return;
841 
842 	__free_preds(filter);
843 	kfree(filter->filter_string);
844 	kfree(filter);
845 }
846 
free_event_filter(struct event_filter * filter)847 void free_event_filter(struct event_filter *filter)
848 {
849 	__free_filter(filter);
850 }
851 
__alloc_filter(void)852 static struct event_filter *__alloc_filter(void)
853 {
854 	struct event_filter *filter;
855 
856 	filter = kzalloc(sizeof(*filter), GFP_KERNEL);
857 	return filter;
858 }
859 
__alloc_preds(struct event_filter * filter,int n_preds)860 static int __alloc_preds(struct event_filter *filter, int n_preds)
861 {
862 	struct filter_pred *pred;
863 	int i;
864 
865 	if (filter->preds)
866 		__free_preds(filter);
867 
868 	filter->preds = kcalloc(n_preds, sizeof(*filter->preds), GFP_KERNEL);
869 
870 	if (!filter->preds)
871 		return -ENOMEM;
872 
873 	filter->a_preds = n_preds;
874 	filter->n_preds = 0;
875 
876 	for (i = 0; i < n_preds; i++) {
877 		pred = &filter->preds[i];
878 		pred->fn = filter_pred_none;
879 	}
880 
881 	return 0;
882 }
883 
__remove_filter(struct trace_event_file * file)884 static inline void __remove_filter(struct trace_event_file *file)
885 {
886 	struct trace_event_call *call = file->event_call;
887 
888 	filter_disable(file);
889 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
890 		remove_filter_string(call->filter);
891 	else
892 		remove_filter_string(file->filter);
893 }
894 
filter_free_subsystem_preds(struct trace_subsystem_dir * dir,struct trace_array * tr)895 static void filter_free_subsystem_preds(struct trace_subsystem_dir *dir,
896 					struct trace_array *tr)
897 {
898 	struct trace_event_file *file;
899 
900 	list_for_each_entry(file, &tr->events, list) {
901 		if (file->system != dir)
902 			continue;
903 		__remove_filter(file);
904 	}
905 }
906 
__free_subsystem_filter(struct trace_event_file * file)907 static inline void __free_subsystem_filter(struct trace_event_file *file)
908 {
909 	struct trace_event_call *call = file->event_call;
910 
911 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER) {
912 		__free_filter(call->filter);
913 		call->filter = NULL;
914 	} else {
915 		__free_filter(file->filter);
916 		file->filter = NULL;
917 	}
918 }
919 
filter_free_subsystem_filters(struct trace_subsystem_dir * dir,struct trace_array * tr)920 static void filter_free_subsystem_filters(struct trace_subsystem_dir *dir,
921 					  struct trace_array *tr)
922 {
923 	struct trace_event_file *file;
924 
925 	list_for_each_entry(file, &tr->events, list) {
926 		if (file->system != dir)
927 			continue;
928 		__free_subsystem_filter(file);
929 	}
930 }
931 
filter_add_pred(struct filter_parse_state * ps,struct event_filter * filter,struct filter_pred * pred,struct pred_stack * stack)932 static int filter_add_pred(struct filter_parse_state *ps,
933 			   struct event_filter *filter,
934 			   struct filter_pred *pred,
935 			   struct pred_stack *stack)
936 {
937 	int err;
938 
939 	if (WARN_ON(filter->n_preds == filter->a_preds)) {
940 		parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
941 		return -ENOSPC;
942 	}
943 
944 	err = filter_set_pred(filter, filter->n_preds, stack, pred);
945 	if (err)
946 		return err;
947 
948 	filter->n_preds++;
949 
950 	return 0;
951 }
952 
filter_assign_type(const char * type)953 int filter_assign_type(const char *type)
954 {
955 	if (strstr(type, "__data_loc") && strstr(type, "char"))
956 		return FILTER_DYN_STRING;
957 
958 	if (strchr(type, '[') && strstr(type, "char"))
959 		return FILTER_STATIC_STRING;
960 
961 	return FILTER_OTHER;
962 }
963 
is_function_field(struct ftrace_event_field * field)964 static bool is_function_field(struct ftrace_event_field *field)
965 {
966 	return field->filter_type == FILTER_TRACE_FN;
967 }
968 
is_string_field(struct ftrace_event_field * field)969 static bool is_string_field(struct ftrace_event_field *field)
970 {
971 	return field->filter_type == FILTER_DYN_STRING ||
972 	       field->filter_type == FILTER_STATIC_STRING ||
973 	       field->filter_type == FILTER_PTR_STRING;
974 }
975 
is_legal_op(struct ftrace_event_field * field,int op)976 static bool is_legal_op(struct ftrace_event_field *field, int op)
977 {
978 	if (is_string_field(field) &&
979 	    (op != OP_EQ && op != OP_NE && op != OP_GLOB))
980 		return false;
981 	if (!is_string_field(field) && op == OP_GLOB)
982 		return false;
983 
984 	return true;
985 }
986 
select_comparison_fn(int op,int field_size,int field_is_signed)987 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
988 					     int field_is_signed)
989 {
990 	filter_pred_fn_t fn = NULL;
991 
992 	switch (field_size) {
993 	case 8:
994 		if (op == OP_EQ || op == OP_NE)
995 			fn = filter_pred_64;
996 		else if (field_is_signed)
997 			fn = filter_pred_s64;
998 		else
999 			fn = filter_pred_u64;
1000 		break;
1001 	case 4:
1002 		if (op == OP_EQ || op == OP_NE)
1003 			fn = filter_pred_32;
1004 		else if (field_is_signed)
1005 			fn = filter_pred_s32;
1006 		else
1007 			fn = filter_pred_u32;
1008 		break;
1009 	case 2:
1010 		if (op == OP_EQ || op == OP_NE)
1011 			fn = filter_pred_16;
1012 		else if (field_is_signed)
1013 			fn = filter_pred_s16;
1014 		else
1015 			fn = filter_pred_u16;
1016 		break;
1017 	case 1:
1018 		if (op == OP_EQ || op == OP_NE)
1019 			fn = filter_pred_8;
1020 		else if (field_is_signed)
1021 			fn = filter_pred_s8;
1022 		else
1023 			fn = filter_pred_u8;
1024 		break;
1025 	}
1026 
1027 	return fn;
1028 }
1029 
init_pred(struct filter_parse_state * ps,struct ftrace_event_field * field,struct filter_pred * pred)1030 static int init_pred(struct filter_parse_state *ps,
1031 		     struct ftrace_event_field *field,
1032 		     struct filter_pred *pred)
1033 
1034 {
1035 	filter_pred_fn_t fn = filter_pred_none;
1036 	unsigned long long val;
1037 	int ret;
1038 
1039 	pred->offset = field->offset;
1040 
1041 	if (!is_legal_op(field, pred->op)) {
1042 		parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
1043 		return -EINVAL;
1044 	}
1045 
1046 	if (field->filter_type == FILTER_COMM) {
1047 		filter_build_regex(pred);
1048 		fn = filter_pred_comm;
1049 		pred->regex.field_len = TASK_COMM_LEN;
1050 	} else if (is_string_field(field)) {
1051 		filter_build_regex(pred);
1052 
1053 		if (field->filter_type == FILTER_STATIC_STRING) {
1054 			fn = filter_pred_string;
1055 			pred->regex.field_len = field->size;
1056 		} else if (field->filter_type == FILTER_DYN_STRING)
1057 			fn = filter_pred_strloc;
1058 		else
1059 			fn = filter_pred_pchar;
1060 	} else if (is_function_field(field)) {
1061 		if (strcmp(field->name, "ip")) {
1062 			parse_error(ps, FILT_ERR_IP_FIELD_ONLY, 0);
1063 			return -EINVAL;
1064 		}
1065 	} else {
1066 		if (field->is_signed)
1067 			ret = kstrtoll(pred->regex.pattern, 0, &val);
1068 		else
1069 			ret = kstrtoull(pred->regex.pattern, 0, &val);
1070 		if (ret) {
1071 			parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
1072 			return -EINVAL;
1073 		}
1074 		pred->val = val;
1075 
1076 		if (field->filter_type == FILTER_CPU)
1077 			fn = filter_pred_cpu;
1078 		else
1079 			fn = select_comparison_fn(pred->op, field->size,
1080 					  field->is_signed);
1081 		if (!fn) {
1082 			parse_error(ps, FILT_ERR_INVALID_OP, 0);
1083 			return -EINVAL;
1084 		}
1085 	}
1086 
1087 	if (pred->op == OP_NE)
1088 		pred->not ^= 1;
1089 
1090 	pred->fn = fn;
1091 	return 0;
1092 }
1093 
parse_init(struct filter_parse_state * ps,struct filter_op * ops,char * infix_string)1094 static void parse_init(struct filter_parse_state *ps,
1095 		       struct filter_op *ops,
1096 		       char *infix_string)
1097 {
1098 	memset(ps, '\0', sizeof(*ps));
1099 
1100 	ps->infix.string = infix_string;
1101 	ps->infix.cnt = strlen(infix_string);
1102 	ps->ops = ops;
1103 
1104 	INIT_LIST_HEAD(&ps->opstack);
1105 	INIT_LIST_HEAD(&ps->postfix);
1106 }
1107 
infix_next(struct filter_parse_state * ps)1108 static char infix_next(struct filter_parse_state *ps)
1109 {
1110 	if (!ps->infix.cnt)
1111 		return 0;
1112 
1113 	ps->infix.cnt--;
1114 
1115 	return ps->infix.string[ps->infix.tail++];
1116 }
1117 
infix_peek(struct filter_parse_state * ps)1118 static char infix_peek(struct filter_parse_state *ps)
1119 {
1120 	if (ps->infix.tail == strlen(ps->infix.string))
1121 		return 0;
1122 
1123 	return ps->infix.string[ps->infix.tail];
1124 }
1125 
infix_advance(struct filter_parse_state * ps)1126 static void infix_advance(struct filter_parse_state *ps)
1127 {
1128 	if (!ps->infix.cnt)
1129 		return;
1130 
1131 	ps->infix.cnt--;
1132 	ps->infix.tail++;
1133 }
1134 
is_precedence_lower(struct filter_parse_state * ps,int a,int b)1135 static inline int is_precedence_lower(struct filter_parse_state *ps,
1136 				      int a, int b)
1137 {
1138 	return ps->ops[a].precedence < ps->ops[b].precedence;
1139 }
1140 
is_op_char(struct filter_parse_state * ps,char c)1141 static inline int is_op_char(struct filter_parse_state *ps, char c)
1142 {
1143 	int i;
1144 
1145 	for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1146 		if (ps->ops[i].string[0] == c)
1147 			return 1;
1148 	}
1149 
1150 	return 0;
1151 }
1152 
infix_get_op(struct filter_parse_state * ps,char firstc)1153 static int infix_get_op(struct filter_parse_state *ps, char firstc)
1154 {
1155 	char nextc = infix_peek(ps);
1156 	char opstr[3];
1157 	int i;
1158 
1159 	opstr[0] = firstc;
1160 	opstr[1] = nextc;
1161 	opstr[2] = '\0';
1162 
1163 	for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1164 		if (!strcmp(opstr, ps->ops[i].string)) {
1165 			infix_advance(ps);
1166 			return ps->ops[i].id;
1167 		}
1168 	}
1169 
1170 	opstr[1] = '\0';
1171 
1172 	for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1173 		if (!strcmp(opstr, ps->ops[i].string))
1174 			return ps->ops[i].id;
1175 	}
1176 
1177 	return OP_NONE;
1178 }
1179 
clear_operand_string(struct filter_parse_state * ps)1180 static inline void clear_operand_string(struct filter_parse_state *ps)
1181 {
1182 	memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
1183 	ps->operand.tail = 0;
1184 }
1185 
append_operand_char(struct filter_parse_state * ps,char c)1186 static inline int append_operand_char(struct filter_parse_state *ps, char c)
1187 {
1188 	if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
1189 		return -EINVAL;
1190 
1191 	ps->operand.string[ps->operand.tail++] = c;
1192 
1193 	return 0;
1194 }
1195 
filter_opstack_push(struct filter_parse_state * ps,int op)1196 static int filter_opstack_push(struct filter_parse_state *ps, int op)
1197 {
1198 	struct opstack_op *opstack_op;
1199 
1200 	opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
1201 	if (!opstack_op)
1202 		return -ENOMEM;
1203 
1204 	opstack_op->op = op;
1205 	list_add(&opstack_op->list, &ps->opstack);
1206 
1207 	return 0;
1208 }
1209 
filter_opstack_empty(struct filter_parse_state * ps)1210 static int filter_opstack_empty(struct filter_parse_state *ps)
1211 {
1212 	return list_empty(&ps->opstack);
1213 }
1214 
filter_opstack_top(struct filter_parse_state * ps)1215 static int filter_opstack_top(struct filter_parse_state *ps)
1216 {
1217 	struct opstack_op *opstack_op;
1218 
1219 	if (filter_opstack_empty(ps))
1220 		return OP_NONE;
1221 
1222 	opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
1223 
1224 	return opstack_op->op;
1225 }
1226 
filter_opstack_pop(struct filter_parse_state * ps)1227 static int filter_opstack_pop(struct filter_parse_state *ps)
1228 {
1229 	struct opstack_op *opstack_op;
1230 	int op;
1231 
1232 	if (filter_opstack_empty(ps))
1233 		return OP_NONE;
1234 
1235 	opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
1236 	op = opstack_op->op;
1237 	list_del(&opstack_op->list);
1238 
1239 	kfree(opstack_op);
1240 
1241 	return op;
1242 }
1243 
filter_opstack_clear(struct filter_parse_state * ps)1244 static void filter_opstack_clear(struct filter_parse_state *ps)
1245 {
1246 	while (!filter_opstack_empty(ps))
1247 		filter_opstack_pop(ps);
1248 }
1249 
curr_operand(struct filter_parse_state * ps)1250 static char *curr_operand(struct filter_parse_state *ps)
1251 {
1252 	return ps->operand.string;
1253 }
1254 
postfix_append_operand(struct filter_parse_state * ps,char * operand)1255 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
1256 {
1257 	struct postfix_elt *elt;
1258 
1259 	elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1260 	if (!elt)
1261 		return -ENOMEM;
1262 
1263 	elt->op = OP_NONE;
1264 	elt->operand = kstrdup(operand, GFP_KERNEL);
1265 	if (!elt->operand) {
1266 		kfree(elt);
1267 		return -ENOMEM;
1268 	}
1269 
1270 	list_add_tail(&elt->list, &ps->postfix);
1271 
1272 	return 0;
1273 }
1274 
postfix_append_op(struct filter_parse_state * ps,int op)1275 static int postfix_append_op(struct filter_parse_state *ps, int op)
1276 {
1277 	struct postfix_elt *elt;
1278 
1279 	elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1280 	if (!elt)
1281 		return -ENOMEM;
1282 
1283 	elt->op = op;
1284 	elt->operand = NULL;
1285 
1286 	list_add_tail(&elt->list, &ps->postfix);
1287 
1288 	return 0;
1289 }
1290 
postfix_clear(struct filter_parse_state * ps)1291 static void postfix_clear(struct filter_parse_state *ps)
1292 {
1293 	struct postfix_elt *elt;
1294 
1295 	while (!list_empty(&ps->postfix)) {
1296 		elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
1297 		list_del(&elt->list);
1298 		kfree(elt->operand);
1299 		kfree(elt);
1300 	}
1301 }
1302 
filter_parse(struct filter_parse_state * ps)1303 static int filter_parse(struct filter_parse_state *ps)
1304 {
1305 	int in_string = 0;
1306 	int op, top_op;
1307 	char ch;
1308 
1309 	while ((ch = infix_next(ps))) {
1310 		if (ch == '"') {
1311 			in_string ^= 1;
1312 			continue;
1313 		}
1314 
1315 		if (in_string)
1316 			goto parse_operand;
1317 
1318 		if (isspace(ch))
1319 			continue;
1320 
1321 		if (is_op_char(ps, ch)) {
1322 			op = infix_get_op(ps, ch);
1323 			if (op == OP_NONE) {
1324 				parse_error(ps, FILT_ERR_INVALID_OP, 0);
1325 				return -EINVAL;
1326 			}
1327 
1328 			if (strlen(curr_operand(ps))) {
1329 				postfix_append_operand(ps, curr_operand(ps));
1330 				clear_operand_string(ps);
1331 			}
1332 
1333 			while (!filter_opstack_empty(ps)) {
1334 				top_op = filter_opstack_top(ps);
1335 				if (!is_precedence_lower(ps, top_op, op)) {
1336 					top_op = filter_opstack_pop(ps);
1337 					postfix_append_op(ps, top_op);
1338 					continue;
1339 				}
1340 				break;
1341 			}
1342 
1343 			filter_opstack_push(ps, op);
1344 			continue;
1345 		}
1346 
1347 		if (ch == '(') {
1348 			filter_opstack_push(ps, OP_OPEN_PAREN);
1349 			continue;
1350 		}
1351 
1352 		if (ch == ')') {
1353 			if (strlen(curr_operand(ps))) {
1354 				postfix_append_operand(ps, curr_operand(ps));
1355 				clear_operand_string(ps);
1356 			}
1357 
1358 			top_op = filter_opstack_pop(ps);
1359 			while (top_op != OP_NONE) {
1360 				if (top_op == OP_OPEN_PAREN)
1361 					break;
1362 				postfix_append_op(ps, top_op);
1363 				top_op = filter_opstack_pop(ps);
1364 			}
1365 			if (top_op == OP_NONE) {
1366 				parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1367 				return -EINVAL;
1368 			}
1369 			continue;
1370 		}
1371 parse_operand:
1372 		if (append_operand_char(ps, ch)) {
1373 			parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1374 			return -EINVAL;
1375 		}
1376 	}
1377 
1378 	if (strlen(curr_operand(ps)))
1379 		postfix_append_operand(ps, curr_operand(ps));
1380 
1381 	while (!filter_opstack_empty(ps)) {
1382 		top_op = filter_opstack_pop(ps);
1383 		if (top_op == OP_NONE)
1384 			break;
1385 		if (top_op == OP_OPEN_PAREN) {
1386 			parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1387 			return -EINVAL;
1388 		}
1389 		postfix_append_op(ps, top_op);
1390 	}
1391 
1392 	return 0;
1393 }
1394 
create_pred(struct filter_parse_state * ps,struct trace_event_call * call,int op,char * operand1,char * operand2)1395 static struct filter_pred *create_pred(struct filter_parse_state *ps,
1396 				       struct trace_event_call *call,
1397 				       int op, char *operand1, char *operand2)
1398 {
1399 	struct ftrace_event_field *field;
1400 	static struct filter_pred pred;
1401 
1402 	memset(&pred, 0, sizeof(pred));
1403 	pred.op = op;
1404 
1405 	if (op == OP_AND || op == OP_OR)
1406 		return &pred;
1407 
1408 	if (!operand1 || !operand2) {
1409 		parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1410 		return NULL;
1411 	}
1412 
1413 	field = trace_find_event_field(call, operand1);
1414 	if (!field) {
1415 		parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
1416 		return NULL;
1417 	}
1418 
1419 	strcpy(pred.regex.pattern, operand2);
1420 	pred.regex.len = strlen(pred.regex.pattern);
1421 	pred.field = field;
1422 	return init_pred(ps, field, &pred) ? NULL : &pred;
1423 }
1424 
check_preds(struct filter_parse_state * ps)1425 static int check_preds(struct filter_parse_state *ps)
1426 {
1427 	int n_normal_preds = 0, n_logical_preds = 0;
1428 	struct postfix_elt *elt;
1429 	int cnt = 0;
1430 
1431 	list_for_each_entry(elt, &ps->postfix, list) {
1432 		if (elt->op == OP_NONE) {
1433 			cnt++;
1434 			continue;
1435 		}
1436 
1437 		if (elt->op == OP_AND || elt->op == OP_OR) {
1438 			n_logical_preds++;
1439 			cnt--;
1440 			continue;
1441 		}
1442 		if (elt->op != OP_NOT)
1443 			cnt--;
1444 		n_normal_preds++;
1445 		/* all ops should have operands */
1446 		if (cnt < 0)
1447 			break;
1448 	}
1449 
1450 	if (cnt != 1 || !n_normal_preds || n_logical_preds >= n_normal_preds) {
1451 		parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
1452 		return -EINVAL;
1453 	}
1454 
1455 	return 0;
1456 }
1457 
count_preds(struct filter_parse_state * ps)1458 static int count_preds(struct filter_parse_state *ps)
1459 {
1460 	struct postfix_elt *elt;
1461 	int n_preds = 0;
1462 
1463 	list_for_each_entry(elt, &ps->postfix, list) {
1464 		if (elt->op == OP_NONE)
1465 			continue;
1466 		n_preds++;
1467 	}
1468 
1469 	return n_preds;
1470 }
1471 
1472 struct check_pred_data {
1473 	int count;
1474 	int max;
1475 };
1476 
check_pred_tree_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)1477 static int check_pred_tree_cb(enum move_type move, struct filter_pred *pred,
1478 			      int *err, void *data)
1479 {
1480 	struct check_pred_data *d = data;
1481 
1482 	if (WARN_ON(d->count++ > d->max)) {
1483 		*err = -EINVAL;
1484 		return WALK_PRED_ABORT;
1485 	}
1486 	return WALK_PRED_DEFAULT;
1487 }
1488 
1489 /*
1490  * The tree is walked at filtering of an event. If the tree is not correctly
1491  * built, it may cause an infinite loop. Check here that the tree does
1492  * indeed terminate.
1493  */
check_pred_tree(struct event_filter * filter,struct filter_pred * root)1494 static int check_pred_tree(struct event_filter *filter,
1495 			   struct filter_pred *root)
1496 {
1497 	struct check_pred_data data = {
1498 		/*
1499 		 * The max that we can hit a node is three times.
1500 		 * Once going down, once coming up from left, and
1501 		 * once coming up from right. This is more than enough
1502 		 * since leafs are only hit a single time.
1503 		 */
1504 		.max   = 3 * filter->n_preds,
1505 		.count = 0,
1506 	};
1507 
1508 	return walk_pred_tree(filter->preds, root,
1509 			      check_pred_tree_cb, &data);
1510 }
1511 
count_leafs_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)1512 static int count_leafs_cb(enum move_type move, struct filter_pred *pred,
1513 			  int *err, void *data)
1514 {
1515 	int *count = data;
1516 
1517 	if ((move == MOVE_DOWN) &&
1518 	    (pred->left == FILTER_PRED_INVALID))
1519 		(*count)++;
1520 
1521 	return WALK_PRED_DEFAULT;
1522 }
1523 
count_leafs(struct filter_pred * preds,struct filter_pred * root)1524 static int count_leafs(struct filter_pred *preds, struct filter_pred *root)
1525 {
1526 	int count = 0, ret;
1527 
1528 	ret = walk_pred_tree(preds, root, count_leafs_cb, &count);
1529 	WARN_ON(ret);
1530 	return count;
1531 }
1532 
1533 struct fold_pred_data {
1534 	struct filter_pred *root;
1535 	int count;
1536 	int children;
1537 };
1538 
fold_pred_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)1539 static int fold_pred_cb(enum move_type move, struct filter_pred *pred,
1540 			int *err, void *data)
1541 {
1542 	struct fold_pred_data *d = data;
1543 	struct filter_pred *root = d->root;
1544 
1545 	if (move != MOVE_DOWN)
1546 		return WALK_PRED_DEFAULT;
1547 	if (pred->left != FILTER_PRED_INVALID)
1548 		return WALK_PRED_DEFAULT;
1549 
1550 	if (WARN_ON(d->count == d->children)) {
1551 		*err = -EINVAL;
1552 		return WALK_PRED_ABORT;
1553 	}
1554 
1555 	pred->index &= ~FILTER_PRED_FOLD;
1556 	root->ops[d->count++] = pred->index;
1557 	return WALK_PRED_DEFAULT;
1558 }
1559 
fold_pred(struct filter_pred * preds,struct filter_pred * root)1560 static int fold_pred(struct filter_pred *preds, struct filter_pred *root)
1561 {
1562 	struct fold_pred_data data = {
1563 		.root  = root,
1564 		.count = 0,
1565 	};
1566 	int children;
1567 
1568 	/* No need to keep the fold flag */
1569 	root->index &= ~FILTER_PRED_FOLD;
1570 
1571 	/* If the root is a leaf then do nothing */
1572 	if (root->left == FILTER_PRED_INVALID)
1573 		return 0;
1574 
1575 	/* count the children */
1576 	children = count_leafs(preds, &preds[root->left]);
1577 	children += count_leafs(preds, &preds[root->right]);
1578 
1579 	root->ops = kcalloc(children, sizeof(*root->ops), GFP_KERNEL);
1580 	if (!root->ops)
1581 		return -ENOMEM;
1582 
1583 	root->val = children;
1584 	data.children = children;
1585 	return walk_pred_tree(preds, root, fold_pred_cb, &data);
1586 }
1587 
fold_pred_tree_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)1588 static int fold_pred_tree_cb(enum move_type move, struct filter_pred *pred,
1589 			     int *err, void *data)
1590 {
1591 	struct filter_pred *preds = data;
1592 
1593 	if (move != MOVE_DOWN)
1594 		return WALK_PRED_DEFAULT;
1595 	if (!(pred->index & FILTER_PRED_FOLD))
1596 		return WALK_PRED_DEFAULT;
1597 
1598 	*err = fold_pred(preds, pred);
1599 	if (*err)
1600 		return WALK_PRED_ABORT;
1601 
1602 	/* eveyrhing below is folded, continue with parent */
1603 	return WALK_PRED_PARENT;
1604 }
1605 
1606 /*
1607  * To optimize the processing of the ops, if we have several "ors" or
1608  * "ands" together, we can put them in an array and process them all
1609  * together speeding up the filter logic.
1610  */
fold_pred_tree(struct event_filter * filter,struct filter_pred * root)1611 static int fold_pred_tree(struct event_filter *filter,
1612 			   struct filter_pred *root)
1613 {
1614 	return walk_pred_tree(filter->preds, root, fold_pred_tree_cb,
1615 			      filter->preds);
1616 }
1617 
replace_preds(struct trace_event_call * call,struct event_filter * filter,struct filter_parse_state * ps,bool dry_run)1618 static int replace_preds(struct trace_event_call *call,
1619 			 struct event_filter *filter,
1620 			 struct filter_parse_state *ps,
1621 			 bool dry_run)
1622 {
1623 	char *operand1 = NULL, *operand2 = NULL;
1624 	struct filter_pred *pred;
1625 	struct filter_pred *root;
1626 	struct postfix_elt *elt;
1627 	struct pred_stack stack = { }; /* init to NULL */
1628 	int err;
1629 	int n_preds = 0;
1630 
1631 	n_preds = count_preds(ps);
1632 	if (n_preds >= MAX_FILTER_PRED) {
1633 		parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1634 		return -ENOSPC;
1635 	}
1636 
1637 	err = check_preds(ps);
1638 	if (err)
1639 		return err;
1640 
1641 	if (!dry_run) {
1642 		err = __alloc_pred_stack(&stack, n_preds);
1643 		if (err)
1644 			return err;
1645 		err = __alloc_preds(filter, n_preds);
1646 		if (err)
1647 			goto fail;
1648 	}
1649 
1650 	n_preds = 0;
1651 	list_for_each_entry(elt, &ps->postfix, list) {
1652 		if (elt->op == OP_NONE) {
1653 			if (!operand1)
1654 				operand1 = elt->operand;
1655 			else if (!operand2)
1656 				operand2 = elt->operand;
1657 			else {
1658 				parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1659 				err = -EINVAL;
1660 				goto fail;
1661 			}
1662 			continue;
1663 		}
1664 
1665 		if (elt->op == OP_NOT) {
1666 			if (!n_preds || operand1 || operand2) {
1667 				parse_error(ps, FILT_ERR_ILLEGAL_NOT_OP, 0);
1668 				err = -EINVAL;
1669 				goto fail;
1670 			}
1671 			if (!dry_run)
1672 				filter->preds[n_preds - 1].not ^= 1;
1673 			continue;
1674 		}
1675 
1676 		if (WARN_ON(n_preds++ == MAX_FILTER_PRED)) {
1677 			parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1678 			err = -ENOSPC;
1679 			goto fail;
1680 		}
1681 
1682 		pred = create_pred(ps, call, elt->op, operand1, operand2);
1683 		if (!pred) {
1684 			err = -EINVAL;
1685 			goto fail;
1686 		}
1687 
1688 		if (!dry_run) {
1689 			err = filter_add_pred(ps, filter, pred, &stack);
1690 			if (err)
1691 				goto fail;
1692 		}
1693 
1694 		operand1 = operand2 = NULL;
1695 	}
1696 
1697 	if (!dry_run) {
1698 		/* We should have one item left on the stack */
1699 		pred = __pop_pred_stack(&stack);
1700 		if (!pred)
1701 			return -EINVAL;
1702 		/* This item is where we start from in matching */
1703 		root = pred;
1704 		/* Make sure the stack is empty */
1705 		pred = __pop_pred_stack(&stack);
1706 		if (WARN_ON(pred)) {
1707 			err = -EINVAL;
1708 			filter->root = NULL;
1709 			goto fail;
1710 		}
1711 		err = check_pred_tree(filter, root);
1712 		if (err)
1713 			goto fail;
1714 
1715 		/* Optimize the tree */
1716 		err = fold_pred_tree(filter, root);
1717 		if (err)
1718 			goto fail;
1719 
1720 		/* We don't set root until we know it works */
1721 		barrier();
1722 		filter->root = root;
1723 	}
1724 
1725 	err = 0;
1726 fail:
1727 	__free_pred_stack(&stack);
1728 	return err;
1729 }
1730 
event_set_filtered_flag(struct trace_event_file * file)1731 static inline void event_set_filtered_flag(struct trace_event_file *file)
1732 {
1733 	struct trace_event_call *call = file->event_call;
1734 
1735 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
1736 		call->flags |= TRACE_EVENT_FL_FILTERED;
1737 	else
1738 		file->flags |= EVENT_FILE_FL_FILTERED;
1739 }
1740 
event_set_filter(struct trace_event_file * file,struct event_filter * filter)1741 static inline void event_set_filter(struct trace_event_file *file,
1742 				    struct event_filter *filter)
1743 {
1744 	struct trace_event_call *call = file->event_call;
1745 
1746 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
1747 		rcu_assign_pointer(call->filter, filter);
1748 	else
1749 		rcu_assign_pointer(file->filter, filter);
1750 }
1751 
event_clear_filter(struct trace_event_file * file)1752 static inline void event_clear_filter(struct trace_event_file *file)
1753 {
1754 	struct trace_event_call *call = file->event_call;
1755 
1756 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
1757 		RCU_INIT_POINTER(call->filter, NULL);
1758 	else
1759 		RCU_INIT_POINTER(file->filter, NULL);
1760 }
1761 
1762 static inline void
event_set_no_set_filter_flag(struct trace_event_file * file)1763 event_set_no_set_filter_flag(struct trace_event_file *file)
1764 {
1765 	struct trace_event_call *call = file->event_call;
1766 
1767 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
1768 		call->flags |= TRACE_EVENT_FL_NO_SET_FILTER;
1769 	else
1770 		file->flags |= EVENT_FILE_FL_NO_SET_FILTER;
1771 }
1772 
1773 static inline void
event_clear_no_set_filter_flag(struct trace_event_file * file)1774 event_clear_no_set_filter_flag(struct trace_event_file *file)
1775 {
1776 	struct trace_event_call *call = file->event_call;
1777 
1778 	if (call->flags & TRACE_EVENT_FL_USE_CALL_FILTER)
1779 		call->flags &= ~TRACE_EVENT_FL_NO_SET_FILTER;
1780 	else
1781 		file->flags &= ~EVENT_FILE_FL_NO_SET_FILTER;
1782 }
1783 
1784 static inline bool
event_no_set_filter_flag(struct trace_event_file * file)1785 event_no_set_filter_flag(struct trace_event_file *file)
1786 {
1787 	struct trace_event_call *call = file->event_call;
1788 
1789 	if (file->flags & EVENT_FILE_FL_NO_SET_FILTER)
1790 		return true;
1791 
1792 	if ((call->flags & TRACE_EVENT_FL_USE_CALL_FILTER) &&
1793 	    (call->flags & TRACE_EVENT_FL_NO_SET_FILTER))
1794 		return true;
1795 
1796 	return false;
1797 }
1798 
1799 struct filter_list {
1800 	struct list_head	list;
1801 	struct event_filter	*filter;
1802 };
1803 
replace_system_preds(struct trace_subsystem_dir * dir,struct trace_array * tr,struct filter_parse_state * ps,char * filter_string)1804 static int replace_system_preds(struct trace_subsystem_dir *dir,
1805 				struct trace_array *tr,
1806 				struct filter_parse_state *ps,
1807 				char *filter_string)
1808 {
1809 	struct trace_event_file *file;
1810 	struct filter_list *filter_item;
1811 	struct filter_list *tmp;
1812 	LIST_HEAD(filter_list);
1813 	bool fail = true;
1814 	int err;
1815 
1816 	list_for_each_entry(file, &tr->events, list) {
1817 		if (file->system != dir)
1818 			continue;
1819 
1820 		/*
1821 		 * Try to see if the filter can be applied
1822 		 *  (filter arg is ignored on dry_run)
1823 		 */
1824 		err = replace_preds(file->event_call, NULL, ps, true);
1825 		if (err)
1826 			event_set_no_set_filter_flag(file);
1827 		else
1828 			event_clear_no_set_filter_flag(file);
1829 	}
1830 
1831 	list_for_each_entry(file, &tr->events, list) {
1832 		struct event_filter *filter;
1833 
1834 		if (file->system != dir)
1835 			continue;
1836 
1837 		if (event_no_set_filter_flag(file))
1838 			continue;
1839 
1840 		filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
1841 		if (!filter_item)
1842 			goto fail_mem;
1843 
1844 		list_add_tail(&filter_item->list, &filter_list);
1845 
1846 		filter_item->filter = __alloc_filter();
1847 		if (!filter_item->filter)
1848 			goto fail_mem;
1849 		filter = filter_item->filter;
1850 
1851 		/* Can only fail on no memory */
1852 		err = replace_filter_string(filter, filter_string);
1853 		if (err)
1854 			goto fail_mem;
1855 
1856 		err = replace_preds(file->event_call, filter, ps, false);
1857 		if (err) {
1858 			filter_disable(file);
1859 			parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1860 			append_filter_err(ps, filter);
1861 		} else
1862 			event_set_filtered_flag(file);
1863 		/*
1864 		 * Regardless of if this returned an error, we still
1865 		 * replace the filter for the call.
1866 		 */
1867 		filter = event_filter(file);
1868 		event_set_filter(file, filter_item->filter);
1869 		filter_item->filter = filter;
1870 
1871 		fail = false;
1872 	}
1873 
1874 	if (fail)
1875 		goto fail;
1876 
1877 	/*
1878 	 * The calls can still be using the old filters.
1879 	 * Do a synchronize_sched() to ensure all calls are
1880 	 * done with them before we free them.
1881 	 */
1882 	synchronize_sched();
1883 	list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1884 		__free_filter(filter_item->filter);
1885 		list_del(&filter_item->list);
1886 		kfree(filter_item);
1887 	}
1888 	return 0;
1889  fail:
1890 	/* No call succeeded */
1891 	list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1892 		list_del(&filter_item->list);
1893 		kfree(filter_item);
1894 	}
1895 	parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1896 	return -EINVAL;
1897  fail_mem:
1898 	/* If any call succeeded, we still need to sync */
1899 	if (!fail)
1900 		synchronize_sched();
1901 	list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1902 		__free_filter(filter_item->filter);
1903 		list_del(&filter_item->list);
1904 		kfree(filter_item);
1905 	}
1906 	return -ENOMEM;
1907 }
1908 
create_filter_start(char * filter_str,bool set_str,struct filter_parse_state ** psp,struct event_filter ** filterp)1909 static int create_filter_start(char *filter_str, bool set_str,
1910 			       struct filter_parse_state **psp,
1911 			       struct event_filter **filterp)
1912 {
1913 	struct event_filter *filter;
1914 	struct filter_parse_state *ps = NULL;
1915 	int err = 0;
1916 
1917 	WARN_ON_ONCE(*psp || *filterp);
1918 
1919 	/* allocate everything, and if any fails, free all and fail */
1920 	filter = __alloc_filter();
1921 	if (filter && set_str)
1922 		err = replace_filter_string(filter, filter_str);
1923 
1924 	ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1925 
1926 	if (!filter || !ps || err) {
1927 		kfree(ps);
1928 		__free_filter(filter);
1929 		return -ENOMEM;
1930 	}
1931 
1932 	/* we're committed to creating a new filter */
1933 	*filterp = filter;
1934 	*psp = ps;
1935 
1936 	parse_init(ps, filter_ops, filter_str);
1937 	err = filter_parse(ps);
1938 	if (err && set_str)
1939 		append_filter_err(ps, filter);
1940 	return err;
1941 }
1942 
create_filter_finish(struct filter_parse_state * ps)1943 static void create_filter_finish(struct filter_parse_state *ps)
1944 {
1945 	if (ps) {
1946 		filter_opstack_clear(ps);
1947 		postfix_clear(ps);
1948 		kfree(ps);
1949 	}
1950 }
1951 
1952 /**
1953  * create_filter - create a filter for a trace_event_call
1954  * @call: trace_event_call to create a filter for
1955  * @filter_str: filter string
1956  * @set_str: remember @filter_str and enable detailed error in filter
1957  * @filterp: out param for created filter (always updated on return)
1958  *
1959  * Creates a filter for @call with @filter_str.  If @set_str is %true,
1960  * @filter_str is copied and recorded in the new filter.
1961  *
1962  * On success, returns 0 and *@filterp points to the new filter.  On
1963  * failure, returns -errno and *@filterp may point to %NULL or to a new
1964  * filter.  In the latter case, the returned filter contains error
1965  * information if @set_str is %true and the caller is responsible for
1966  * freeing it.
1967  */
create_filter(struct trace_event_call * call,char * filter_str,bool set_str,struct event_filter ** filterp)1968 static int create_filter(struct trace_event_call *call,
1969 			 char *filter_str, bool set_str,
1970 			 struct event_filter **filterp)
1971 {
1972 	struct event_filter *filter = NULL;
1973 	struct filter_parse_state *ps = NULL;
1974 	int err;
1975 
1976 	err = create_filter_start(filter_str, set_str, &ps, &filter);
1977 	if (!err) {
1978 		err = replace_preds(call, filter, ps, false);
1979 		if (err && set_str)
1980 			append_filter_err(ps, filter);
1981 	}
1982 	create_filter_finish(ps);
1983 
1984 	*filterp = filter;
1985 	return err;
1986 }
1987 
create_event_filter(struct trace_event_call * call,char * filter_str,bool set_str,struct event_filter ** filterp)1988 int create_event_filter(struct trace_event_call *call,
1989 			char *filter_str, bool set_str,
1990 			struct event_filter **filterp)
1991 {
1992 	return create_filter(call, filter_str, set_str, filterp);
1993 }
1994 
1995 /**
1996  * create_system_filter - create a filter for an event_subsystem
1997  * @system: event_subsystem to create a filter for
1998  * @filter_str: filter string
1999  * @filterp: out param for created filter (always updated on return)
2000  *
2001  * Identical to create_filter() except that it creates a subsystem filter
2002  * and always remembers @filter_str.
2003  */
create_system_filter(struct trace_subsystem_dir * dir,struct trace_array * tr,char * filter_str,struct event_filter ** filterp)2004 static int create_system_filter(struct trace_subsystem_dir *dir,
2005 				struct trace_array *tr,
2006 				char *filter_str, struct event_filter **filterp)
2007 {
2008 	struct event_filter *filter = NULL;
2009 	struct filter_parse_state *ps = NULL;
2010 	int err;
2011 
2012 	err = create_filter_start(filter_str, true, &ps, &filter);
2013 	if (!err) {
2014 		err = replace_system_preds(dir, tr, ps, filter_str);
2015 		if (!err) {
2016 			/* System filters just show a default message */
2017 			kfree(filter->filter_string);
2018 			filter->filter_string = NULL;
2019 		} else {
2020 			append_filter_err(ps, filter);
2021 		}
2022 	}
2023 	create_filter_finish(ps);
2024 
2025 	*filterp = filter;
2026 	return err;
2027 }
2028 
2029 /* caller must hold event_mutex */
apply_event_filter(struct trace_event_file * file,char * filter_string)2030 int apply_event_filter(struct trace_event_file *file, char *filter_string)
2031 {
2032 	struct trace_event_call *call = file->event_call;
2033 	struct event_filter *filter;
2034 	int err;
2035 
2036 	if (!strcmp(strstrip(filter_string), "0")) {
2037 		filter_disable(file);
2038 		filter = event_filter(file);
2039 
2040 		if (!filter)
2041 			return 0;
2042 
2043 		event_clear_filter(file);
2044 
2045 		/* Make sure the filter is not being used */
2046 		synchronize_sched();
2047 		__free_filter(filter);
2048 
2049 		return 0;
2050 	}
2051 
2052 	err = create_filter(call, filter_string, true, &filter);
2053 
2054 	/*
2055 	 * Always swap the call filter with the new filter
2056 	 * even if there was an error. If there was an error
2057 	 * in the filter, we disable the filter and show the error
2058 	 * string
2059 	 */
2060 	if (filter) {
2061 		struct event_filter *tmp;
2062 
2063 		tmp = event_filter(file);
2064 		if (!err)
2065 			event_set_filtered_flag(file);
2066 		else
2067 			filter_disable(file);
2068 
2069 		event_set_filter(file, filter);
2070 
2071 		if (tmp) {
2072 			/* Make sure the call is done with the filter */
2073 			synchronize_sched();
2074 			__free_filter(tmp);
2075 		}
2076 	}
2077 
2078 	return err;
2079 }
2080 
apply_subsystem_event_filter(struct trace_subsystem_dir * dir,char * filter_string)2081 int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
2082 				 char *filter_string)
2083 {
2084 	struct event_subsystem *system = dir->subsystem;
2085 	struct trace_array *tr = dir->tr;
2086 	struct event_filter *filter;
2087 	int err = 0;
2088 
2089 	mutex_lock(&event_mutex);
2090 
2091 	/* Make sure the system still has events */
2092 	if (!dir->nr_events) {
2093 		err = -ENODEV;
2094 		goto out_unlock;
2095 	}
2096 
2097 	if (!strcmp(strstrip(filter_string), "0")) {
2098 		filter_free_subsystem_preds(dir, tr);
2099 		remove_filter_string(system->filter);
2100 		filter = system->filter;
2101 		system->filter = NULL;
2102 		/* Ensure all filters are no longer used */
2103 		synchronize_sched();
2104 		filter_free_subsystem_filters(dir, tr);
2105 		__free_filter(filter);
2106 		goto out_unlock;
2107 	}
2108 
2109 	err = create_system_filter(dir, tr, filter_string, &filter);
2110 	if (filter) {
2111 		/*
2112 		 * No event actually uses the system filter
2113 		 * we can free it without synchronize_sched().
2114 		 */
2115 		__free_filter(system->filter);
2116 		system->filter = filter;
2117 	}
2118 out_unlock:
2119 	mutex_unlock(&event_mutex);
2120 
2121 	return err;
2122 }
2123 
2124 #ifdef CONFIG_PERF_EVENTS
2125 
ftrace_profile_free_filter(struct perf_event * event)2126 void ftrace_profile_free_filter(struct perf_event *event)
2127 {
2128 	struct event_filter *filter = event->filter;
2129 
2130 	event->filter = NULL;
2131 	__free_filter(filter);
2132 }
2133 
2134 struct function_filter_data {
2135 	struct ftrace_ops *ops;
2136 	int first_filter;
2137 	int first_notrace;
2138 };
2139 
2140 #ifdef CONFIG_FUNCTION_TRACER
2141 static char **
ftrace_function_filter_re(char * buf,int len,int * count)2142 ftrace_function_filter_re(char *buf, int len, int *count)
2143 {
2144 	char *str, **re;
2145 
2146 	str = kstrndup(buf, len, GFP_KERNEL);
2147 	if (!str)
2148 		return NULL;
2149 
2150 	/*
2151 	 * The argv_split function takes white space
2152 	 * as a separator, so convert ',' into spaces.
2153 	 */
2154 	strreplace(str, ',', ' ');
2155 
2156 	re = argv_split(GFP_KERNEL, str, count);
2157 	kfree(str);
2158 	return re;
2159 }
2160 
ftrace_function_set_regexp(struct ftrace_ops * ops,int filter,int reset,char * re,int len)2161 static int ftrace_function_set_regexp(struct ftrace_ops *ops, int filter,
2162 				      int reset, char *re, int len)
2163 {
2164 	int ret;
2165 
2166 	if (filter)
2167 		ret = ftrace_set_filter(ops, re, len, reset);
2168 	else
2169 		ret = ftrace_set_notrace(ops, re, len, reset);
2170 
2171 	return ret;
2172 }
2173 
__ftrace_function_set_filter(int filter,char * buf,int len,struct function_filter_data * data)2174 static int __ftrace_function_set_filter(int filter, char *buf, int len,
2175 					struct function_filter_data *data)
2176 {
2177 	int i, re_cnt, ret = -EINVAL;
2178 	int *reset;
2179 	char **re;
2180 
2181 	reset = filter ? &data->first_filter : &data->first_notrace;
2182 
2183 	/*
2184 	 * The 'ip' field could have multiple filters set, separated
2185 	 * either by space or comma. We first cut the filter and apply
2186 	 * all pieces separatelly.
2187 	 */
2188 	re = ftrace_function_filter_re(buf, len, &re_cnt);
2189 	if (!re)
2190 		return -EINVAL;
2191 
2192 	for (i = 0; i < re_cnt; i++) {
2193 		ret = ftrace_function_set_regexp(data->ops, filter, *reset,
2194 						 re[i], strlen(re[i]));
2195 		if (ret)
2196 			break;
2197 
2198 		if (*reset)
2199 			*reset = 0;
2200 	}
2201 
2202 	argv_free(re);
2203 	return ret;
2204 }
2205 
ftrace_function_check_pred(struct filter_pred * pred,int leaf)2206 static int ftrace_function_check_pred(struct filter_pred *pred, int leaf)
2207 {
2208 	struct ftrace_event_field *field = pred->field;
2209 
2210 	if (leaf) {
2211 		/*
2212 		 * Check the leaf predicate for function trace, verify:
2213 		 *  - only '==' and '!=' is used
2214 		 *  - the 'ip' field is used
2215 		 */
2216 		if ((pred->op != OP_EQ) && (pred->op != OP_NE))
2217 			return -EINVAL;
2218 
2219 		if (strcmp(field->name, "ip"))
2220 			return -EINVAL;
2221 	} else {
2222 		/*
2223 		 * Check the non leaf predicate for function trace, verify:
2224 		 *  - only '||' is used
2225 		*/
2226 		if (pred->op != OP_OR)
2227 			return -EINVAL;
2228 	}
2229 
2230 	return 0;
2231 }
2232 
ftrace_function_set_filter_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)2233 static int ftrace_function_set_filter_cb(enum move_type move,
2234 					 struct filter_pred *pred,
2235 					 int *err, void *data)
2236 {
2237 	/* Checking the node is valid for function trace. */
2238 	if ((move != MOVE_DOWN) ||
2239 	    (pred->left != FILTER_PRED_INVALID)) {
2240 		*err = ftrace_function_check_pred(pred, 0);
2241 	} else {
2242 		*err = ftrace_function_check_pred(pred, 1);
2243 		if (*err)
2244 			return WALK_PRED_ABORT;
2245 
2246 		*err = __ftrace_function_set_filter(pred->op == OP_EQ,
2247 						    pred->regex.pattern,
2248 						    pred->regex.len,
2249 						    data);
2250 	}
2251 
2252 	return (*err) ? WALK_PRED_ABORT : WALK_PRED_DEFAULT;
2253 }
2254 
ftrace_function_set_filter(struct perf_event * event,struct event_filter * filter)2255 static int ftrace_function_set_filter(struct perf_event *event,
2256 				      struct event_filter *filter)
2257 {
2258 	struct function_filter_data data = {
2259 		.first_filter  = 1,
2260 		.first_notrace = 1,
2261 		.ops           = &event->ftrace_ops,
2262 	};
2263 
2264 	return walk_pred_tree(filter->preds, filter->root,
2265 			      ftrace_function_set_filter_cb, &data);
2266 }
2267 #else
ftrace_function_set_filter(struct perf_event * event,struct event_filter * filter)2268 static int ftrace_function_set_filter(struct perf_event *event,
2269 				      struct event_filter *filter)
2270 {
2271 	return -ENODEV;
2272 }
2273 #endif /* CONFIG_FUNCTION_TRACER */
2274 
ftrace_profile_set_filter(struct perf_event * event,int event_id,char * filter_str)2275 int ftrace_profile_set_filter(struct perf_event *event, int event_id,
2276 			      char *filter_str)
2277 {
2278 	int err;
2279 	struct event_filter *filter;
2280 	struct trace_event_call *call;
2281 
2282 	mutex_lock(&event_mutex);
2283 
2284 	call = event->tp_event;
2285 
2286 	err = -EINVAL;
2287 	if (!call)
2288 		goto out_unlock;
2289 
2290 	err = -EEXIST;
2291 	if (event->filter)
2292 		goto out_unlock;
2293 
2294 	err = create_filter(call, filter_str, false, &filter);
2295 	if (err)
2296 		goto free_filter;
2297 
2298 	if (ftrace_event_is_function(call))
2299 		err = ftrace_function_set_filter(event, filter);
2300 	else
2301 		event->filter = filter;
2302 
2303 free_filter:
2304 	if (err || ftrace_event_is_function(call))
2305 		__free_filter(filter);
2306 
2307 out_unlock:
2308 	mutex_unlock(&event_mutex);
2309 
2310 	return err;
2311 }
2312 
2313 #endif /* CONFIG_PERF_EVENTS */
2314 
2315 #ifdef CONFIG_FTRACE_STARTUP_TEST
2316 
2317 #include <linux/types.h>
2318 #include <linux/tracepoint.h>
2319 
2320 #define CREATE_TRACE_POINTS
2321 #include "trace_events_filter_test.h"
2322 
2323 #define DATA_REC(m, va, vb, vc, vd, ve, vf, vg, vh, nvisit) \
2324 { \
2325 	.filter = FILTER, \
2326 	.rec    = { .a = va, .b = vb, .c = vc, .d = vd, \
2327 		    .e = ve, .f = vf, .g = vg, .h = vh }, \
2328 	.match  = m, \
2329 	.not_visited = nvisit, \
2330 }
2331 #define YES 1
2332 #define NO  0
2333 
2334 static struct test_filter_data_t {
2335 	char *filter;
2336 	struct trace_event_raw_ftrace_test_filter rec;
2337 	int match;
2338 	char *not_visited;
2339 } test_filter_data[] = {
2340 #define FILTER "a == 1 && b == 1 && c == 1 && d == 1 && " \
2341 	       "e == 1 && f == 1 && g == 1 && h == 1"
2342 	DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, ""),
2343 	DATA_REC(NO,  0, 1, 1, 1, 1, 1, 1, 1, "bcdefgh"),
2344 	DATA_REC(NO,  1, 1, 1, 1, 1, 1, 1, 0, ""),
2345 #undef FILTER
2346 #define FILTER "a == 1 || b == 1 || c == 1 || d == 1 || " \
2347 	       "e == 1 || f == 1 || g == 1 || h == 1"
2348 	DATA_REC(NO,  0, 0, 0, 0, 0, 0, 0, 0, ""),
2349 	DATA_REC(YES, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2350 	DATA_REC(YES, 1, 0, 0, 0, 0, 0, 0, 0, "bcdefgh"),
2351 #undef FILTER
2352 #define FILTER "(a == 1 || b == 1) && (c == 1 || d == 1) && " \
2353 	       "(e == 1 || f == 1) && (g == 1 || h == 1)"
2354 	DATA_REC(NO,  0, 0, 1, 1, 1, 1, 1, 1, "dfh"),
2355 	DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2356 	DATA_REC(YES, 1, 0, 1, 0, 0, 1, 0, 1, "bd"),
2357 	DATA_REC(NO,  1, 0, 1, 0, 0, 1, 0, 0, "bd"),
2358 #undef FILTER
2359 #define FILTER "(a == 1 && b == 1) || (c == 1 && d == 1) || " \
2360 	       "(e == 1 && f == 1) || (g == 1 && h == 1)"
2361 	DATA_REC(YES, 1, 0, 1, 1, 1, 1, 1, 1, "efgh"),
2362 	DATA_REC(YES, 0, 0, 0, 0, 0, 0, 1, 1, ""),
2363 	DATA_REC(NO,  0, 0, 0, 0, 0, 0, 0, 1, ""),
2364 #undef FILTER
2365 #define FILTER "(a == 1 && b == 1) && (c == 1 && d == 1) && " \
2366 	       "(e == 1 && f == 1) || (g == 1 && h == 1)"
2367 	DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 0, "gh"),
2368 	DATA_REC(NO,  0, 0, 0, 0, 0, 0, 0, 1, ""),
2369 	DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, ""),
2370 #undef FILTER
2371 #define FILTER "((a == 1 || b == 1) || (c == 1 || d == 1) || " \
2372 	       "(e == 1 || f == 1)) && (g == 1 || h == 1)"
2373 	DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 1, "bcdef"),
2374 	DATA_REC(NO,  0, 0, 0, 0, 0, 0, 0, 0, ""),
2375 	DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, "h"),
2376 #undef FILTER
2377 #define FILTER "((((((((a == 1) && (b == 1)) || (c == 1)) && (d == 1)) || " \
2378 	       "(e == 1)) && (f == 1)) || (g == 1)) && (h == 1))"
2379 	DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "ceg"),
2380 	DATA_REC(NO,  0, 1, 0, 1, 0, 1, 0, 1, ""),
2381 	DATA_REC(NO,  1, 0, 1, 0, 1, 0, 1, 0, ""),
2382 #undef FILTER
2383 #define FILTER "((((((((a == 1) || (b == 1)) && (c == 1)) || (d == 1)) && " \
2384 	       "(e == 1)) || (f == 1)) && (g == 1)) || (h == 1))"
2385 	DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "bdfh"),
2386 	DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2387 	DATA_REC(YES, 1, 0, 1, 0, 1, 0, 1, 0, "bdfh"),
2388 };
2389 
2390 #undef DATA_REC
2391 #undef FILTER
2392 #undef YES
2393 #undef NO
2394 
2395 #define DATA_CNT (sizeof(test_filter_data)/sizeof(struct test_filter_data_t))
2396 
2397 static int test_pred_visited;
2398 
test_pred_visited_fn(struct filter_pred * pred,void * event)2399 static int test_pred_visited_fn(struct filter_pred *pred, void *event)
2400 {
2401 	struct ftrace_event_field *field = pred->field;
2402 
2403 	test_pred_visited = 1;
2404 	printk(KERN_INFO "\npred visited %s\n", field->name);
2405 	return 1;
2406 }
2407 
test_walk_pred_cb(enum move_type move,struct filter_pred * pred,int * err,void * data)2408 static int test_walk_pred_cb(enum move_type move, struct filter_pred *pred,
2409 			     int *err, void *data)
2410 {
2411 	char *fields = data;
2412 
2413 	if ((move == MOVE_DOWN) &&
2414 	    (pred->left == FILTER_PRED_INVALID)) {
2415 		struct ftrace_event_field *field = pred->field;
2416 
2417 		if (!field) {
2418 			WARN(1, "all leafs should have field defined");
2419 			return WALK_PRED_DEFAULT;
2420 		}
2421 		if (!strchr(fields, *field->name))
2422 			return WALK_PRED_DEFAULT;
2423 
2424 		WARN_ON(!pred->fn);
2425 		pred->fn = test_pred_visited_fn;
2426 	}
2427 	return WALK_PRED_DEFAULT;
2428 }
2429 
ftrace_test_event_filter(void)2430 static __init int ftrace_test_event_filter(void)
2431 {
2432 	int i;
2433 
2434 	printk(KERN_INFO "Testing ftrace filter: ");
2435 
2436 	for (i = 0; i < DATA_CNT; i++) {
2437 		struct event_filter *filter = NULL;
2438 		struct test_filter_data_t *d = &test_filter_data[i];
2439 		int err;
2440 
2441 		err = create_filter(&event_ftrace_test_filter, d->filter,
2442 				    false, &filter);
2443 		if (err) {
2444 			printk(KERN_INFO
2445 			       "Failed to get filter for '%s', err %d\n",
2446 			       d->filter, err);
2447 			__free_filter(filter);
2448 			break;
2449 		}
2450 
2451 		/*
2452 		 * The preemption disabling is not really needed for self
2453 		 * tests, but the rcu dereference will complain without it.
2454 		 */
2455 		preempt_disable();
2456 		if (*d->not_visited)
2457 			walk_pred_tree(filter->preds, filter->root,
2458 				       test_walk_pred_cb,
2459 				       d->not_visited);
2460 
2461 		test_pred_visited = 0;
2462 		err = filter_match_preds(filter, &d->rec);
2463 		preempt_enable();
2464 
2465 		__free_filter(filter);
2466 
2467 		if (test_pred_visited) {
2468 			printk(KERN_INFO
2469 			       "Failed, unwanted pred visited for filter %s\n",
2470 			       d->filter);
2471 			break;
2472 		}
2473 
2474 		if (err != d->match) {
2475 			printk(KERN_INFO
2476 			       "Failed to match filter '%s', expected %d\n",
2477 			       d->filter, d->match);
2478 			break;
2479 		}
2480 	}
2481 
2482 	if (i == DATA_CNT)
2483 		printk(KERN_CONT "OK\n");
2484 
2485 	return 0;
2486 }
2487 
2488 late_initcall(ftrace_test_event_filter);
2489 
2490 #endif /* CONFIG_FTRACE_STARTUP_TEST */
2491