USB: ehci-omap.c: introduce missing kfree
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / kernel / trace / trace_events_filter.c
blob50504cb228deded61a141aca151c3d802719b2c2
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>
26 #include "trace.h"
27 #include "trace_output.h"
29 enum filter_op_ids
31 OP_OR,
32 OP_AND,
33 OP_GLOB,
34 OP_NE,
35 OP_EQ,
36 OP_LT,
37 OP_LE,
38 OP_GT,
39 OP_GE,
40 OP_NONE,
41 OP_OPEN_PAREN,
44 struct filter_op {
45 int id;
46 char *string;
47 int precedence;
50 static struct filter_op filter_ops[] = {
51 { OP_OR, "||", 1 },
52 { OP_AND, "&&", 2 },
53 { OP_GLOB, "~", 4 },
54 { OP_NE, "!=", 4 },
55 { OP_EQ, "==", 4 },
56 { OP_LT, "<", 5 },
57 { OP_LE, "<=", 5 },
58 { OP_GT, ">", 5 },
59 { OP_GE, ">=", 5 },
60 { OP_NONE, "OP_NONE", 0 },
61 { OP_OPEN_PAREN, "(", 0 },
64 enum {
65 FILT_ERR_NONE,
66 FILT_ERR_INVALID_OP,
67 FILT_ERR_UNBALANCED_PAREN,
68 FILT_ERR_TOO_MANY_OPERANDS,
69 FILT_ERR_OPERAND_TOO_LONG,
70 FILT_ERR_FIELD_NOT_FOUND,
71 FILT_ERR_ILLEGAL_FIELD_OP,
72 FILT_ERR_ILLEGAL_INTVAL,
73 FILT_ERR_BAD_SUBSYS_FILTER,
74 FILT_ERR_TOO_MANY_PREDS,
75 FILT_ERR_MISSING_FIELD,
76 FILT_ERR_INVALID_FILTER,
79 static char *err_text[] = {
80 "No error",
81 "Invalid operator",
82 "Unbalanced parens",
83 "Too many operands",
84 "Operand too long",
85 "Field not found",
86 "Illegal operation for field type",
87 "Illegal integer value",
88 "Couldn't find or set field in one of a subsystem's events",
89 "Too many terms in predicate expression",
90 "Missing field name and/or value",
91 "Meaningless filter expression",
94 struct opstack_op {
95 int op;
96 struct list_head list;
99 struct postfix_elt {
100 int op;
101 char *operand;
102 struct list_head list;
105 struct filter_parse_state {
106 struct filter_op *ops;
107 struct list_head opstack;
108 struct list_head postfix;
109 int lasterr;
110 int lasterr_pos;
112 struct {
113 char *string;
114 unsigned int cnt;
115 unsigned int tail;
116 } infix;
118 struct {
119 char string[MAX_FILTER_STR_VAL];
120 int pos;
121 unsigned int tail;
122 } operand;
125 #define DEFINE_COMPARISON_PRED(type) \
126 static int filter_pred_##type(struct filter_pred *pred, void *event, \
127 int val1, int val2) \
129 type *addr = (type *)(event + pred->offset); \
130 type val = (type)pred->val; \
131 int match = 0; \
133 switch (pred->op) { \
134 case OP_LT: \
135 match = (*addr < val); \
136 break; \
137 case OP_LE: \
138 match = (*addr <= val); \
139 break; \
140 case OP_GT: \
141 match = (*addr > val); \
142 break; \
143 case OP_GE: \
144 match = (*addr >= val); \
145 break; \
146 default: \
147 break; \
150 return match; \
153 #define DEFINE_EQUALITY_PRED(size) \
154 static int filter_pred_##size(struct filter_pred *pred, void *event, \
155 int val1, int val2) \
157 u##size *addr = (u##size *)(event + pred->offset); \
158 u##size val = (u##size)pred->val; \
159 int match; \
161 match = (val == *addr) ^ pred->not; \
163 return match; \
166 DEFINE_COMPARISON_PRED(s64);
167 DEFINE_COMPARISON_PRED(u64);
168 DEFINE_COMPARISON_PRED(s32);
169 DEFINE_COMPARISON_PRED(u32);
170 DEFINE_COMPARISON_PRED(s16);
171 DEFINE_COMPARISON_PRED(u16);
172 DEFINE_COMPARISON_PRED(s8);
173 DEFINE_COMPARISON_PRED(u8);
175 DEFINE_EQUALITY_PRED(64);
176 DEFINE_EQUALITY_PRED(32);
177 DEFINE_EQUALITY_PRED(16);
178 DEFINE_EQUALITY_PRED(8);
180 static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
181 void *event __attribute((unused)),
182 int val1, int val2)
184 return val1 && val2;
187 static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
188 void *event __attribute((unused)),
189 int val1, int val2)
191 return val1 || val2;
194 /* Filter predicate for fixed sized arrays of characters */
195 static int filter_pred_string(struct filter_pred *pred, void *event,
196 int val1, int val2)
198 char *addr = (char *)(event + pred->offset);
199 int cmp, match;
201 cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
203 match = cmp ^ pred->not;
205 return match;
208 /* Filter predicate for char * pointers */
209 static int filter_pred_pchar(struct filter_pred *pred, void *event,
210 int val1, int val2)
212 char **addr = (char **)(event + pred->offset);
213 int cmp, match;
215 cmp = pred->regex.match(*addr, &pred->regex, pred->regex.field_len);
217 match = cmp ^ pred->not;
219 return match;
223 * Filter predicate for dynamic sized arrays of characters.
224 * These are implemented through a list of strings at the end
225 * of the entry.
226 * Also each of these strings have a field in the entry which
227 * contains its offset from the beginning of the entry.
228 * We have then first to get this field, dereference it
229 * and add it to the address of the entry, and at last we have
230 * the address of the string.
232 static int filter_pred_strloc(struct filter_pred *pred, void *event,
233 int val1, int val2)
235 u32 str_item = *(u32 *)(event + pred->offset);
236 int str_loc = str_item & 0xffff;
237 int str_len = str_item >> 16;
238 char *addr = (char *)(event + str_loc);
239 int cmp, match;
241 cmp = pred->regex.match(addr, &pred->regex, str_len);
243 match = cmp ^ pred->not;
245 return match;
248 static int filter_pred_none(struct filter_pred *pred, void *event,
249 int val1, int val2)
251 return 0;
254 /* Basic regex callbacks */
255 static int regex_match_full(char *str, struct regex *r, int len)
257 if (strncmp(str, r->pattern, len) == 0)
258 return 1;
259 return 0;
262 static int regex_match_front(char *str, struct regex *r, int len)
264 if (strncmp(str, r->pattern, len) == 0)
265 return 1;
266 return 0;
269 static int regex_match_middle(char *str, struct regex *r, int len)
271 if (strstr(str, r->pattern))
272 return 1;
273 return 0;
276 static int regex_match_end(char *str, struct regex *r, int len)
278 char *ptr = strstr(str, r->pattern);
280 if (ptr && (ptr[r->len] == 0))
281 return 1;
282 return 0;
286 * filter_parse_regex - parse a basic regex
287 * @buff: the raw regex
288 * @len: length of the regex
289 * @search: will point to the beginning of the string to compare
290 * @not: tell whether the match will have to be inverted
292 * This passes in a buffer containing a regex and this function will
293 * set search to point to the search part of the buffer and
294 * return the type of search it is (see enum above).
295 * This does modify buff.
297 * Returns enum type.
298 * search returns the pointer to use for comparison.
299 * not returns 1 if buff started with a '!'
300 * 0 otherwise.
302 enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
304 int type = MATCH_FULL;
305 int i;
307 if (buff[0] == '!') {
308 *not = 1;
309 buff++;
310 len--;
311 } else
312 *not = 0;
314 *search = buff;
316 for (i = 0; i < len; i++) {
317 if (buff[i] == '*') {
318 if (!i) {
319 *search = buff + 1;
320 type = MATCH_END_ONLY;
321 } else {
322 if (type == MATCH_END_ONLY)
323 type = MATCH_MIDDLE_ONLY;
324 else
325 type = MATCH_FRONT_ONLY;
326 buff[i] = 0;
327 break;
332 return type;
335 static void filter_build_regex(struct filter_pred *pred)
337 struct regex *r = &pred->regex;
338 char *search;
339 enum regex_type type = MATCH_FULL;
340 int not = 0;
342 if (pred->op == OP_GLOB) {
343 type = filter_parse_regex(r->pattern, r->len, &search, &not);
344 r->len = strlen(search);
345 memmove(r->pattern, search, r->len+1);
348 switch (type) {
349 case MATCH_FULL:
350 r->match = regex_match_full;
351 break;
352 case MATCH_FRONT_ONLY:
353 r->match = regex_match_front;
354 break;
355 case MATCH_MIDDLE_ONLY:
356 r->match = regex_match_middle;
357 break;
358 case MATCH_END_ONLY:
359 r->match = regex_match_end;
360 break;
363 pred->not ^= not;
366 /* return 1 if event matches, 0 otherwise (discard) */
367 int filter_match_preds(struct event_filter *filter, void *rec)
369 int match, top = 0, val1 = 0, val2 = 0;
370 int stack[MAX_FILTER_PRED];
371 struct filter_pred *pred;
372 int i;
374 for (i = 0; i < filter->n_preds; i++) {
375 pred = filter->preds[i];
376 if (!pred->pop_n) {
377 match = pred->fn(pred, rec, val1, val2);
378 stack[top++] = match;
379 continue;
381 if (pred->pop_n > top) {
382 WARN_ON_ONCE(1);
383 return 0;
385 val1 = stack[--top];
386 val2 = stack[--top];
387 match = pred->fn(pred, rec, val1, val2);
388 stack[top++] = match;
391 return stack[--top];
393 EXPORT_SYMBOL_GPL(filter_match_preds);
395 static void parse_error(struct filter_parse_state *ps, int err, int pos)
397 ps->lasterr = err;
398 ps->lasterr_pos = pos;
401 static void remove_filter_string(struct event_filter *filter)
403 kfree(filter->filter_string);
404 filter->filter_string = NULL;
407 static int replace_filter_string(struct event_filter *filter,
408 char *filter_string)
410 kfree(filter->filter_string);
411 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
412 if (!filter->filter_string)
413 return -ENOMEM;
415 return 0;
418 static int append_filter_string(struct event_filter *filter,
419 char *string)
421 int newlen;
422 char *new_filter_string;
424 BUG_ON(!filter->filter_string);
425 newlen = strlen(filter->filter_string) + strlen(string) + 1;
426 new_filter_string = kmalloc(newlen, GFP_KERNEL);
427 if (!new_filter_string)
428 return -ENOMEM;
430 strcpy(new_filter_string, filter->filter_string);
431 strcat(new_filter_string, string);
432 kfree(filter->filter_string);
433 filter->filter_string = new_filter_string;
435 return 0;
438 static void append_filter_err(struct filter_parse_state *ps,
439 struct event_filter *filter)
441 int pos = ps->lasterr_pos;
442 char *buf, *pbuf;
444 buf = (char *)__get_free_page(GFP_TEMPORARY);
445 if (!buf)
446 return;
448 append_filter_string(filter, "\n");
449 memset(buf, ' ', PAGE_SIZE);
450 if (pos > PAGE_SIZE - 128)
451 pos = 0;
452 buf[pos] = '^';
453 pbuf = &buf[pos] + 1;
455 sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
456 append_filter_string(filter, buf);
457 free_page((unsigned long) buf);
460 void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
462 struct event_filter *filter = call->filter;
464 mutex_lock(&event_mutex);
465 if (filter && filter->filter_string)
466 trace_seq_printf(s, "%s\n", filter->filter_string);
467 else
468 trace_seq_printf(s, "none\n");
469 mutex_unlock(&event_mutex);
472 void print_subsystem_event_filter(struct event_subsystem *system,
473 struct trace_seq *s)
475 struct event_filter *filter = system->filter;
477 mutex_lock(&event_mutex);
478 if (filter && filter->filter_string)
479 trace_seq_printf(s, "%s\n", filter->filter_string);
480 else
481 trace_seq_printf(s, "none\n");
482 mutex_unlock(&event_mutex);
485 static struct ftrace_event_field *
486 find_event_field(struct ftrace_event_call *call, char *name)
488 struct ftrace_event_field *field;
490 list_for_each_entry(field, &call->fields, link) {
491 if (!strcmp(field->name, name))
492 return field;
495 return NULL;
498 static void filter_free_pred(struct filter_pred *pred)
500 if (!pred)
501 return;
503 kfree(pred->field_name);
504 kfree(pred);
507 static void filter_clear_pred(struct filter_pred *pred)
509 kfree(pred->field_name);
510 pred->field_name = NULL;
511 pred->regex.len = 0;
514 static int filter_set_pred(struct filter_pred *dest,
515 struct filter_pred *src,
516 filter_pred_fn_t fn)
518 *dest = *src;
519 if (src->field_name) {
520 dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
521 if (!dest->field_name)
522 return -ENOMEM;
524 dest->fn = fn;
526 return 0;
529 static void filter_disable_preds(struct ftrace_event_call *call)
531 struct event_filter *filter = call->filter;
532 int i;
534 call->filter_active = 0;
535 filter->n_preds = 0;
537 for (i = 0; i < MAX_FILTER_PRED; i++)
538 filter->preds[i]->fn = filter_pred_none;
541 static void __free_preds(struct event_filter *filter)
543 int i;
545 if (!filter)
546 return;
548 for (i = 0; i < MAX_FILTER_PRED; i++) {
549 if (filter->preds[i])
550 filter_free_pred(filter->preds[i]);
552 kfree(filter->preds);
553 kfree(filter->filter_string);
554 kfree(filter);
557 void destroy_preds(struct ftrace_event_call *call)
559 __free_preds(call->filter);
560 call->filter = NULL;
561 call->filter_active = 0;
564 static struct event_filter *__alloc_preds(void)
566 struct event_filter *filter;
567 struct filter_pred *pred;
568 int i;
570 filter = kzalloc(sizeof(*filter), GFP_KERNEL);
571 if (!filter)
572 return ERR_PTR(-ENOMEM);
574 filter->n_preds = 0;
576 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
577 if (!filter->preds)
578 goto oom;
580 for (i = 0; i < MAX_FILTER_PRED; i++) {
581 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
582 if (!pred)
583 goto oom;
584 pred->fn = filter_pred_none;
585 filter->preds[i] = pred;
588 return filter;
590 oom:
591 __free_preds(filter);
592 return ERR_PTR(-ENOMEM);
595 static int init_preds(struct ftrace_event_call *call)
597 if (call->filter)
598 return 0;
600 call->filter_active = 0;
601 call->filter = __alloc_preds();
602 if (IS_ERR(call->filter))
603 return PTR_ERR(call->filter);
605 return 0;
608 static int init_subsystem_preds(struct event_subsystem *system)
610 struct ftrace_event_call *call;
611 int err;
613 list_for_each_entry(call, &ftrace_events, list) {
614 if (!call->define_fields)
615 continue;
617 if (strcmp(call->system, system->name) != 0)
618 continue;
620 err = init_preds(call);
621 if (err)
622 return err;
625 return 0;
628 static void filter_free_subsystem_preds(struct event_subsystem *system)
630 struct ftrace_event_call *call;
632 list_for_each_entry(call, &ftrace_events, list) {
633 if (!call->define_fields)
634 continue;
636 if (strcmp(call->system, system->name) != 0)
637 continue;
639 filter_disable_preds(call);
640 remove_filter_string(call->filter);
644 static int filter_add_pred_fn(struct filter_parse_state *ps,
645 struct ftrace_event_call *call,
646 struct event_filter *filter,
647 struct filter_pred *pred,
648 filter_pred_fn_t fn)
650 int idx, err;
652 if (filter->n_preds == MAX_FILTER_PRED) {
653 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
654 return -ENOSPC;
657 idx = filter->n_preds;
658 filter_clear_pred(filter->preds[idx]);
659 err = filter_set_pred(filter->preds[idx], pred, fn);
660 if (err)
661 return err;
663 filter->n_preds++;
665 return 0;
668 int filter_assign_type(const char *type)
670 if (strstr(type, "__data_loc") && strstr(type, "char"))
671 return FILTER_DYN_STRING;
673 if (strchr(type, '[') && strstr(type, "char"))
674 return FILTER_STATIC_STRING;
676 return FILTER_OTHER;
679 static bool is_string_field(struct ftrace_event_field *field)
681 return field->filter_type == FILTER_DYN_STRING ||
682 field->filter_type == FILTER_STATIC_STRING ||
683 field->filter_type == FILTER_PTR_STRING;
686 static int is_legal_op(struct ftrace_event_field *field, int op)
688 if (is_string_field(field) &&
689 (op != OP_EQ && op != OP_NE && op != OP_GLOB))
690 return 0;
691 if (!is_string_field(field) && op == OP_GLOB)
692 return 0;
694 return 1;
697 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
698 int field_is_signed)
700 filter_pred_fn_t fn = NULL;
702 switch (field_size) {
703 case 8:
704 if (op == OP_EQ || op == OP_NE)
705 fn = filter_pred_64;
706 else if (field_is_signed)
707 fn = filter_pred_s64;
708 else
709 fn = filter_pred_u64;
710 break;
711 case 4:
712 if (op == OP_EQ || op == OP_NE)
713 fn = filter_pred_32;
714 else if (field_is_signed)
715 fn = filter_pred_s32;
716 else
717 fn = filter_pred_u32;
718 break;
719 case 2:
720 if (op == OP_EQ || op == OP_NE)
721 fn = filter_pred_16;
722 else if (field_is_signed)
723 fn = filter_pred_s16;
724 else
725 fn = filter_pred_u16;
726 break;
727 case 1:
728 if (op == OP_EQ || op == OP_NE)
729 fn = filter_pred_8;
730 else if (field_is_signed)
731 fn = filter_pred_s8;
732 else
733 fn = filter_pred_u8;
734 break;
737 return fn;
740 static int filter_add_pred(struct filter_parse_state *ps,
741 struct ftrace_event_call *call,
742 struct event_filter *filter,
743 struct filter_pred *pred,
744 bool dry_run)
746 struct ftrace_event_field *field;
747 filter_pred_fn_t fn;
748 unsigned long long val;
749 int ret;
751 pred->fn = filter_pred_none;
753 if (pred->op == OP_AND) {
754 pred->pop_n = 2;
755 fn = filter_pred_and;
756 goto add_pred_fn;
757 } else if (pred->op == OP_OR) {
758 pred->pop_n = 2;
759 fn = filter_pred_or;
760 goto add_pred_fn;
763 field = find_event_field(call, pred->field_name);
764 if (!field) {
765 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
766 return -EINVAL;
769 pred->offset = field->offset;
771 if (!is_legal_op(field, pred->op)) {
772 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
773 return -EINVAL;
776 if (is_string_field(field)) {
777 filter_build_regex(pred);
779 if (field->filter_type == FILTER_STATIC_STRING) {
780 fn = filter_pred_string;
781 pred->regex.field_len = field->size;
782 } else if (field->filter_type == FILTER_DYN_STRING)
783 fn = filter_pred_strloc;
784 else {
785 fn = filter_pred_pchar;
786 pred->regex.field_len = strlen(pred->regex.pattern);
788 } else {
789 if (field->is_signed)
790 ret = strict_strtoll(pred->regex.pattern, 0, &val);
791 else
792 ret = strict_strtoull(pred->regex.pattern, 0, &val);
793 if (ret) {
794 parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
795 return -EINVAL;
797 pred->val = val;
799 fn = select_comparison_fn(pred->op, field->size,
800 field->is_signed);
801 if (!fn) {
802 parse_error(ps, FILT_ERR_INVALID_OP, 0);
803 return -EINVAL;
807 if (pred->op == OP_NE)
808 pred->not = 1;
810 add_pred_fn:
811 if (!dry_run)
812 return filter_add_pred_fn(ps, call, filter, pred, fn);
813 return 0;
816 static void parse_init(struct filter_parse_state *ps,
817 struct filter_op *ops,
818 char *infix_string)
820 memset(ps, '\0', sizeof(*ps));
822 ps->infix.string = infix_string;
823 ps->infix.cnt = strlen(infix_string);
824 ps->ops = ops;
826 INIT_LIST_HEAD(&ps->opstack);
827 INIT_LIST_HEAD(&ps->postfix);
830 static char infix_next(struct filter_parse_state *ps)
832 ps->infix.cnt--;
834 return ps->infix.string[ps->infix.tail++];
837 static char infix_peek(struct filter_parse_state *ps)
839 if (ps->infix.tail == strlen(ps->infix.string))
840 return 0;
842 return ps->infix.string[ps->infix.tail];
845 static void infix_advance(struct filter_parse_state *ps)
847 ps->infix.cnt--;
848 ps->infix.tail++;
851 static inline int is_precedence_lower(struct filter_parse_state *ps,
852 int a, int b)
854 return ps->ops[a].precedence < ps->ops[b].precedence;
857 static inline int is_op_char(struct filter_parse_state *ps, char c)
859 int i;
861 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
862 if (ps->ops[i].string[0] == c)
863 return 1;
866 return 0;
869 static int infix_get_op(struct filter_parse_state *ps, char firstc)
871 char nextc = infix_peek(ps);
872 char opstr[3];
873 int i;
875 opstr[0] = firstc;
876 opstr[1] = nextc;
877 opstr[2] = '\0';
879 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
880 if (!strcmp(opstr, ps->ops[i].string)) {
881 infix_advance(ps);
882 return ps->ops[i].id;
886 opstr[1] = '\0';
888 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
889 if (!strcmp(opstr, ps->ops[i].string))
890 return ps->ops[i].id;
893 return OP_NONE;
896 static inline void clear_operand_string(struct filter_parse_state *ps)
898 memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
899 ps->operand.tail = 0;
902 static inline int append_operand_char(struct filter_parse_state *ps, char c)
904 if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
905 return -EINVAL;
907 ps->operand.string[ps->operand.tail++] = c;
909 return 0;
912 static int filter_opstack_push(struct filter_parse_state *ps, int op)
914 struct opstack_op *opstack_op;
916 opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
917 if (!opstack_op)
918 return -ENOMEM;
920 opstack_op->op = op;
921 list_add(&opstack_op->list, &ps->opstack);
923 return 0;
926 static int filter_opstack_empty(struct filter_parse_state *ps)
928 return list_empty(&ps->opstack);
931 static int filter_opstack_top(struct filter_parse_state *ps)
933 struct opstack_op *opstack_op;
935 if (filter_opstack_empty(ps))
936 return OP_NONE;
938 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
940 return opstack_op->op;
943 static int filter_opstack_pop(struct filter_parse_state *ps)
945 struct opstack_op *opstack_op;
946 int op;
948 if (filter_opstack_empty(ps))
949 return OP_NONE;
951 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
952 op = opstack_op->op;
953 list_del(&opstack_op->list);
955 kfree(opstack_op);
957 return op;
960 static void filter_opstack_clear(struct filter_parse_state *ps)
962 while (!filter_opstack_empty(ps))
963 filter_opstack_pop(ps);
966 static char *curr_operand(struct filter_parse_state *ps)
968 return ps->operand.string;
971 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
973 struct postfix_elt *elt;
975 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
976 if (!elt)
977 return -ENOMEM;
979 elt->op = OP_NONE;
980 elt->operand = kstrdup(operand, GFP_KERNEL);
981 if (!elt->operand) {
982 kfree(elt);
983 return -ENOMEM;
986 list_add_tail(&elt->list, &ps->postfix);
988 return 0;
991 static int postfix_append_op(struct filter_parse_state *ps, int op)
993 struct postfix_elt *elt;
995 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
996 if (!elt)
997 return -ENOMEM;
999 elt->op = op;
1000 elt->operand = NULL;
1002 list_add_tail(&elt->list, &ps->postfix);
1004 return 0;
1007 static void postfix_clear(struct filter_parse_state *ps)
1009 struct postfix_elt *elt;
1011 while (!list_empty(&ps->postfix)) {
1012 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
1013 list_del(&elt->list);
1014 kfree(elt->operand);
1015 kfree(elt);
1019 static int filter_parse(struct filter_parse_state *ps)
1021 int in_string = 0;
1022 int op, top_op;
1023 char ch;
1025 while ((ch = infix_next(ps))) {
1026 if (ch == '"') {
1027 in_string ^= 1;
1028 continue;
1031 if (in_string)
1032 goto parse_operand;
1034 if (isspace(ch))
1035 continue;
1037 if (is_op_char(ps, ch)) {
1038 op = infix_get_op(ps, ch);
1039 if (op == OP_NONE) {
1040 parse_error(ps, FILT_ERR_INVALID_OP, 0);
1041 return -EINVAL;
1044 if (strlen(curr_operand(ps))) {
1045 postfix_append_operand(ps, curr_operand(ps));
1046 clear_operand_string(ps);
1049 while (!filter_opstack_empty(ps)) {
1050 top_op = filter_opstack_top(ps);
1051 if (!is_precedence_lower(ps, top_op, op)) {
1052 top_op = filter_opstack_pop(ps);
1053 postfix_append_op(ps, top_op);
1054 continue;
1056 break;
1059 filter_opstack_push(ps, op);
1060 continue;
1063 if (ch == '(') {
1064 filter_opstack_push(ps, OP_OPEN_PAREN);
1065 continue;
1068 if (ch == ')') {
1069 if (strlen(curr_operand(ps))) {
1070 postfix_append_operand(ps, curr_operand(ps));
1071 clear_operand_string(ps);
1074 top_op = filter_opstack_pop(ps);
1075 while (top_op != OP_NONE) {
1076 if (top_op == OP_OPEN_PAREN)
1077 break;
1078 postfix_append_op(ps, top_op);
1079 top_op = filter_opstack_pop(ps);
1081 if (top_op == OP_NONE) {
1082 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1083 return -EINVAL;
1085 continue;
1087 parse_operand:
1088 if (append_operand_char(ps, ch)) {
1089 parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1090 return -EINVAL;
1094 if (strlen(curr_operand(ps)))
1095 postfix_append_operand(ps, curr_operand(ps));
1097 while (!filter_opstack_empty(ps)) {
1098 top_op = filter_opstack_pop(ps);
1099 if (top_op == OP_NONE)
1100 break;
1101 if (top_op == OP_OPEN_PAREN) {
1102 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1103 return -EINVAL;
1105 postfix_append_op(ps, top_op);
1108 return 0;
1111 static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
1113 struct filter_pred *pred;
1115 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1116 if (!pred)
1117 return NULL;
1119 pred->field_name = kstrdup(operand1, GFP_KERNEL);
1120 if (!pred->field_name) {
1121 kfree(pred);
1122 return NULL;
1125 strcpy(pred->regex.pattern, operand2);
1126 pred->regex.len = strlen(pred->regex.pattern);
1128 pred->op = op;
1130 return pred;
1133 static struct filter_pred *create_logical_pred(int op)
1135 struct filter_pred *pred;
1137 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1138 if (!pred)
1139 return NULL;
1141 pred->op = op;
1143 return pred;
1146 static int check_preds(struct filter_parse_state *ps)
1148 int n_normal_preds = 0, n_logical_preds = 0;
1149 struct postfix_elt *elt;
1151 list_for_each_entry(elt, &ps->postfix, list) {
1152 if (elt->op == OP_NONE)
1153 continue;
1155 if (elt->op == OP_AND || elt->op == OP_OR) {
1156 n_logical_preds++;
1157 continue;
1159 n_normal_preds++;
1162 if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
1163 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
1164 return -EINVAL;
1167 return 0;
1170 static int replace_preds(struct ftrace_event_call *call,
1171 struct event_filter *filter,
1172 struct filter_parse_state *ps,
1173 char *filter_string,
1174 bool dry_run)
1176 char *operand1 = NULL, *operand2 = NULL;
1177 struct filter_pred *pred;
1178 struct postfix_elt *elt;
1179 int err;
1180 int n_preds = 0;
1182 err = check_preds(ps);
1183 if (err)
1184 return err;
1186 list_for_each_entry(elt, &ps->postfix, list) {
1187 if (elt->op == OP_NONE) {
1188 if (!operand1)
1189 operand1 = elt->operand;
1190 else if (!operand2)
1191 operand2 = elt->operand;
1192 else {
1193 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1194 return -EINVAL;
1196 continue;
1199 if (n_preds++ == MAX_FILTER_PRED) {
1200 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1201 return -ENOSPC;
1204 if (elt->op == OP_AND || elt->op == OP_OR) {
1205 pred = create_logical_pred(elt->op);
1206 goto add_pred;
1209 if (!operand1 || !operand2) {
1210 parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1211 return -EINVAL;
1214 pred = create_pred(elt->op, operand1, operand2);
1215 add_pred:
1216 if (!pred)
1217 return -ENOMEM;
1218 err = filter_add_pred(ps, call, filter, pred, dry_run);
1219 filter_free_pred(pred);
1220 if (err)
1221 return err;
1223 operand1 = operand2 = NULL;
1226 return 0;
1229 static int replace_system_preds(struct event_subsystem *system,
1230 struct filter_parse_state *ps,
1231 char *filter_string)
1233 struct ftrace_event_call *call;
1234 bool fail = true;
1235 int err;
1237 list_for_each_entry(call, &ftrace_events, list) {
1238 struct event_filter *filter = call->filter;
1240 if (!call->define_fields)
1241 continue;
1243 if (strcmp(call->system, system->name) != 0)
1244 continue;
1246 /* try to see if the filter can be applied */
1247 err = replace_preds(call, filter, ps, filter_string, true);
1248 if (err)
1249 continue;
1251 /* really apply the filter */
1252 filter_disable_preds(call);
1253 err = replace_preds(call, filter, ps, filter_string, false);
1254 if (err)
1255 filter_disable_preds(call);
1256 else {
1257 call->filter_active = 1;
1258 replace_filter_string(filter, filter_string);
1260 fail = false;
1263 if (fail) {
1264 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1265 return -EINVAL;
1267 return 0;
1270 int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1272 int err;
1273 struct filter_parse_state *ps;
1275 mutex_lock(&event_mutex);
1277 err = init_preds(call);
1278 if (err)
1279 goto out_unlock;
1281 if (!strcmp(strstrip(filter_string), "0")) {
1282 filter_disable_preds(call);
1283 remove_filter_string(call->filter);
1284 goto out_unlock;
1287 err = -ENOMEM;
1288 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1289 if (!ps)
1290 goto out_unlock;
1292 filter_disable_preds(call);
1293 replace_filter_string(call->filter, filter_string);
1295 parse_init(ps, filter_ops, filter_string);
1296 err = filter_parse(ps);
1297 if (err) {
1298 append_filter_err(ps, call->filter);
1299 goto out;
1302 err = replace_preds(call, call->filter, ps, filter_string, false);
1303 if (err)
1304 append_filter_err(ps, call->filter);
1305 else
1306 call->filter_active = 1;
1307 out:
1308 filter_opstack_clear(ps);
1309 postfix_clear(ps);
1310 kfree(ps);
1311 out_unlock:
1312 mutex_unlock(&event_mutex);
1314 return err;
1317 int apply_subsystem_event_filter(struct event_subsystem *system,
1318 char *filter_string)
1320 int err;
1321 struct filter_parse_state *ps;
1323 mutex_lock(&event_mutex);
1325 err = init_subsystem_preds(system);
1326 if (err)
1327 goto out_unlock;
1329 if (!strcmp(strstrip(filter_string), "0")) {
1330 filter_free_subsystem_preds(system);
1331 remove_filter_string(system->filter);
1332 goto out_unlock;
1335 err = -ENOMEM;
1336 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1337 if (!ps)
1338 goto out_unlock;
1340 replace_filter_string(system->filter, filter_string);
1342 parse_init(ps, filter_ops, filter_string);
1343 err = filter_parse(ps);
1344 if (err) {
1345 append_filter_err(ps, system->filter);
1346 goto out;
1349 err = replace_system_preds(system, ps, filter_string);
1350 if (err)
1351 append_filter_err(ps, system->filter);
1353 out:
1354 filter_opstack_clear(ps);
1355 postfix_clear(ps);
1356 kfree(ps);
1357 out_unlock:
1358 mutex_unlock(&event_mutex);
1360 return err;
1363 #ifdef CONFIG_EVENT_PROFILE
1365 void ftrace_profile_free_filter(struct perf_event *event)
1367 struct event_filter *filter = event->filter;
1369 event->filter = NULL;
1370 __free_preds(filter);
1373 int ftrace_profile_set_filter(struct perf_event *event, int event_id,
1374 char *filter_str)
1376 int err;
1377 struct event_filter *filter;
1378 struct filter_parse_state *ps;
1379 struct ftrace_event_call *call = NULL;
1381 mutex_lock(&event_mutex);
1383 list_for_each_entry(call, &ftrace_events, list) {
1384 if (call->id == event_id)
1385 break;
1388 err = -EINVAL;
1389 if (!call)
1390 goto out_unlock;
1392 err = -EEXIST;
1393 if (event->filter)
1394 goto out_unlock;
1396 filter = __alloc_preds();
1397 if (IS_ERR(filter)) {
1398 err = PTR_ERR(filter);
1399 goto out_unlock;
1402 err = -ENOMEM;
1403 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1404 if (!ps)
1405 goto free_preds;
1407 parse_init(ps, filter_ops, filter_str);
1408 err = filter_parse(ps);
1409 if (err)
1410 goto free_ps;
1412 err = replace_preds(call, filter, ps, filter_str, false);
1413 if (!err)
1414 event->filter = filter;
1416 free_ps:
1417 filter_opstack_clear(ps);
1418 postfix_clear(ps);
1419 kfree(ps);
1421 free_preds:
1422 if (err)
1423 __free_preds(filter);
1425 out_unlock:
1426 mutex_unlock(&event_mutex);
1428 return err;
1431 #endif /* CONFIG_EVENT_PROFILE */