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