Merge branch 'mini2440-dev-unlikely' into mini2440-dev
[linux-2.6/mini2440.git] / kernel / trace / trace_events_filter.c
blobf32dc9d1ea7b51bb5c469b7778fc198079f5c499
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/debugfs.h>
22 #include <linux/uaccess.h>
23 #include <linux/module.h>
24 #include <linux/ctype.h>
25 #include <linux/mutex.h>
27 #include "trace.h"
28 #include "trace_output.h"
30 enum filter_op_ids
32 OP_OR,
33 OP_AND,
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_NE, "!=", 4 },
54 { OP_EQ, "==", 4 },
55 { OP_LT, "<", 5 },
56 { OP_LE, "<=", 5 },
57 { OP_GT, ">", 5 },
58 { OP_GE, ">=", 5 },
59 { OP_NONE, "OP_NONE", 0 },
60 { OP_OPEN_PAREN, "(", 0 },
63 enum {
64 FILT_ERR_NONE,
65 FILT_ERR_INVALID_OP,
66 FILT_ERR_UNBALANCED_PAREN,
67 FILT_ERR_TOO_MANY_OPERANDS,
68 FILT_ERR_OPERAND_TOO_LONG,
69 FILT_ERR_FIELD_NOT_FOUND,
70 FILT_ERR_ILLEGAL_FIELD_OP,
71 FILT_ERR_ILLEGAL_INTVAL,
72 FILT_ERR_BAD_SUBSYS_FILTER,
73 FILT_ERR_TOO_MANY_PREDS,
74 FILT_ERR_MISSING_FIELD,
75 FILT_ERR_INVALID_FILTER,
78 static char *err_text[] = {
79 "No error",
80 "Invalid operator",
81 "Unbalanced parens",
82 "Too many operands",
83 "Operand too long",
84 "Field not found",
85 "Illegal operation for field type",
86 "Illegal integer value",
87 "Couldn't find or set field in one of a subsystem's events",
88 "Too many terms in predicate expression",
89 "Missing field name and/or value",
90 "Meaningless filter expression",
93 struct opstack_op {
94 int op;
95 struct list_head list;
98 struct postfix_elt {
99 int op;
100 char *operand;
101 struct list_head list;
104 struct filter_parse_state {
105 struct filter_op *ops;
106 struct list_head opstack;
107 struct list_head postfix;
108 int lasterr;
109 int lasterr_pos;
111 struct {
112 char *string;
113 unsigned int cnt;
114 unsigned int tail;
115 } infix;
117 struct {
118 char string[MAX_FILTER_STR_VAL];
119 int pos;
120 unsigned int tail;
121 } operand;
124 DEFINE_COMPARISON_PRED(s64);
125 DEFINE_COMPARISON_PRED(u64);
126 DEFINE_COMPARISON_PRED(s32);
127 DEFINE_COMPARISON_PRED(u32);
128 DEFINE_COMPARISON_PRED(s16);
129 DEFINE_COMPARISON_PRED(u16);
130 DEFINE_COMPARISON_PRED(s8);
131 DEFINE_COMPARISON_PRED(u8);
133 DEFINE_EQUALITY_PRED(64);
134 DEFINE_EQUALITY_PRED(32);
135 DEFINE_EQUALITY_PRED(16);
136 DEFINE_EQUALITY_PRED(8);
138 static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
139 void *event __attribute((unused)),
140 int val1, int val2)
142 return val1 && val2;
145 static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
146 void *event __attribute((unused)),
147 int val1, int val2)
149 return val1 || val2;
152 /* Filter predicate for fixed sized arrays of characters */
153 static int filter_pred_string(struct filter_pred *pred, void *event,
154 int val1, int val2)
156 char *addr = (char *)(event + pred->offset);
157 int cmp, match;
159 cmp = strncmp(addr, pred->str_val, pred->str_len);
161 match = (!cmp) ^ pred->not;
163 return match;
167 * Filter predicate for dynamic sized arrays of characters.
168 * These are implemented through a list of strings at the end
169 * of the entry.
170 * Also each of these strings have a field in the entry which
171 * contains its offset from the beginning of the entry.
172 * We have then first to get this field, dereference it
173 * and add it to the address of the entry, and at last we have
174 * the address of the string.
176 static int filter_pred_strloc(struct filter_pred *pred, void *event,
177 int val1, int val2)
179 unsigned short str_loc = *(unsigned short *)(event + pred->offset);
180 char *addr = (char *)(event + str_loc);
181 int cmp, match;
183 cmp = strncmp(addr, pred->str_val, pred->str_len);
185 match = (!cmp) ^ pred->not;
187 return match;
190 static int filter_pred_none(struct filter_pred *pred, void *event,
191 int val1, int val2)
193 return 0;
196 /* return 1 if event matches, 0 otherwise (discard) */
197 int filter_match_preds(struct ftrace_event_call *call, void *rec)
199 struct event_filter *filter = call->filter;
200 int match, top = 0, val1 = 0, val2 = 0;
201 int stack[MAX_FILTER_PRED];
202 struct filter_pred *pred;
203 int i;
205 for (i = 0; i < filter->n_preds; i++) {
206 pred = filter->preds[i];
207 if (!pred->pop_n) {
208 match = pred->fn(pred, rec, val1, val2);
209 stack[top++] = match;
210 continue;
212 if (pred->pop_n > top) {
213 WARN_ON_ONCE(1);
214 return 0;
216 val1 = stack[--top];
217 val2 = stack[--top];
218 match = pred->fn(pred, rec, val1, val2);
219 stack[top++] = match;
222 return stack[--top];
224 EXPORT_SYMBOL_GPL(filter_match_preds);
226 static void parse_error(struct filter_parse_state *ps, int err, int pos)
228 ps->lasterr = err;
229 ps->lasterr_pos = pos;
232 static void remove_filter_string(struct event_filter *filter)
234 kfree(filter->filter_string);
235 filter->filter_string = NULL;
238 static int replace_filter_string(struct event_filter *filter,
239 char *filter_string)
241 kfree(filter->filter_string);
242 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
243 if (!filter->filter_string)
244 return -ENOMEM;
246 return 0;
249 static int append_filter_string(struct event_filter *filter,
250 char *string)
252 int newlen;
253 char *new_filter_string;
255 BUG_ON(!filter->filter_string);
256 newlen = strlen(filter->filter_string) + strlen(string) + 1;
257 new_filter_string = kmalloc(newlen, GFP_KERNEL);
258 if (!new_filter_string)
259 return -ENOMEM;
261 strcpy(new_filter_string, filter->filter_string);
262 strcat(new_filter_string, string);
263 kfree(filter->filter_string);
264 filter->filter_string = new_filter_string;
266 return 0;
269 static void append_filter_err(struct filter_parse_state *ps,
270 struct event_filter *filter)
272 int pos = ps->lasterr_pos;
273 char *buf, *pbuf;
275 buf = (char *)__get_free_page(GFP_TEMPORARY);
276 if (!buf)
277 return;
279 append_filter_string(filter, "\n");
280 memset(buf, ' ', PAGE_SIZE);
281 if (pos > PAGE_SIZE - 128)
282 pos = 0;
283 buf[pos] = '^';
284 pbuf = &buf[pos] + 1;
286 sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
287 append_filter_string(filter, buf);
288 free_page((unsigned long) buf);
291 void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
293 struct event_filter *filter = call->filter;
295 mutex_lock(&event_mutex);
296 if (filter->filter_string)
297 trace_seq_printf(s, "%s\n", filter->filter_string);
298 else
299 trace_seq_printf(s, "none\n");
300 mutex_unlock(&event_mutex);
303 void print_subsystem_event_filter(struct event_subsystem *system,
304 struct trace_seq *s)
306 struct event_filter *filter = system->filter;
308 mutex_lock(&event_mutex);
309 if (filter->filter_string)
310 trace_seq_printf(s, "%s\n", filter->filter_string);
311 else
312 trace_seq_printf(s, "none\n");
313 mutex_unlock(&event_mutex);
316 static struct ftrace_event_field *
317 find_event_field(struct ftrace_event_call *call, char *name)
319 struct ftrace_event_field *field;
321 list_for_each_entry(field, &call->fields, link) {
322 if (!strcmp(field->name, name))
323 return field;
326 return NULL;
329 static void filter_free_pred(struct filter_pred *pred)
331 if (!pred)
332 return;
334 kfree(pred->field_name);
335 kfree(pred);
338 static void filter_clear_pred(struct filter_pred *pred)
340 kfree(pred->field_name);
341 pred->field_name = NULL;
342 pred->str_len = 0;
345 static int filter_set_pred(struct filter_pred *dest,
346 struct filter_pred *src,
347 filter_pred_fn_t fn)
349 *dest = *src;
350 if (src->field_name) {
351 dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
352 if (!dest->field_name)
353 return -ENOMEM;
355 dest->fn = fn;
357 return 0;
360 static void filter_disable_preds(struct ftrace_event_call *call)
362 struct event_filter *filter = call->filter;
363 int i;
365 call->filter_active = 0;
366 filter->n_preds = 0;
368 for (i = 0; i < MAX_FILTER_PRED; i++)
369 filter->preds[i]->fn = filter_pred_none;
372 void destroy_preds(struct ftrace_event_call *call)
374 struct event_filter *filter = call->filter;
375 int i;
377 for (i = 0; i < MAX_FILTER_PRED; i++) {
378 if (filter->preds[i])
379 filter_free_pred(filter->preds[i]);
381 kfree(filter->preds);
382 kfree(filter->filter_string);
383 kfree(filter);
384 call->filter = NULL;
387 int init_preds(struct ftrace_event_call *call)
389 struct event_filter *filter;
390 struct filter_pred *pred;
391 int i;
393 filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
394 if (!call->filter)
395 return -ENOMEM;
397 call->filter_active = 0;
398 filter->n_preds = 0;
400 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
401 if (!filter->preds)
402 goto oom;
404 for (i = 0; i < MAX_FILTER_PRED; i++) {
405 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
406 if (!pred)
407 goto oom;
408 pred->fn = filter_pred_none;
409 filter->preds[i] = pred;
412 return 0;
414 oom:
415 destroy_preds(call);
417 return -ENOMEM;
419 EXPORT_SYMBOL_GPL(init_preds);
421 static void filter_free_subsystem_preds(struct event_subsystem *system)
423 struct event_filter *filter = system->filter;
424 struct ftrace_event_call *call;
425 int i;
427 if (filter->n_preds) {
428 for (i = 0; i < filter->n_preds; i++)
429 filter_free_pred(filter->preds[i]);
430 kfree(filter->preds);
431 filter->preds = NULL;
432 filter->n_preds = 0;
435 list_for_each_entry(call, &ftrace_events, list) {
436 if (!call->define_fields)
437 continue;
439 if (!strcmp(call->system, system->name)) {
440 filter_disable_preds(call);
441 remove_filter_string(call->filter);
446 static int filter_add_pred_fn(struct filter_parse_state *ps,
447 struct ftrace_event_call *call,
448 struct filter_pred *pred,
449 filter_pred_fn_t fn)
451 struct event_filter *filter = call->filter;
452 int idx, err;
454 if (filter->n_preds == MAX_FILTER_PRED) {
455 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
456 return -ENOSPC;
459 idx = filter->n_preds;
460 filter_clear_pred(filter->preds[idx]);
461 err = filter_set_pred(filter->preds[idx], pred, fn);
462 if (err)
463 return err;
465 filter->n_preds++;
466 call->filter_active = 1;
468 return 0;
471 enum {
472 FILTER_STATIC_STRING = 1,
473 FILTER_DYN_STRING
476 static int is_string_field(const char *type)
478 if (strstr(type, "__data_loc") && strstr(type, "char"))
479 return FILTER_DYN_STRING;
481 if (strchr(type, '[') && strstr(type, "char"))
482 return FILTER_STATIC_STRING;
484 return 0;
487 static int is_legal_op(struct ftrace_event_field *field, int op)
489 if (is_string_field(field->type) && (op != OP_EQ && op != OP_NE))
490 return 0;
492 return 1;
495 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
496 int field_is_signed)
498 filter_pred_fn_t fn = NULL;
500 switch (field_size) {
501 case 8:
502 if (op == OP_EQ || op == OP_NE)
503 fn = filter_pred_64;
504 else if (field_is_signed)
505 fn = filter_pred_s64;
506 else
507 fn = filter_pred_u64;
508 break;
509 case 4:
510 if (op == OP_EQ || op == OP_NE)
511 fn = filter_pred_32;
512 else if (field_is_signed)
513 fn = filter_pred_s32;
514 else
515 fn = filter_pred_u32;
516 break;
517 case 2:
518 if (op == OP_EQ || op == OP_NE)
519 fn = filter_pred_16;
520 else if (field_is_signed)
521 fn = filter_pred_s16;
522 else
523 fn = filter_pred_u16;
524 break;
525 case 1:
526 if (op == OP_EQ || op == OP_NE)
527 fn = filter_pred_8;
528 else if (field_is_signed)
529 fn = filter_pred_s8;
530 else
531 fn = filter_pred_u8;
532 break;
535 return fn;
538 static int filter_add_pred(struct filter_parse_state *ps,
539 struct ftrace_event_call *call,
540 struct filter_pred *pred)
542 struct ftrace_event_field *field;
543 filter_pred_fn_t fn;
544 unsigned long long val;
545 int string_type;
546 int ret;
548 pred->fn = filter_pred_none;
550 if (pred->op == OP_AND) {
551 pred->pop_n = 2;
552 return filter_add_pred_fn(ps, call, pred, filter_pred_and);
553 } else if (pred->op == OP_OR) {
554 pred->pop_n = 2;
555 return filter_add_pred_fn(ps, call, pred, filter_pred_or);
558 field = find_event_field(call, pred->field_name);
559 if (!field) {
560 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
561 return -EINVAL;
564 pred->offset = field->offset;
566 if (!is_legal_op(field, pred->op)) {
567 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
568 return -EINVAL;
571 string_type = is_string_field(field->type);
572 if (string_type) {
573 if (string_type == FILTER_STATIC_STRING)
574 fn = filter_pred_string;
575 else
576 fn = filter_pred_strloc;
577 pred->str_len = field->size;
578 if (pred->op == OP_NE)
579 pred->not = 1;
580 return filter_add_pred_fn(ps, call, pred, fn);
581 } else {
582 if (field->is_signed)
583 ret = strict_strtoll(pred->str_val, 0, &val);
584 else
585 ret = strict_strtoull(pred->str_val, 0, &val);
586 if (ret) {
587 parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
588 return -EINVAL;
590 pred->val = val;
593 fn = select_comparison_fn(pred->op, field->size, field->is_signed);
594 if (!fn) {
595 parse_error(ps, FILT_ERR_INVALID_OP, 0);
596 return -EINVAL;
599 if (pred->op == OP_NE)
600 pred->not = 1;
602 return filter_add_pred_fn(ps, call, pred, fn);
605 static int filter_add_subsystem_pred(struct filter_parse_state *ps,
606 struct event_subsystem *system,
607 struct filter_pred *pred,
608 char *filter_string)
610 struct event_filter *filter = system->filter;
611 struct ftrace_event_call *call;
612 int err = 0;
614 if (!filter->preds) {
615 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
616 GFP_KERNEL);
618 if (!filter->preds)
619 return -ENOMEM;
622 if (filter->n_preds == MAX_FILTER_PRED) {
623 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
624 return -ENOSPC;
627 list_for_each_entry(call, &ftrace_events, list) {
629 if (!call->define_fields)
630 continue;
632 if (strcmp(call->system, system->name))
633 continue;
635 err = filter_add_pred(ps, call, pred);
636 if (err) {
637 filter_free_subsystem_preds(system);
638 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
639 goto out;
641 replace_filter_string(call->filter, filter_string);
644 filter->preds[filter->n_preds] = pred;
645 filter->n_preds++;
646 out:
647 return err;
650 static void parse_init(struct filter_parse_state *ps,
651 struct filter_op *ops,
652 char *infix_string)
654 memset(ps, '\0', sizeof(*ps));
656 ps->infix.string = infix_string;
657 ps->infix.cnt = strlen(infix_string);
658 ps->ops = ops;
660 INIT_LIST_HEAD(&ps->opstack);
661 INIT_LIST_HEAD(&ps->postfix);
664 static char infix_next(struct filter_parse_state *ps)
666 ps->infix.cnt--;
668 return ps->infix.string[ps->infix.tail++];
671 static char infix_peek(struct filter_parse_state *ps)
673 if (ps->infix.tail == strlen(ps->infix.string))
674 return 0;
676 return ps->infix.string[ps->infix.tail];
679 static void infix_advance(struct filter_parse_state *ps)
681 ps->infix.cnt--;
682 ps->infix.tail++;
685 static inline int is_precedence_lower(struct filter_parse_state *ps,
686 int a, int b)
688 return ps->ops[a].precedence < ps->ops[b].precedence;
691 static inline int is_op_char(struct filter_parse_state *ps, char c)
693 int i;
695 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
696 if (ps->ops[i].string[0] == c)
697 return 1;
700 return 0;
703 static int infix_get_op(struct filter_parse_state *ps, char firstc)
705 char nextc = infix_peek(ps);
706 char opstr[3];
707 int i;
709 opstr[0] = firstc;
710 opstr[1] = nextc;
711 opstr[2] = '\0';
713 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
714 if (!strcmp(opstr, ps->ops[i].string)) {
715 infix_advance(ps);
716 return ps->ops[i].id;
720 opstr[1] = '\0';
722 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
723 if (!strcmp(opstr, ps->ops[i].string))
724 return ps->ops[i].id;
727 return OP_NONE;
730 static inline void clear_operand_string(struct filter_parse_state *ps)
732 memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
733 ps->operand.tail = 0;
736 static inline int append_operand_char(struct filter_parse_state *ps, char c)
738 if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
739 return -EINVAL;
741 ps->operand.string[ps->operand.tail++] = c;
743 return 0;
746 static int filter_opstack_push(struct filter_parse_state *ps, int op)
748 struct opstack_op *opstack_op;
750 opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
751 if (!opstack_op)
752 return -ENOMEM;
754 opstack_op->op = op;
755 list_add(&opstack_op->list, &ps->opstack);
757 return 0;
760 static int filter_opstack_empty(struct filter_parse_state *ps)
762 return list_empty(&ps->opstack);
765 static int filter_opstack_top(struct filter_parse_state *ps)
767 struct opstack_op *opstack_op;
769 if (filter_opstack_empty(ps))
770 return OP_NONE;
772 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
774 return opstack_op->op;
777 static int filter_opstack_pop(struct filter_parse_state *ps)
779 struct opstack_op *opstack_op;
780 int op;
782 if (filter_opstack_empty(ps))
783 return OP_NONE;
785 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
786 op = opstack_op->op;
787 list_del(&opstack_op->list);
789 kfree(opstack_op);
791 return op;
794 static void filter_opstack_clear(struct filter_parse_state *ps)
796 while (!filter_opstack_empty(ps))
797 filter_opstack_pop(ps);
800 static char *curr_operand(struct filter_parse_state *ps)
802 return ps->operand.string;
805 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
807 struct postfix_elt *elt;
809 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
810 if (!elt)
811 return -ENOMEM;
813 elt->op = OP_NONE;
814 elt->operand = kstrdup(operand, GFP_KERNEL);
815 if (!elt->operand) {
816 kfree(elt);
817 return -ENOMEM;
820 list_add_tail(&elt->list, &ps->postfix);
822 return 0;
825 static int postfix_append_op(struct filter_parse_state *ps, int op)
827 struct postfix_elt *elt;
829 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
830 if (!elt)
831 return -ENOMEM;
833 elt->op = op;
834 elt->operand = NULL;
836 list_add_tail(&elt->list, &ps->postfix);
838 return 0;
841 static void postfix_clear(struct filter_parse_state *ps)
843 struct postfix_elt *elt;
845 while (!list_empty(&ps->postfix)) {
846 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
847 kfree(elt->operand);
848 list_del(&elt->list);
852 static int filter_parse(struct filter_parse_state *ps)
854 int in_string = 0;
855 int op, top_op;
856 char ch;
858 while ((ch = infix_next(ps))) {
859 if (ch == '"') {
860 in_string ^= 1;
861 continue;
864 if (in_string)
865 goto parse_operand;
867 if (isspace(ch))
868 continue;
870 if (is_op_char(ps, ch)) {
871 op = infix_get_op(ps, ch);
872 if (op == OP_NONE) {
873 parse_error(ps, FILT_ERR_INVALID_OP, 0);
874 return -EINVAL;
877 if (strlen(curr_operand(ps))) {
878 postfix_append_operand(ps, curr_operand(ps));
879 clear_operand_string(ps);
882 while (!filter_opstack_empty(ps)) {
883 top_op = filter_opstack_top(ps);
884 if (!is_precedence_lower(ps, top_op, op)) {
885 top_op = filter_opstack_pop(ps);
886 postfix_append_op(ps, top_op);
887 continue;
889 break;
892 filter_opstack_push(ps, op);
893 continue;
896 if (ch == '(') {
897 filter_opstack_push(ps, OP_OPEN_PAREN);
898 continue;
901 if (ch == ')') {
902 if (strlen(curr_operand(ps))) {
903 postfix_append_operand(ps, curr_operand(ps));
904 clear_operand_string(ps);
907 top_op = filter_opstack_pop(ps);
908 while (top_op != OP_NONE) {
909 if (top_op == OP_OPEN_PAREN)
910 break;
911 postfix_append_op(ps, top_op);
912 top_op = filter_opstack_pop(ps);
914 if (top_op == OP_NONE) {
915 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
916 return -EINVAL;
918 continue;
920 parse_operand:
921 if (append_operand_char(ps, ch)) {
922 parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
923 return -EINVAL;
927 if (strlen(curr_operand(ps)))
928 postfix_append_operand(ps, curr_operand(ps));
930 while (!filter_opstack_empty(ps)) {
931 top_op = filter_opstack_pop(ps);
932 if (top_op == OP_NONE)
933 break;
934 if (top_op == OP_OPEN_PAREN) {
935 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
936 return -EINVAL;
938 postfix_append_op(ps, top_op);
941 return 0;
944 static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
946 struct filter_pred *pred;
948 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
949 if (!pred)
950 return NULL;
952 pred->field_name = kstrdup(operand1, GFP_KERNEL);
953 if (!pred->field_name) {
954 kfree(pred);
955 return NULL;
958 strcpy(pred->str_val, operand2);
959 pred->str_len = strlen(operand2);
961 pred->op = op;
963 return pred;
966 static struct filter_pred *create_logical_pred(int op)
968 struct filter_pred *pred;
970 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
971 if (!pred)
972 return NULL;
974 pred->op = op;
976 return pred;
979 static int check_preds(struct filter_parse_state *ps)
981 int n_normal_preds = 0, n_logical_preds = 0;
982 struct postfix_elt *elt;
984 list_for_each_entry(elt, &ps->postfix, list) {
985 if (elt->op == OP_NONE)
986 continue;
988 if (elt->op == OP_AND || elt->op == OP_OR) {
989 n_logical_preds++;
990 continue;
992 n_normal_preds++;
995 if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
996 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
997 return -EINVAL;
1000 return 0;
1003 static int replace_preds(struct event_subsystem *system,
1004 struct ftrace_event_call *call,
1005 struct filter_parse_state *ps,
1006 char *filter_string)
1008 char *operand1 = NULL, *operand2 = NULL;
1009 struct filter_pred *pred;
1010 struct postfix_elt *elt;
1011 int err;
1013 err = check_preds(ps);
1014 if (err)
1015 return err;
1017 list_for_each_entry(elt, &ps->postfix, list) {
1018 if (elt->op == OP_NONE) {
1019 if (!operand1)
1020 operand1 = elt->operand;
1021 else if (!operand2)
1022 operand2 = elt->operand;
1023 else {
1024 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1025 return -EINVAL;
1027 continue;
1030 if (elt->op == OP_AND || elt->op == OP_OR) {
1031 pred = create_logical_pred(elt->op);
1032 if (!pred)
1033 return -ENOMEM;
1034 if (call) {
1035 err = filter_add_pred(ps, call, pred);
1036 filter_free_pred(pred);
1037 } else {
1038 err = filter_add_subsystem_pred(ps, system,
1039 pred, filter_string);
1040 if (err)
1041 filter_free_pred(pred);
1043 if (err)
1044 return err;
1046 operand1 = operand2 = NULL;
1047 continue;
1050 if (!operand1 || !operand2) {
1051 parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1052 return -EINVAL;
1055 pred = create_pred(elt->op, operand1, operand2);
1056 if (!pred)
1057 return -ENOMEM;
1058 if (call) {
1059 err = filter_add_pred(ps, call, pred);
1060 filter_free_pred(pred);
1061 } else {
1062 err = filter_add_subsystem_pred(ps, system, pred,
1063 filter_string);
1064 if (err)
1065 filter_free_pred(pred);
1067 if (err)
1068 return err;
1070 operand1 = operand2 = NULL;
1073 return 0;
1076 int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1078 int err;
1080 struct filter_parse_state *ps;
1082 mutex_lock(&event_mutex);
1084 if (!strcmp(strstrip(filter_string), "0")) {
1085 filter_disable_preds(call);
1086 remove_filter_string(call->filter);
1087 mutex_unlock(&event_mutex);
1088 return 0;
1091 err = -ENOMEM;
1092 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1093 if (!ps)
1094 goto out_unlock;
1096 filter_disable_preds(call);
1097 replace_filter_string(call->filter, filter_string);
1099 parse_init(ps, filter_ops, filter_string);
1100 err = filter_parse(ps);
1101 if (err) {
1102 append_filter_err(ps, call->filter);
1103 goto out;
1106 err = replace_preds(NULL, call, ps, filter_string);
1107 if (err)
1108 append_filter_err(ps, call->filter);
1110 out:
1111 filter_opstack_clear(ps);
1112 postfix_clear(ps);
1113 kfree(ps);
1114 out_unlock:
1115 mutex_unlock(&event_mutex);
1117 return err;
1120 int apply_subsystem_event_filter(struct event_subsystem *system,
1121 char *filter_string)
1123 int err;
1125 struct filter_parse_state *ps;
1127 mutex_lock(&event_mutex);
1129 if (!strcmp(strstrip(filter_string), "0")) {
1130 filter_free_subsystem_preds(system);
1131 remove_filter_string(system->filter);
1132 mutex_unlock(&event_mutex);
1133 return 0;
1136 err = -ENOMEM;
1137 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1138 if (!ps)
1139 goto out_unlock;
1141 filter_free_subsystem_preds(system);
1142 replace_filter_string(system->filter, filter_string);
1144 parse_init(ps, filter_ops, filter_string);
1145 err = filter_parse(ps);
1146 if (err) {
1147 append_filter_err(ps, system->filter);
1148 goto out;
1151 err = replace_preds(system, NULL, ps, filter_string);
1152 if (err)
1153 append_filter_err(ps, system->filter);
1155 out:
1156 filter_opstack_clear(ps);
1157 postfix_clear(ps);
1158 kfree(ps);
1159 out_unlock:
1160 mutex_unlock(&event_mutex);
1162 return err;