GUI: Fix Tomato RAF theme for all builds. Compilation typo.
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / kernel / trace / trace_events_filter.c
blobf7ac346e200a3134b7354d2ecb8f937779e602cc
1 /*
2 * trace_events_filter - generic event filtering
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.
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.
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.
18 * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
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>
27 #include "trace.h"
28 #include "trace_output.h"
30 enum filter_op_ids
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,
45 struct filter_op {
46 int id;
47 char *string;
48 int precedence;
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 },
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,
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",
95 struct opstack_op {
96 int op;
97 struct list_head list;
100 struct postfix_elt {
101 int op;
102 char *operand;
103 struct list_head list;
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;
113 struct {
114 char *string;
115 unsigned int cnt;
116 unsigned int tail;
117 } infix;
119 struct {
120 char string[MAX_FILTER_STR_VAL];
121 int pos;
122 unsigned int tail;
123 } operand;
126 #define DEFINE_COMPARISON_PRED(type) \
127 static int filter_pred_##type(struct filter_pred *pred, void *event, \
128 int val1, int val2) \
130 type *addr = (type *)(event + pred->offset); \
131 type val = (type)pred->val; \
132 int match = 0; \
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; \
151 return match; \
154 #define DEFINE_EQUALITY_PRED(size) \
155 static int filter_pred_##size(struct filter_pred *pred, void *event, \
156 int val1, int val2) \
158 u##size *addr = (u##size *)(event + pred->offset); \
159 u##size val = (u##size)pred->val; \
160 int match; \
162 match = (val == *addr) ^ pred->not; \
164 return match; \
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);
176 DEFINE_EQUALITY_PRED(64);
177 DEFINE_EQUALITY_PRED(32);
178 DEFINE_EQUALITY_PRED(16);
179 DEFINE_EQUALITY_PRED(8);
181 static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
182 void *event __attribute((unused)),
183 int val1, int val2)
185 return val1 && val2;
188 static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
189 void *event __attribute((unused)),
190 int val1, int val2)
192 return val1 || val2;
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)
199 char *addr = (char *)(event + pred->offset);
200 int cmp, match;
202 cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
204 match = cmp ^ pred->not;
206 return match;
209 /* Filter predicate for char * pointers */
210 static int filter_pred_pchar(struct filter_pred *pred, void *event,
211 int val1, int val2)
213 char **addr = (char **)(event + pred->offset);
214 int cmp, match;
215 int len = strlen(*addr) + 1; /* including tailing '\0' */
217 cmp = pred->regex.match(*addr, &pred->regex, len);
219 match = cmp ^ pred->not;
221 return match;
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.
234 static int filter_pred_strloc(struct filter_pred *pred, void *event,
235 int val1, int val2)
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;
243 cmp = pred->regex.match(addr, &pred->regex, str_len);
245 match = cmp ^ pred->not;
247 return match;
250 static int filter_pred_none(struct filter_pred *pred, void *event,
251 int val1, int val2)
253 return 0;
257 * regex_match_foo - Basic regex callbacks
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')
263 * Note:
264 * - @str might not be NULL-terminated if it's of type DYN_STRING
265 * or STATIC_STRING
268 static int regex_match_full(char *str, struct regex *r, int len)
270 if (strncmp(str, r->pattern, len) == 0)
271 return 1;
272 return 0;
275 static int regex_match_front(char *str, struct regex *r, int len)
277 if (strncmp(str, r->pattern, r->len) == 0)
278 return 1;
279 return 0;
282 static int regex_match_middle(char *str, struct regex *r, int len)
284 if (strnstr(str, r->pattern, len))
285 return 1;
286 return 0;
289 static int regex_match_end(char *str, struct regex *r, int len)
291 int strlen = len - 1;
293 if (strlen >= r->len &&
294 memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
295 return 1;
296 return 0;
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
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.
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.
316 enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
318 int type = MATCH_FULL;
319 int i;
321 if (buff[0] == '!') {
322 *not = 1;
323 buff++;
324 len--;
325 } else
326 *not = 0;
328 *search = buff;
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;
346 return type;
349 static void filter_build_regex(struct filter_pred *pred)
351 struct regex *r = &pred->regex;
352 char *search;
353 enum regex_type type = MATCH_FULL;
354 int not = 0;
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);
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;
377 pred->not ^= not;
380 /* return 1 if event matches, 0 otherwise (discard) */
381 int filter_match_preds(struct event_filter *filter, void *rec)
383 int match, top = 0, val1 = 0, val2 = 0;
384 int stack[MAX_FILTER_PRED];
385 struct filter_pred *pred;
386 int i;
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;
395 if (pred->pop_n > top) {
396 WARN_ON_ONCE(1);
397 return 0;
399 val1 = stack[--top];
400 val2 = stack[--top];
401 match = pred->fn(pred, rec, val1, val2);
402 stack[top++] = match;
405 return stack[--top];
407 EXPORT_SYMBOL_GPL(filter_match_preds);
409 static void parse_error(struct filter_parse_state *ps, int err, int pos)
411 ps->lasterr = err;
412 ps->lasterr_pos = pos;
415 static void remove_filter_string(struct event_filter *filter)
417 kfree(filter->filter_string);
418 filter->filter_string = NULL;
421 static int replace_filter_string(struct event_filter *filter,
422 char *filter_string)
424 kfree(filter->filter_string);
425 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
426 if (!filter->filter_string)
427 return -ENOMEM;
429 return 0;
432 static int append_filter_string(struct event_filter *filter,
433 char *string)
435 int newlen;
436 char *new_filter_string;
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;
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;
449 return 0;
452 static void append_filter_err(struct filter_parse_state *ps,
453 struct event_filter *filter)
455 int pos = ps->lasterr_pos;
456 char *buf, *pbuf;
458 buf = (char *)__get_free_page(GFP_TEMPORARY);
459 if (!buf)
460 return;
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;
469 sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
470 append_filter_string(filter, buf);
471 free_page((unsigned long) buf);
474 void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
476 struct event_filter *filter = call->filter;
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);
486 void print_subsystem_event_filter(struct event_subsystem *system,
487 struct trace_seq *s)
489 struct event_filter *filter = system->filter;
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);
499 static struct ftrace_event_field *
500 __find_event_field(struct list_head *head, char *name)
502 struct ftrace_event_field *field;
504 list_for_each_entry(field, head, link) {
505 if (!strcmp(field->name, name))
506 return field;
509 return NULL;
512 static struct ftrace_event_field *
513 find_event_field(struct ftrace_event_call *call, char *name)
515 struct ftrace_event_field *field;
516 struct list_head *head;
518 field = __find_event_field(&ftrace_common_fields, name);
519 if (field)
520 return field;
522 head = trace_get_fields(call);
523 return __find_event_field(head, name);
526 static void filter_free_pred(struct filter_pred *pred)
528 if (!pred)
529 return;
531 kfree(pred->field_name);
532 kfree(pred);
535 static void filter_clear_pred(struct filter_pred *pred)
537 kfree(pred->field_name);
538 pred->field_name = NULL;
539 pred->regex.len = 0;
542 static int filter_set_pred(struct filter_pred *dest,
543 struct filter_pred *src,
544 filter_pred_fn_t fn)
546 *dest = *src;
547 if (src->field_name) {
548 dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
549 if (!dest->field_name)
550 return -ENOMEM;
552 dest->fn = fn;
554 return 0;
557 static void filter_disable_preds(struct ftrace_event_call *call)
559 struct event_filter *filter = call->filter;
560 int i;
562 call->flags &= ~TRACE_EVENT_FL_FILTERED;
563 filter->n_preds = 0;
565 for (i = 0; i < MAX_FILTER_PRED; i++)
566 filter->preds[i]->fn = filter_pred_none;
569 static void __free_preds(struct event_filter *filter)
571 int i;
573 if (!filter)
574 return;
576 for (i = 0; i < MAX_FILTER_PRED; i++) {
577 if (filter->preds[i])
578 filter_free_pred(filter->preds[i]);
580 kfree(filter->preds);
581 kfree(filter->filter_string);
582 kfree(filter);
585 void destroy_preds(struct ftrace_event_call *call)
587 __free_preds(call->filter);
588 call->filter = NULL;
589 call->flags &= ~TRACE_EVENT_FL_FILTERED;
592 static struct event_filter *__alloc_preds(void)
594 struct event_filter *filter;
595 struct filter_pred *pred;
596 int i;
598 filter = kzalloc(sizeof(*filter), GFP_KERNEL);
599 if (!filter)
600 return ERR_PTR(-ENOMEM);
602 filter->n_preds = 0;
604 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
605 if (!filter->preds)
606 goto oom;
608 for (i = 0; i < MAX_FILTER_PRED; i++) {
609 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
610 if (!pred)
611 goto oom;
612 pred->fn = filter_pred_none;
613 filter->preds[i] = pred;
616 return filter;
618 oom:
619 __free_preds(filter);
620 return ERR_PTR(-ENOMEM);
623 static int init_preds(struct ftrace_event_call *call)
625 if (call->filter)
626 return 0;
628 call->flags &= ~TRACE_EVENT_FL_FILTERED;
629 call->filter = __alloc_preds();
630 if (IS_ERR(call->filter))
631 return PTR_ERR(call->filter);
633 return 0;
636 static int init_subsystem_preds(struct event_subsystem *system)
638 struct ftrace_event_call *call;
639 int err;
641 list_for_each_entry(call, &ftrace_events, list) {
642 if (strcmp(call->class->system, system->name) != 0)
643 continue;
645 err = init_preds(call);
646 if (err)
647 return err;
650 return 0;
653 static void filter_free_subsystem_preds(struct event_subsystem *system)
655 struct ftrace_event_call *call;
657 list_for_each_entry(call, &ftrace_events, list) {
658 if (strcmp(call->class->system, system->name) != 0)
659 continue;
661 filter_disable_preds(call);
662 remove_filter_string(call->filter);
666 static int filter_add_pred_fn(struct filter_parse_state *ps,
667 struct ftrace_event_call *call,
668 struct event_filter *filter,
669 struct filter_pred *pred,
670 filter_pred_fn_t fn)
672 int idx, err;
674 if (filter->n_preds == MAX_FILTER_PRED) {
675 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
676 return -ENOSPC;
679 idx = filter->n_preds;
680 filter_clear_pred(filter->preds[idx]);
681 err = filter_set_pred(filter->preds[idx], pred, fn);
682 if (err)
683 return err;
685 filter->n_preds++;
687 return 0;
690 int filter_assign_type(const char *type)
692 if (strstr(type, "__data_loc") && strstr(type, "char"))
693 return FILTER_DYN_STRING;
695 if (strchr(type, '[') && strstr(type, "char"))
696 return FILTER_STATIC_STRING;
698 return FILTER_OTHER;
701 static bool is_string_field(struct ftrace_event_field *field)
703 return field->filter_type == FILTER_DYN_STRING ||
704 field->filter_type == FILTER_STATIC_STRING ||
705 field->filter_type == FILTER_PTR_STRING;
708 static int is_legal_op(struct ftrace_event_field *field, int op)
710 if (is_string_field(field) &&
711 (op != OP_EQ && op != OP_NE && op != OP_GLOB))
712 return 0;
713 if (!is_string_field(field) && op == OP_GLOB)
714 return 0;
716 return 1;
719 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
720 int field_is_signed)
722 filter_pred_fn_t fn = NULL;
724 switch (field_size) {
725 case 8:
726 if (op == OP_EQ || op == OP_NE)
727 fn = filter_pred_64;
728 else if (field_is_signed)
729 fn = filter_pred_s64;
730 else
731 fn = filter_pred_u64;
732 break;
733 case 4:
734 if (op == OP_EQ || op == OP_NE)
735 fn = filter_pred_32;
736 else if (field_is_signed)
737 fn = filter_pred_s32;
738 else
739 fn = filter_pred_u32;
740 break;
741 case 2:
742 if (op == OP_EQ || op == OP_NE)
743 fn = filter_pred_16;
744 else if (field_is_signed)
745 fn = filter_pred_s16;
746 else
747 fn = filter_pred_u16;
748 break;
749 case 1:
750 if (op == OP_EQ || op == OP_NE)
751 fn = filter_pred_8;
752 else if (field_is_signed)
753 fn = filter_pred_s8;
754 else
755 fn = filter_pred_u8;
756 break;
759 return fn;
762 static int filter_add_pred(struct filter_parse_state *ps,
763 struct ftrace_event_call *call,
764 struct event_filter *filter,
765 struct filter_pred *pred,
766 bool dry_run)
768 struct ftrace_event_field *field;
769 filter_pred_fn_t fn;
770 unsigned long long val;
771 int ret;
773 pred->fn = filter_pred_none;
775 if (pred->op == OP_AND) {
776 pred->pop_n = 2;
777 fn = filter_pred_and;
778 goto add_pred_fn;
779 } else if (pred->op == OP_OR) {
780 pred->pop_n = 2;
781 fn = filter_pred_or;
782 goto add_pred_fn;
785 field = find_event_field(call, pred->field_name);
786 if (!field) {
787 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
788 return -EINVAL;
791 pred->offset = field->offset;
793 if (!is_legal_op(field, pred->op)) {
794 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
795 return -EINVAL;
798 if (is_string_field(field)) {
799 filter_build_regex(pred);
801 if (field->filter_type == FILTER_STATIC_STRING) {
802 fn = filter_pred_string;
803 pred->regex.field_len = field->size;
804 } else if (field->filter_type == FILTER_DYN_STRING)
805 fn = filter_pred_strloc;
806 else
807 fn = filter_pred_pchar;
808 } else {
809 if (field->is_signed)
810 ret = strict_strtoll(pred->regex.pattern, 0, &val);
811 else
812 ret = strict_strtoull(pred->regex.pattern, 0, &val);
813 if (ret) {
814 parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
815 return -EINVAL;
817 pred->val = val;
819 fn = select_comparison_fn(pred->op, field->size,
820 field->is_signed);
821 if (!fn) {
822 parse_error(ps, FILT_ERR_INVALID_OP, 0);
823 return -EINVAL;
827 if (pred->op == OP_NE)
828 pred->not = 1;
830 add_pred_fn:
831 if (!dry_run)
832 return filter_add_pred_fn(ps, call, filter, pred, fn);
833 return 0;
836 static void parse_init(struct filter_parse_state *ps,
837 struct filter_op *ops,
838 char *infix_string)
840 memset(ps, '\0', sizeof(*ps));
842 ps->infix.string = infix_string;
843 ps->infix.cnt = strlen(infix_string);
844 ps->ops = ops;
846 INIT_LIST_HEAD(&ps->opstack);
847 INIT_LIST_HEAD(&ps->postfix);
850 static char infix_next(struct filter_parse_state *ps)
852 ps->infix.cnt--;
854 return ps->infix.string[ps->infix.tail++];
857 static char infix_peek(struct filter_parse_state *ps)
859 if (ps->infix.tail == strlen(ps->infix.string))
860 return 0;
862 return ps->infix.string[ps->infix.tail];
865 static void infix_advance(struct filter_parse_state *ps)
867 ps->infix.cnt--;
868 ps->infix.tail++;
871 static inline int is_precedence_lower(struct filter_parse_state *ps,
872 int a, int b)
874 return ps->ops[a].precedence < ps->ops[b].precedence;
877 static inline int is_op_char(struct filter_parse_state *ps, char c)
879 int i;
881 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
882 if (ps->ops[i].string[0] == c)
883 return 1;
886 return 0;
889 static int infix_get_op(struct filter_parse_state *ps, char firstc)
891 char nextc = infix_peek(ps);
892 char opstr[3];
893 int i;
895 opstr[0] = firstc;
896 opstr[1] = nextc;
897 opstr[2] = '\0';
899 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
900 if (!strcmp(opstr, ps->ops[i].string)) {
901 infix_advance(ps);
902 return ps->ops[i].id;
906 opstr[1] = '\0';
908 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
909 if (!strcmp(opstr, ps->ops[i].string))
910 return ps->ops[i].id;
913 return OP_NONE;
916 static inline void clear_operand_string(struct filter_parse_state *ps)
918 memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
919 ps->operand.tail = 0;
922 static inline int append_operand_char(struct filter_parse_state *ps, char c)
924 if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
925 return -EINVAL;
927 ps->operand.string[ps->operand.tail++] = c;
929 return 0;
932 static int filter_opstack_push(struct filter_parse_state *ps, int op)
934 struct opstack_op *opstack_op;
936 opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
937 if (!opstack_op)
938 return -ENOMEM;
940 opstack_op->op = op;
941 list_add(&opstack_op->list, &ps->opstack);
943 return 0;
946 static int filter_opstack_empty(struct filter_parse_state *ps)
948 return list_empty(&ps->opstack);
951 static int filter_opstack_top(struct filter_parse_state *ps)
953 struct opstack_op *opstack_op;
955 if (filter_opstack_empty(ps))
956 return OP_NONE;
958 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
960 return opstack_op->op;
963 static int filter_opstack_pop(struct filter_parse_state *ps)
965 struct opstack_op *opstack_op;
966 int op;
968 if (filter_opstack_empty(ps))
969 return OP_NONE;
971 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
972 op = opstack_op->op;
973 list_del(&opstack_op->list);
975 kfree(opstack_op);
977 return op;
980 static void filter_opstack_clear(struct filter_parse_state *ps)
982 while (!filter_opstack_empty(ps))
983 filter_opstack_pop(ps);
986 static char *curr_operand(struct filter_parse_state *ps)
988 return ps->operand.string;
991 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
993 struct postfix_elt *elt;
995 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
996 if (!elt)
997 return -ENOMEM;
999 elt->op = OP_NONE;
1000 elt->operand = kstrdup(operand, GFP_KERNEL);
1001 if (!elt->operand) {
1002 kfree(elt);
1003 return -ENOMEM;
1006 list_add_tail(&elt->list, &ps->postfix);
1008 return 0;
1011 static int postfix_append_op(struct filter_parse_state *ps, int op)
1013 struct postfix_elt *elt;
1015 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1016 if (!elt)
1017 return -ENOMEM;
1019 elt->op = op;
1020 elt->operand = NULL;
1022 list_add_tail(&elt->list, &ps->postfix);
1024 return 0;
1027 static void postfix_clear(struct filter_parse_state *ps)
1029 struct postfix_elt *elt;
1031 while (!list_empty(&ps->postfix)) {
1032 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
1033 list_del(&elt->list);
1034 kfree(elt->operand);
1035 kfree(elt);
1039 static int filter_parse(struct filter_parse_state *ps)
1041 int in_string = 0;
1042 int op, top_op;
1043 char ch;
1045 while ((ch = infix_next(ps))) {
1046 if (ch == '"') {
1047 in_string ^= 1;
1048 continue;
1051 if (in_string)
1052 goto parse_operand;
1054 if (isspace(ch))
1055 continue;
1057 if (is_op_char(ps, ch)) {
1058 op = infix_get_op(ps, ch);
1059 if (op == OP_NONE) {
1060 parse_error(ps, FILT_ERR_INVALID_OP, 0);
1061 return -EINVAL;
1064 if (strlen(curr_operand(ps))) {
1065 postfix_append_operand(ps, curr_operand(ps));
1066 clear_operand_string(ps);
1069 while (!filter_opstack_empty(ps)) {
1070 top_op = filter_opstack_top(ps);
1071 if (!is_precedence_lower(ps, top_op, op)) {
1072 top_op = filter_opstack_pop(ps);
1073 postfix_append_op(ps, top_op);
1074 continue;
1076 break;
1079 filter_opstack_push(ps, op);
1080 continue;
1083 if (ch == '(') {
1084 filter_opstack_push(ps, OP_OPEN_PAREN);
1085 continue;
1088 if (ch == ')') {
1089 if (strlen(curr_operand(ps))) {
1090 postfix_append_operand(ps, curr_operand(ps));
1091 clear_operand_string(ps);
1094 top_op = filter_opstack_pop(ps);
1095 while (top_op != OP_NONE) {
1096 if (top_op == OP_OPEN_PAREN)
1097 break;
1098 postfix_append_op(ps, top_op);
1099 top_op = filter_opstack_pop(ps);
1101 if (top_op == OP_NONE) {
1102 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1103 return -EINVAL;
1105 continue;
1107 parse_operand:
1108 if (append_operand_char(ps, ch)) {
1109 parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1110 return -EINVAL;
1114 if (strlen(curr_operand(ps)))
1115 postfix_append_operand(ps, curr_operand(ps));
1117 while (!filter_opstack_empty(ps)) {
1118 top_op = filter_opstack_pop(ps);
1119 if (top_op == OP_NONE)
1120 break;
1121 if (top_op == OP_OPEN_PAREN) {
1122 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1123 return -EINVAL;
1125 postfix_append_op(ps, top_op);
1128 return 0;
1131 static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
1133 struct filter_pred *pred;
1135 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1136 if (!pred)
1137 return NULL;
1139 pred->field_name = kstrdup(operand1, GFP_KERNEL);
1140 if (!pred->field_name) {
1141 kfree(pred);
1142 return NULL;
1145 strcpy(pred->regex.pattern, operand2);
1146 pred->regex.len = strlen(pred->regex.pattern);
1148 pred->op = op;
1150 return pred;
1153 static struct filter_pred *create_logical_pred(int op)
1155 struct filter_pred *pred;
1157 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1158 if (!pred)
1159 return NULL;
1161 pred->op = op;
1163 return pred;
1166 static int check_preds(struct filter_parse_state *ps)
1168 int n_normal_preds = 0, n_logical_preds = 0;
1169 struct postfix_elt *elt;
1171 list_for_each_entry(elt, &ps->postfix, list) {
1172 if (elt->op == OP_NONE)
1173 continue;
1175 if (elt->op == OP_AND || elt->op == OP_OR) {
1176 n_logical_preds++;
1177 continue;
1179 n_normal_preds++;
1182 if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
1183 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
1184 return -EINVAL;
1187 return 0;
1190 static int replace_preds(struct ftrace_event_call *call,
1191 struct event_filter *filter,
1192 struct filter_parse_state *ps,
1193 char *filter_string,
1194 bool dry_run)
1196 char *operand1 = NULL, *operand2 = NULL;
1197 struct filter_pred *pred;
1198 struct postfix_elt *elt;
1199 int err;
1200 int n_preds = 0;
1202 err = check_preds(ps);
1203 if (err)
1204 return err;
1206 list_for_each_entry(elt, &ps->postfix, list) {
1207 if (elt->op == OP_NONE) {
1208 if (!operand1)
1209 operand1 = elt->operand;
1210 else if (!operand2)
1211 operand2 = elt->operand;
1212 else {
1213 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1214 return -EINVAL;
1216 continue;
1219 if (n_preds++ == MAX_FILTER_PRED) {
1220 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1221 return -ENOSPC;
1224 if (elt->op == OP_AND || elt->op == OP_OR) {
1225 pred = create_logical_pred(elt->op);
1226 goto add_pred;
1229 if (!operand1 || !operand2) {
1230 parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1231 return -EINVAL;
1234 pred = create_pred(elt->op, operand1, operand2);
1235 add_pred:
1236 if (!pred)
1237 return -ENOMEM;
1238 err = filter_add_pred(ps, call, filter, pred, dry_run);
1239 filter_free_pred(pred);
1240 if (err)
1241 return err;
1243 operand1 = operand2 = NULL;
1246 return 0;
1249 static int replace_system_preds(struct event_subsystem *system,
1250 struct filter_parse_state *ps,
1251 char *filter_string)
1253 struct ftrace_event_call *call;
1254 bool fail = true;
1255 int err;
1257 list_for_each_entry(call, &ftrace_events, list) {
1258 struct event_filter *filter = call->filter;
1260 if (strcmp(call->class->system, system->name) != 0)
1261 continue;
1263 /* try to see if the filter can be applied */
1264 err = replace_preds(call, filter, ps, filter_string, true);
1265 if (err)
1266 continue;
1268 /* really apply the filter */
1269 filter_disable_preds(call);
1270 err = replace_preds(call, filter, ps, filter_string, false);
1271 if (err)
1272 filter_disable_preds(call);
1273 else {
1274 call->flags |= TRACE_EVENT_FL_FILTERED;
1275 replace_filter_string(filter, filter_string);
1277 fail = false;
1280 if (fail) {
1281 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1282 return -EINVAL;
1284 return 0;
1287 int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1289 int err;
1290 struct filter_parse_state *ps;
1292 mutex_lock(&event_mutex);
1294 err = init_preds(call);
1295 if (err)
1296 goto out_unlock;
1298 if (!strcmp(strstrip(filter_string), "0")) {
1299 filter_disable_preds(call);
1300 remove_filter_string(call->filter);
1301 goto out_unlock;
1304 err = -ENOMEM;
1305 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1306 if (!ps)
1307 goto out_unlock;
1309 filter_disable_preds(call);
1310 replace_filter_string(call->filter, filter_string);
1312 parse_init(ps, filter_ops, filter_string);
1313 err = filter_parse(ps);
1314 if (err) {
1315 append_filter_err(ps, call->filter);
1316 goto out;
1319 err = replace_preds(call, call->filter, ps, filter_string, false);
1320 if (err)
1321 append_filter_err(ps, call->filter);
1322 else
1323 call->flags |= TRACE_EVENT_FL_FILTERED;
1324 out:
1325 filter_opstack_clear(ps);
1326 postfix_clear(ps);
1327 kfree(ps);
1328 out_unlock:
1329 mutex_unlock(&event_mutex);
1331 return err;
1334 int apply_subsystem_event_filter(struct event_subsystem *system,
1335 char *filter_string)
1337 int err;
1338 struct filter_parse_state *ps;
1340 mutex_lock(&event_mutex);
1342 err = init_subsystem_preds(system);
1343 if (err)
1344 goto out_unlock;
1346 if (!strcmp(strstrip(filter_string), "0")) {
1347 filter_free_subsystem_preds(system);
1348 remove_filter_string(system->filter);
1349 goto out_unlock;
1352 err = -ENOMEM;
1353 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1354 if (!ps)
1355 goto out_unlock;
1357 replace_filter_string(system->filter, filter_string);
1359 parse_init(ps, filter_ops, filter_string);
1360 err = filter_parse(ps);
1361 if (err) {
1362 append_filter_err(ps, system->filter);
1363 goto out;
1366 err = replace_system_preds(system, ps, filter_string);
1367 if (err)
1368 append_filter_err(ps, system->filter);
1370 out:
1371 filter_opstack_clear(ps);
1372 postfix_clear(ps);
1373 kfree(ps);
1374 out_unlock:
1375 mutex_unlock(&event_mutex);
1377 return err;
1380 #ifdef CONFIG_PERF_EVENTS
1382 void ftrace_profile_free_filter(struct perf_event *event)
1384 struct event_filter *filter = event->filter;
1386 event->filter = NULL;
1387 __free_preds(filter);
1390 int ftrace_profile_set_filter(struct perf_event *event, int event_id,
1391 char *filter_str)
1393 int err;
1394 struct event_filter *filter;
1395 struct filter_parse_state *ps;
1396 struct ftrace_event_call *call = NULL;
1398 mutex_lock(&event_mutex);
1400 list_for_each_entry(call, &ftrace_events, list) {
1401 if (call->event.type == event_id)
1402 break;
1405 err = -EINVAL;
1406 if (&call->list == &ftrace_events)
1407 goto out_unlock;
1409 err = -EEXIST;
1410 if (event->filter)
1411 goto out_unlock;
1413 filter = __alloc_preds();
1414 if (IS_ERR(filter)) {
1415 err = PTR_ERR(filter);
1416 goto out_unlock;
1419 err = -ENOMEM;
1420 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1421 if (!ps)
1422 goto free_preds;
1424 parse_init(ps, filter_ops, filter_str);
1425 err = filter_parse(ps);
1426 if (err)
1427 goto free_ps;
1429 err = replace_preds(call, filter, ps, filter_str, false);
1430 if (!err)
1431 event->filter = filter;
1433 free_ps:
1434 filter_opstack_clear(ps);
1435 postfix_clear(ps);
1436 kfree(ps);
1438 free_preds:
1439 if (err)
1440 __free_preds(filter);
1442 out_unlock:
1443 mutex_unlock(&event_mutex);
1445 return err;
1448 #endif /* CONFIG_PERF_EVENTS */