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