92672016da284ddaa8a004237425d2d393995faf
[safe/jmp/linux-2.6] / 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
25 #include "trace.h"
26 #include "trace_output.h"
27
28 enum filter_op_ids
29 {
30         OP_OR,
31         OP_AND,
32         OP_NE,
33         OP_EQ,
34         OP_LT,
35         OP_LE,
36         OP_GT,
37         OP_GE,
38         OP_NONE,
39         OP_OPEN_PAREN,
40 };
41
42 struct filter_op {
43         int id;
44         char *string;
45         int precedence;
46 };
47
48 static struct filter_op filter_ops[] = {
49         { OP_OR, "||", 1 },
50         { OP_AND, "&&", 2 },
51         { OP_NE, "!=", 4 },
52         { OP_EQ, "==", 4 },
53         { OP_LT, "<", 5 },
54         { OP_LE, "<=", 5 },
55         { OP_GT, ">", 5 },
56         { OP_GE, ">=", 5 },
57         { OP_NONE, "OP_NONE", 0 },
58         { OP_OPEN_PAREN, "(", 0 },
59 };
60
61 enum {
62         FILT_ERR_NONE,
63         FILT_ERR_INVALID_OP,
64         FILT_ERR_UNBALANCED_PAREN,
65         FILT_ERR_TOO_MANY_OPERANDS,
66         FILT_ERR_OPERAND_TOO_LONG,
67         FILT_ERR_FIELD_NOT_FOUND,
68         FILT_ERR_ILLEGAL_FIELD_OP,
69         FILT_ERR_ILLEGAL_INTVAL,
70         FILT_ERR_BAD_SUBSYS_FILTER,
71         FILT_ERR_TOO_MANY_PREDS,
72         FILT_ERR_MISSING_FIELD,
73         FILT_ERR_INVALID_FILTER,
74 };
75
76 static char *err_text[] = {
77         "No error",
78         "Invalid operator",
79         "Unbalanced parens",
80         "Too many operands",
81         "Operand too long",
82         "Field not found",
83         "Illegal operation for field type",
84         "Illegal integer value",
85         "Couldn't find or set field in one of a subsystem's events",
86         "Too many terms in predicate expression",
87         "Missing field name and/or value",
88         "Meaningless filter expression",
89 };
90
91 struct opstack_op {
92         int op;
93         struct list_head list;
94 };
95
96 struct postfix_elt {
97         int op;
98         char *operand;
99         struct list_head list;
100 };
101
102 struct filter_parse_state {
103         struct filter_op *ops;
104         struct list_head opstack;
105         struct list_head postfix;
106         int lasterr;
107         int lasterr_pos;
108
109         struct {
110                 char *string;
111                 unsigned int cnt;
112                 unsigned int tail;
113         } infix;
114
115         struct {
116                 char string[MAX_FILTER_STR_VAL];
117                 int pos;
118                 unsigned int tail;
119         } operand;
120 };
121
122 #define DEFINE_COMPARISON_PRED(type)                                    \
123 static int filter_pred_##type(struct filter_pred *pred, void *event,    \
124                               int val1, int val2)                       \
125 {                                                                       \
126         type *addr = (type *)(event + pred->offset);                    \
127         type val = (type)pred->val;                                     \
128         int match = 0;                                                  \
129                                                                         \
130         switch (pred->op) {                                             \
131         case OP_LT:                                                     \
132                 match = (*addr < val);                                  \
133                 break;                                                  \
134         case OP_LE:                                                     \
135                 match = (*addr <= val);                                 \
136                 break;                                                  \
137         case OP_GT:                                                     \
138                 match = (*addr > val);                                  \
139                 break;                                                  \
140         case OP_GE:                                                     \
141                 match = (*addr >= val);                                 \
142                 break;                                                  \
143         default:                                                        \
144                 break;                                                  \
145         }                                                               \
146                                                                         \
147         return match;                                                   \
148 }
149
150 #define DEFINE_EQUALITY_PRED(size)                                      \
151 static int filter_pred_##size(struct filter_pred *pred, void *event,    \
152                               int val1, int val2)                       \
153 {                                                                       \
154         u##size *addr = (u##size *)(event + pred->offset);              \
155         u##size val = (u##size)pred->val;                               \
156         int match;                                                      \
157                                                                         \
158         match = (val == *addr) ^ pred->not;                             \
159                                                                         \
160         return match;                                                   \
161 }
162
163 DEFINE_COMPARISON_PRED(s64);
164 DEFINE_COMPARISON_PRED(u64);
165 DEFINE_COMPARISON_PRED(s32);
166 DEFINE_COMPARISON_PRED(u32);
167 DEFINE_COMPARISON_PRED(s16);
168 DEFINE_COMPARISON_PRED(u16);
169 DEFINE_COMPARISON_PRED(s8);
170 DEFINE_COMPARISON_PRED(u8);
171
172 DEFINE_EQUALITY_PRED(64);
173 DEFINE_EQUALITY_PRED(32);
174 DEFINE_EQUALITY_PRED(16);
175 DEFINE_EQUALITY_PRED(8);
176
177 static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
178                            void *event __attribute((unused)),
179                            int val1, int val2)
180 {
181         return val1 && val2;
182 }
183
184 static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
185                           void *event __attribute((unused)),
186                           int val1, int val2)
187 {
188         return val1 || val2;
189 }
190
191 /* Filter predicate for fixed sized arrays of characters */
192 static int filter_pred_string(struct filter_pred *pred, void *event,
193                               int val1, int val2)
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                              int val1, int val2)
208 {
209         char **addr = (char **)(event + pred->offset);
210         int cmp, match;
211
212         cmp = pred->regex.match(*addr, &pred->regex, pred->regex.field_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                               int val1, int val2)
231 {
232         u32 str_item = *(u32 *)(event + pred->offset);
233         int str_loc = str_item & 0xffff;
234         int str_len = str_item >> 16;
235         char *addr = (char *)(event + str_loc);
236         int cmp, match;
237
238         cmp = pred->regex.match(addr, &pred->regex, str_len);
239
240         match = cmp ^ pred->not;
241
242         return match;
243 }
244
245 static int filter_pred_none(struct filter_pred *pred, void *event,
246                             int val1, int val2)
247 {
248         return 0;
249 }
250
251 /* Basic regex callbacks */
252 static int regex_match_full(char *str, struct regex *r, int len)
253 {
254         if (strncmp(str, r->pattern, len) == 0)
255                 return 1;
256         return 0;
257 }
258
259 static int regex_match_front(char *str, struct regex *r, int len)
260 {
261         if (strncmp(str, r->pattern, len) == 0)
262                 return 1;
263         return 0;
264 }
265
266 static int regex_match_middle(char *str, struct regex *r, int len)
267 {
268         if (strstr(str, r->pattern))
269                 return 1;
270         return 0;
271 }
272
273 static int regex_match_end(char *str, struct regex *r, int len)
274 {
275         char *ptr = strstr(str, r->pattern);
276
277         if (ptr && (ptr[r->len] == 0))
278                 return 1;
279         return 0;
280 }
281
282 /**
283  * filter_parse_regex - parse a basic regex
284  * @buff:   the raw regex
285  * @len:    length of the regex
286  * @search: will point to the beginning of the string to compare
287  * @not:    tell whether the match will have to be inverted
288  *
289  * This passes in a buffer containing a regex and this function will
290  * set search to point to the search part of the buffer and
291  * return the type of search it is (see enum above).
292  * This does modify buff.
293  *
294  * Returns enum type.
295  *  search returns the pointer to use for comparison.
296  *  not returns 1 if buff started with a '!'
297  *     0 otherwise.
298  */
299 enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
300 {
301         int type = MATCH_FULL;
302         int i;
303
304         if (buff[0] == '!') {
305                 *not = 1;
306                 buff++;
307                 len--;
308         } else
309                 *not = 0;
310
311         *search = buff;
312
313         for (i = 0; i < len; i++) {
314                 if (buff[i] == '*') {
315                         if (!i) {
316                                 *search = buff + 1;
317                                 type = MATCH_END_ONLY;
318                         } else {
319                                 if (type == MATCH_END_ONLY)
320                                         type = MATCH_MIDDLE_ONLY;
321                                 else
322                                         type = MATCH_FRONT_ONLY;
323                                 buff[i] = 0;
324                                 break;
325                         }
326                 }
327         }
328
329         return type;
330 }
331
332 static int filter_build_regex(struct filter_pred *pred)
333 {
334         struct regex *r = &pred->regex;
335         char *search, *dup;
336         enum regex_type type;
337         int not;
338
339         type = filter_parse_regex(r->pattern, r->len, &search, &not);
340         dup = kstrdup(search, GFP_KERNEL);
341         if (!dup)
342                 return -ENOMEM;
343
344         strcpy(r->pattern, dup);
345         kfree(dup);
346
347         r->len = strlen(r->pattern);
348
349         switch (type) {
350         case MATCH_FULL:
351                 r->match = regex_match_full;
352                 break;
353         case MATCH_FRONT_ONLY:
354                 r->match = regex_match_front;
355                 break;
356         case MATCH_MIDDLE_ONLY:
357                 r->match = regex_match_middle;
358                 break;
359         case MATCH_END_ONLY:
360                 r->match = regex_match_end;
361                 break;
362         }
363
364         pred->not ^= not;
365
366         return 0;
367 }
368
369 /* return 1 if event matches, 0 otherwise (discard) */
370 int filter_match_preds(struct ftrace_event_call *call, void *rec)
371 {
372         struct event_filter *filter = call->filter;
373         int match, top = 0, val1 = 0, val2 = 0;
374         int stack[MAX_FILTER_PRED];
375         struct filter_pred *pred;
376         int i;
377
378         for (i = 0; i < filter->n_preds; i++) {
379                 pred = filter->preds[i];
380                 if (!pred->pop_n) {
381                         match = pred->fn(pred, rec, val1, val2);
382                         stack[top++] = match;
383                         continue;
384                 }
385                 if (pred->pop_n > top) {
386                         WARN_ON_ONCE(1);
387                         return 0;
388                 }
389                 val1 = stack[--top];
390                 val2 = stack[--top];
391                 match = pred->fn(pred, rec, val1, val2);
392                 stack[top++] = match;
393         }
394
395         return stack[--top];
396 }
397 EXPORT_SYMBOL_GPL(filter_match_preds);
398
399 static void parse_error(struct filter_parse_state *ps, int err, int pos)
400 {
401         ps->lasterr = err;
402         ps->lasterr_pos = pos;
403 }
404
405 static void remove_filter_string(struct event_filter *filter)
406 {
407         kfree(filter->filter_string);
408         filter->filter_string = NULL;
409 }
410
411 static int replace_filter_string(struct event_filter *filter,
412                                  char *filter_string)
413 {
414         kfree(filter->filter_string);
415         filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
416         if (!filter->filter_string)
417                 return -ENOMEM;
418
419         return 0;
420 }
421
422 static int append_filter_string(struct event_filter *filter,
423                                 char *string)
424 {
425         int newlen;
426         char *new_filter_string;
427
428         BUG_ON(!filter->filter_string);
429         newlen = strlen(filter->filter_string) + strlen(string) + 1;
430         new_filter_string = kmalloc(newlen, GFP_KERNEL);
431         if (!new_filter_string)
432                 return -ENOMEM;
433
434         strcpy(new_filter_string, filter->filter_string);
435         strcat(new_filter_string, string);
436         kfree(filter->filter_string);
437         filter->filter_string = new_filter_string;
438
439         return 0;
440 }
441
442 static void append_filter_err(struct filter_parse_state *ps,
443                               struct event_filter *filter)
444 {
445         int pos = ps->lasterr_pos;
446         char *buf, *pbuf;
447
448         buf = (char *)__get_free_page(GFP_TEMPORARY);
449         if (!buf)
450                 return;
451
452         append_filter_string(filter, "\n");
453         memset(buf, ' ', PAGE_SIZE);
454         if (pos > PAGE_SIZE - 128)
455                 pos = 0;
456         buf[pos] = '^';
457         pbuf = &buf[pos] + 1;
458
459         sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
460         append_filter_string(filter, buf);
461         free_page((unsigned long) buf);
462 }
463
464 void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
465 {
466         struct event_filter *filter = call->filter;
467
468         mutex_lock(&event_mutex);
469         if (filter && filter->filter_string)
470                 trace_seq_printf(s, "%s\n", filter->filter_string);
471         else
472                 trace_seq_printf(s, "none\n");
473         mutex_unlock(&event_mutex);
474 }
475
476 void print_subsystem_event_filter(struct event_subsystem *system,
477                                   struct trace_seq *s)
478 {
479         struct event_filter *filter = system->filter;
480
481         mutex_lock(&event_mutex);
482         if (filter && filter->filter_string)
483                 trace_seq_printf(s, "%s\n", filter->filter_string);
484         else
485                 trace_seq_printf(s, "none\n");
486         mutex_unlock(&event_mutex);
487 }
488
489 static struct ftrace_event_field *
490 find_event_field(struct ftrace_event_call *call, char *name)
491 {
492         struct ftrace_event_field *field;
493
494         list_for_each_entry(field, &call->fields, link) {
495                 if (!strcmp(field->name, name))
496                         return field;
497         }
498
499         return NULL;
500 }
501
502 static void filter_free_pred(struct filter_pred *pred)
503 {
504         if (!pred)
505                 return;
506
507         kfree(pred->field_name);
508         kfree(pred);
509 }
510
511 static void filter_clear_pred(struct filter_pred *pred)
512 {
513         kfree(pred->field_name);
514         pred->field_name = NULL;
515         pred->regex.len = 0;
516 }
517
518 static int filter_set_pred(struct filter_pred *dest,
519                            struct filter_pred *src,
520                            filter_pred_fn_t fn)
521 {
522         *dest = *src;
523         if (src->field_name) {
524                 dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
525                 if (!dest->field_name)
526                         return -ENOMEM;
527         }
528         dest->fn = fn;
529
530         return 0;
531 }
532
533 static void filter_disable_preds(struct ftrace_event_call *call)
534 {
535         struct event_filter *filter = call->filter;
536         int i;
537
538         call->filter_active = 0;
539         filter->n_preds = 0;
540
541         for (i = 0; i < MAX_FILTER_PRED; i++)
542                 filter->preds[i]->fn = filter_pred_none;
543 }
544
545 void destroy_preds(struct ftrace_event_call *call)
546 {
547         struct event_filter *filter = call->filter;
548         int i;
549
550         if (!filter)
551                 return;
552
553         for (i = 0; i < MAX_FILTER_PRED; i++) {
554                 if (filter->preds[i])
555                         filter_free_pred(filter->preds[i]);
556         }
557         kfree(filter->preds);
558         kfree(filter->filter_string);
559         kfree(filter);
560         call->filter = NULL;
561 }
562
563 static int init_preds(struct ftrace_event_call *call)
564 {
565         struct event_filter *filter;
566         struct filter_pred *pred;
567         int i;
568
569         if (call->filter)
570                 return 0;
571
572         filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
573         if (!call->filter)
574                 return -ENOMEM;
575
576         filter->n_preds = 0;
577
578         filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
579         if (!filter->preds)
580                 goto oom;
581
582         for (i = 0; i < MAX_FILTER_PRED; i++) {
583                 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
584                 if (!pred)
585                         goto oom;
586                 pred->fn = filter_pred_none;
587                 filter->preds[i] = pred;
588         }
589
590         return 0;
591
592 oom:
593         destroy_preds(call);
594
595         return -ENOMEM;
596 }
597
598 static int init_subsystem_preds(struct event_subsystem *system)
599 {
600         struct ftrace_event_call *call;
601         int err;
602
603         list_for_each_entry(call, &ftrace_events, list) {
604                 if (!call->define_fields)
605                         continue;
606
607                 if (strcmp(call->system, system->name) != 0)
608                         continue;
609
610                 err = init_preds(call);
611                 if (err)
612                         return err;
613         }
614
615         return 0;
616 }
617
618 enum {
619         FILTER_DISABLE_ALL,
620         FILTER_INIT_NO_RESET,
621         FILTER_SKIP_NO_RESET,
622 };
623
624 static void filter_free_subsystem_preds(struct event_subsystem *system,
625                                         int flag)
626 {
627         struct ftrace_event_call *call;
628
629         list_for_each_entry(call, &ftrace_events, list) {
630                 if (!call->define_fields)
631                         continue;
632
633                 if (strcmp(call->system, system->name) != 0)
634                         continue;
635
636                 if (flag == FILTER_INIT_NO_RESET) {
637                         call->filter->no_reset = false;
638                         continue;
639                 }
640
641                 if (flag == FILTER_SKIP_NO_RESET && call->filter->no_reset)
642                         continue;
643
644                 filter_disable_preds(call);
645                 remove_filter_string(call->filter);
646         }
647 }
648
649 static int filter_add_pred_fn(struct filter_parse_state *ps,
650                               struct ftrace_event_call *call,
651                               struct filter_pred *pred,
652                               filter_pred_fn_t fn)
653 {
654         struct event_filter *filter = call->filter;
655         int idx, err;
656
657         if (filter->n_preds == MAX_FILTER_PRED) {
658                 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
659                 return -ENOSPC;
660         }
661
662         idx = filter->n_preds;
663         filter_clear_pred(filter->preds[idx]);
664         err = filter_set_pred(filter->preds[idx], pred, fn);
665         if (err)
666                 return err;
667
668         filter->n_preds++;
669         call->filter_active = 1;
670
671         return 0;
672 }
673
674 int filter_assign_type(const char *type)
675 {
676         if (strstr(type, "__data_loc") && strstr(type, "char"))
677                 return FILTER_DYN_STRING;
678
679         if (strchr(type, '[') && strstr(type, "char"))
680                 return FILTER_STATIC_STRING;
681
682         return FILTER_OTHER;
683 }
684
685 static bool is_string_field(struct ftrace_event_field *field)
686 {
687         return field->filter_type == FILTER_DYN_STRING ||
688                field->filter_type == FILTER_STATIC_STRING ||
689                field->filter_type == FILTER_PTR_STRING;
690 }
691
692 static int is_legal_op(struct ftrace_event_field *field, int op)
693 {
694         if (is_string_field(field) && (op != OP_EQ && op != OP_NE))
695                 return 0;
696
697         return 1;
698 }
699
700 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
701                                              int field_is_signed)
702 {
703         filter_pred_fn_t fn = NULL;
704
705         switch (field_size) {
706         case 8:
707                 if (op == OP_EQ || op == OP_NE)
708                         fn = filter_pred_64;
709                 else if (field_is_signed)
710                         fn = filter_pred_s64;
711                 else
712                         fn = filter_pred_u64;
713                 break;
714         case 4:
715                 if (op == OP_EQ || op == OP_NE)
716                         fn = filter_pred_32;
717                 else if (field_is_signed)
718                         fn = filter_pred_s32;
719                 else
720                         fn = filter_pred_u32;
721                 break;
722         case 2:
723                 if (op == OP_EQ || op == OP_NE)
724                         fn = filter_pred_16;
725                 else if (field_is_signed)
726                         fn = filter_pred_s16;
727                 else
728                         fn = filter_pred_u16;
729                 break;
730         case 1:
731                 if (op == OP_EQ || op == OP_NE)
732                         fn = filter_pred_8;
733                 else if (field_is_signed)
734                         fn = filter_pred_s8;
735                 else
736                         fn = filter_pred_u8;
737                 break;
738         }
739
740         return fn;
741 }
742
743 static int filter_add_pred(struct filter_parse_state *ps,
744                            struct ftrace_event_call *call,
745                            struct filter_pred *pred,
746                            bool dry_run)
747 {
748         struct ftrace_event_field *field;
749         filter_pred_fn_t fn;
750         unsigned long long val;
751         int ret;
752
753         pred->fn = filter_pred_none;
754
755         if (pred->op == OP_AND) {
756                 pred->pop_n = 2;
757                 fn = filter_pred_and;
758                 goto add_pred_fn;
759         } else if (pred->op == OP_OR) {
760                 pred->pop_n = 2;
761                 fn = filter_pred_or;
762                 goto add_pred_fn;
763         }
764
765         field = find_event_field(call, pred->field_name);
766         if (!field) {
767                 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
768                 return -EINVAL;
769         }
770
771         pred->offset = field->offset;
772
773         if (!is_legal_op(field, pred->op)) {
774                 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
775                 return -EINVAL;
776         }
777
778         if (is_string_field(field)) {
779                 ret = filter_build_regex(pred);
780                 if (ret)
781                         return ret;
782
783                 if (field->filter_type == FILTER_STATIC_STRING) {
784                         fn = filter_pred_string;
785                         pred->regex.field_len = field->size;
786                 } else if (field->filter_type == FILTER_DYN_STRING)
787                                 fn = filter_pred_strloc;
788                 else {
789                         fn = filter_pred_pchar;
790                         pred->regex.field_len = strlen(pred->regex.pattern);
791                 }
792         } else {
793                 if (field->is_signed)
794                         ret = strict_strtoll(pred->regex.pattern, 0, &val);
795                 else
796                         ret = strict_strtoull(pred->regex.pattern, 0, &val);
797                 if (ret) {
798                         parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
799                         return -EINVAL;
800                 }
801                 pred->val = val;
802
803                 fn = select_comparison_fn(pred->op, field->size,
804                                           field->is_signed);
805                 if (!fn) {
806                         parse_error(ps, FILT_ERR_INVALID_OP, 0);
807                         return -EINVAL;
808                 }
809         }
810
811         if (pred->op == OP_NE)
812                 pred->not = 1;
813
814 add_pred_fn:
815         if (!dry_run)
816                 return filter_add_pred_fn(ps, call, pred, fn);
817         return 0;
818 }
819
820 static int filter_add_subsystem_pred(struct filter_parse_state *ps,
821                                      struct event_subsystem *system,
822                                      struct filter_pred *pred,
823                                      char *filter_string,
824                                      bool dry_run)
825 {
826         struct ftrace_event_call *call;
827         int err = 0;
828         bool fail = true;
829
830         list_for_each_entry(call, &ftrace_events, list) {
831
832                 if (!call->define_fields)
833                         continue;
834
835                 if (strcmp(call->system, system->name))
836                         continue;
837
838                 if (call->filter->no_reset)
839                         continue;
840
841                 err = filter_add_pred(ps, call, pred, dry_run);
842                 if (err)
843                         call->filter->no_reset = true;
844                 else
845                         fail = false;
846
847                 if (!dry_run)
848                         replace_filter_string(call->filter, filter_string);
849         }
850
851         if (fail) {
852                 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
853                 return err;
854         }
855         return 0;
856 }
857
858 static void parse_init(struct filter_parse_state *ps,
859                        struct filter_op *ops,
860                        char *infix_string)
861 {
862         memset(ps, '\0', sizeof(*ps));
863
864         ps->infix.string = infix_string;
865         ps->infix.cnt = strlen(infix_string);
866         ps->ops = ops;
867
868         INIT_LIST_HEAD(&ps->opstack);
869         INIT_LIST_HEAD(&ps->postfix);
870 }
871
872 static char infix_next(struct filter_parse_state *ps)
873 {
874         ps->infix.cnt--;
875
876         return ps->infix.string[ps->infix.tail++];
877 }
878
879 static char infix_peek(struct filter_parse_state *ps)
880 {
881         if (ps->infix.tail == strlen(ps->infix.string))
882                 return 0;
883
884         return ps->infix.string[ps->infix.tail];
885 }
886
887 static void infix_advance(struct filter_parse_state *ps)
888 {
889         ps->infix.cnt--;
890         ps->infix.tail++;
891 }
892
893 static inline int is_precedence_lower(struct filter_parse_state *ps,
894                                       int a, int b)
895 {
896         return ps->ops[a].precedence < ps->ops[b].precedence;
897 }
898
899 static inline int is_op_char(struct filter_parse_state *ps, char c)
900 {
901         int i;
902
903         for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
904                 if (ps->ops[i].string[0] == c)
905                         return 1;
906         }
907
908         return 0;
909 }
910
911 static int infix_get_op(struct filter_parse_state *ps, char firstc)
912 {
913         char nextc = infix_peek(ps);
914         char opstr[3];
915         int i;
916
917         opstr[0] = firstc;
918         opstr[1] = nextc;
919         opstr[2] = '\0';
920
921         for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
922                 if (!strcmp(opstr, ps->ops[i].string)) {
923                         infix_advance(ps);
924                         return ps->ops[i].id;
925                 }
926         }
927
928         opstr[1] = '\0';
929
930         for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
931                 if (!strcmp(opstr, ps->ops[i].string))
932                         return ps->ops[i].id;
933         }
934
935         return OP_NONE;
936 }
937
938 static inline void clear_operand_string(struct filter_parse_state *ps)
939 {
940         memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
941         ps->operand.tail = 0;
942 }
943
944 static inline int append_operand_char(struct filter_parse_state *ps, char c)
945 {
946         if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
947                 return -EINVAL;
948
949         ps->operand.string[ps->operand.tail++] = c;
950
951         return 0;
952 }
953
954 static int filter_opstack_push(struct filter_parse_state *ps, int op)
955 {
956         struct opstack_op *opstack_op;
957
958         opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
959         if (!opstack_op)
960                 return -ENOMEM;
961
962         opstack_op->op = op;
963         list_add(&opstack_op->list, &ps->opstack);
964
965         return 0;
966 }
967
968 static int filter_opstack_empty(struct filter_parse_state *ps)
969 {
970         return list_empty(&ps->opstack);
971 }
972
973 static int filter_opstack_top(struct filter_parse_state *ps)
974 {
975         struct opstack_op *opstack_op;
976
977         if (filter_opstack_empty(ps))
978                 return OP_NONE;
979
980         opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
981
982         return opstack_op->op;
983 }
984
985 static int filter_opstack_pop(struct filter_parse_state *ps)
986 {
987         struct opstack_op *opstack_op;
988         int op;
989
990         if (filter_opstack_empty(ps))
991                 return OP_NONE;
992
993         opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
994         op = opstack_op->op;
995         list_del(&opstack_op->list);
996
997         kfree(opstack_op);
998
999         return op;
1000 }
1001
1002 static void filter_opstack_clear(struct filter_parse_state *ps)
1003 {
1004         while (!filter_opstack_empty(ps))
1005                 filter_opstack_pop(ps);
1006 }
1007
1008 static char *curr_operand(struct filter_parse_state *ps)
1009 {
1010         return ps->operand.string;
1011 }
1012
1013 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
1014 {
1015         struct postfix_elt *elt;
1016
1017         elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1018         if (!elt)
1019                 return -ENOMEM;
1020
1021         elt->op = OP_NONE;
1022         elt->operand = kstrdup(operand, GFP_KERNEL);
1023         if (!elt->operand) {
1024                 kfree(elt);
1025                 return -ENOMEM;
1026         }
1027
1028         list_add_tail(&elt->list, &ps->postfix);
1029
1030         return 0;
1031 }
1032
1033 static int postfix_append_op(struct filter_parse_state *ps, int op)
1034 {
1035         struct postfix_elt *elt;
1036
1037         elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1038         if (!elt)
1039                 return -ENOMEM;
1040
1041         elt->op = op;
1042         elt->operand = NULL;
1043
1044         list_add_tail(&elt->list, &ps->postfix);
1045
1046         return 0;
1047 }
1048
1049 static void postfix_clear(struct filter_parse_state *ps)
1050 {
1051         struct postfix_elt *elt;
1052
1053         while (!list_empty(&ps->postfix)) {
1054                 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
1055                 list_del(&elt->list);
1056                 kfree(elt->operand);
1057                 kfree(elt);
1058         }
1059 }
1060
1061 static int filter_parse(struct filter_parse_state *ps)
1062 {
1063         int in_string = 0;
1064         int op, top_op;
1065         char ch;
1066
1067         while ((ch = infix_next(ps))) {
1068                 if (ch == '"') {
1069                         in_string ^= 1;
1070                         continue;
1071                 }
1072
1073                 if (in_string)
1074                         goto parse_operand;
1075
1076                 if (isspace(ch))
1077                         continue;
1078
1079                 if (is_op_char(ps, ch)) {
1080                         op = infix_get_op(ps, ch);
1081                         if (op == OP_NONE) {
1082                                 parse_error(ps, FILT_ERR_INVALID_OP, 0);
1083                                 return -EINVAL;
1084                         }
1085
1086                         if (strlen(curr_operand(ps))) {
1087                                 postfix_append_operand(ps, curr_operand(ps));
1088                                 clear_operand_string(ps);
1089                         }
1090
1091                         while (!filter_opstack_empty(ps)) {
1092                                 top_op = filter_opstack_top(ps);
1093                                 if (!is_precedence_lower(ps, top_op, op)) {
1094                                         top_op = filter_opstack_pop(ps);
1095                                         postfix_append_op(ps, top_op);
1096                                         continue;
1097                                 }
1098                                 break;
1099                         }
1100
1101                         filter_opstack_push(ps, op);
1102                         continue;
1103                 }
1104
1105                 if (ch == '(') {
1106                         filter_opstack_push(ps, OP_OPEN_PAREN);
1107                         continue;
1108                 }
1109
1110                 if (ch == ')') {
1111                         if (strlen(curr_operand(ps))) {
1112                                 postfix_append_operand(ps, curr_operand(ps));
1113                                 clear_operand_string(ps);
1114                         }
1115
1116                         top_op = filter_opstack_pop(ps);
1117                         while (top_op != OP_NONE) {
1118                                 if (top_op == OP_OPEN_PAREN)
1119                                         break;
1120                                 postfix_append_op(ps, top_op);
1121                                 top_op = filter_opstack_pop(ps);
1122                         }
1123                         if (top_op == OP_NONE) {
1124                                 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1125                                 return -EINVAL;
1126                         }
1127                         continue;
1128                 }
1129 parse_operand:
1130                 if (append_operand_char(ps, ch)) {
1131                         parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1132                         return -EINVAL;
1133                 }
1134         }
1135
1136         if (strlen(curr_operand(ps)))
1137                 postfix_append_operand(ps, curr_operand(ps));
1138
1139         while (!filter_opstack_empty(ps)) {
1140                 top_op = filter_opstack_pop(ps);
1141                 if (top_op == OP_NONE)
1142                         break;
1143                 if (top_op == OP_OPEN_PAREN) {
1144                         parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1145                         return -EINVAL;
1146                 }
1147                 postfix_append_op(ps, top_op);
1148         }
1149
1150         return 0;
1151 }
1152
1153 static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
1154 {
1155         struct filter_pred *pred;
1156
1157         pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1158         if (!pred)
1159                 return NULL;
1160
1161         pred->field_name = kstrdup(operand1, GFP_KERNEL);
1162         if (!pred->field_name) {
1163                 kfree(pred);
1164                 return NULL;
1165         }
1166
1167         strcpy(pred->regex.pattern, operand2);
1168         pred->regex.len = strlen(pred->regex.pattern);
1169
1170         pred->op = op;
1171
1172         return pred;
1173 }
1174
1175 static struct filter_pred *create_logical_pred(int op)
1176 {
1177         struct filter_pred *pred;
1178
1179         pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1180         if (!pred)
1181                 return NULL;
1182
1183         pred->op = op;
1184
1185         return pred;
1186 }
1187
1188 static int check_preds(struct filter_parse_state *ps)
1189 {
1190         int n_normal_preds = 0, n_logical_preds = 0;
1191         struct postfix_elt *elt;
1192
1193         list_for_each_entry(elt, &ps->postfix, list) {
1194                 if (elt->op == OP_NONE)
1195                         continue;
1196
1197                 if (elt->op == OP_AND || elt->op == OP_OR) {
1198                         n_logical_preds++;
1199                         continue;
1200                 }
1201                 n_normal_preds++;
1202         }
1203
1204         if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
1205                 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
1206                 return -EINVAL;
1207         }
1208
1209         return 0;
1210 }
1211
1212 static int replace_preds(struct event_subsystem *system,
1213                          struct ftrace_event_call *call,
1214                          struct filter_parse_state *ps,
1215                          char *filter_string,
1216                          bool dry_run)
1217 {
1218         char *operand1 = NULL, *operand2 = NULL;
1219         struct filter_pred *pred;
1220         struct postfix_elt *elt;
1221         int err;
1222         int n_preds = 0;
1223
1224         err = check_preds(ps);
1225         if (err)
1226                 return err;
1227
1228         list_for_each_entry(elt, &ps->postfix, list) {
1229                 if (elt->op == OP_NONE) {
1230                         if (!operand1)
1231                                 operand1 = elt->operand;
1232                         else if (!operand2)
1233                                 operand2 = elt->operand;
1234                         else {
1235                                 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1236                                 return -EINVAL;
1237                         }
1238                         continue;
1239                 }
1240
1241                 if (n_preds++ == MAX_FILTER_PRED) {
1242                         parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1243                         return -ENOSPC;
1244                 }
1245
1246                 if (elt->op == OP_AND || elt->op == OP_OR) {
1247                         pred = create_logical_pred(elt->op);
1248                         goto add_pred;
1249                 }
1250
1251                 if (!operand1 || !operand2) {
1252                         parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1253                         return -EINVAL;
1254                 }
1255
1256                 pred = create_pred(elt->op, operand1, operand2);
1257 add_pred:
1258                 if (!pred)
1259                         return -ENOMEM;
1260                 if (call)
1261                         err = filter_add_pred(ps, call, pred, false);
1262                 else
1263                         err = filter_add_subsystem_pred(ps, system, pred,
1264                                                 filter_string, dry_run);
1265                 filter_free_pred(pred);
1266                 if (err)
1267                         return err;
1268
1269                 operand1 = operand2 = NULL;
1270         }
1271
1272         return 0;
1273 }
1274
1275 int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1276 {
1277         int err;
1278
1279         struct filter_parse_state *ps;
1280
1281         mutex_lock(&event_mutex);
1282
1283         err = init_preds(call);
1284         if (err)
1285                 goto out_unlock;
1286
1287         if (!strcmp(strstrip(filter_string), "0")) {
1288                 filter_disable_preds(call);
1289                 remove_filter_string(call->filter);
1290                 mutex_unlock(&event_mutex);
1291                 return 0;
1292         }
1293
1294         err = -ENOMEM;
1295         ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1296         if (!ps)
1297                 goto out_unlock;
1298
1299         filter_disable_preds(call);
1300         replace_filter_string(call->filter, filter_string);
1301
1302         parse_init(ps, filter_ops, filter_string);
1303         err = filter_parse(ps);
1304         if (err) {
1305                 append_filter_err(ps, call->filter);
1306                 goto out;
1307         }
1308
1309         err = replace_preds(NULL, call, ps, filter_string, false);
1310         if (err)
1311                 append_filter_err(ps, call->filter);
1312
1313 out:
1314         filter_opstack_clear(ps);
1315         postfix_clear(ps);
1316         kfree(ps);
1317 out_unlock:
1318         mutex_unlock(&event_mutex);
1319
1320         return err;
1321 }
1322
1323 int apply_subsystem_event_filter(struct event_subsystem *system,
1324                                  char *filter_string)
1325 {
1326         int err;
1327
1328         struct filter_parse_state *ps;
1329
1330         mutex_lock(&event_mutex);
1331
1332         err = init_subsystem_preds(system);
1333         if (err)
1334                 goto out_unlock;
1335
1336         if (!strcmp(strstrip(filter_string), "0")) {
1337                 filter_free_subsystem_preds(system, FILTER_DISABLE_ALL);
1338                 remove_filter_string(system->filter);
1339                 mutex_unlock(&event_mutex);
1340                 return 0;
1341         }
1342
1343         err = -ENOMEM;
1344         ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1345         if (!ps)
1346                 goto out_unlock;
1347
1348         replace_filter_string(system->filter, filter_string);
1349
1350         parse_init(ps, filter_ops, filter_string);
1351         err = filter_parse(ps);
1352         if (err) {
1353                 append_filter_err(ps, system->filter);
1354                 goto out;
1355         }
1356
1357         filter_free_subsystem_preds(system, FILTER_INIT_NO_RESET);
1358
1359         /* try to see the filter can be applied to which events */
1360         err = replace_preds(system, NULL, ps, filter_string, true);
1361         if (err) {
1362                 append_filter_err(ps, system->filter);
1363                 goto out;
1364         }
1365
1366         filter_free_subsystem_preds(system, FILTER_SKIP_NO_RESET);
1367
1368         /* really apply the filter to the events */
1369         err = replace_preds(system, NULL, ps, filter_string, false);
1370         if (err) {
1371                 append_filter_err(ps, system->filter);
1372                 filter_free_subsystem_preds(system, 2);
1373         }
1374
1375 out:
1376         filter_opstack_clear(ps);
1377         postfix_clear(ps);
1378         kfree(ps);
1379 out_unlock:
1380         mutex_unlock(&event_mutex);
1381
1382         return err;
1383 }
1384