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