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