Merge tag 'v3.10.55' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / trace / trace_events_filter.c
CommitLineData
7ce7e424
TZ
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
7ce7e424
TZ
21#include <linux/module.h>
22#include <linux/ctype.h>
ac1adc55 23#include <linux/mutex.h>
6fb2915d 24#include <linux/perf_event.h>
5a0e3ad6 25#include <linux/slab.h>
7ce7e424
TZ
26
27#include "trace.h"
4bda2d51 28#include "trace_output.h"
7ce7e424 29
49aa2951
SR
30#define DEFAULT_SYS_FILTER_MESSAGE \
31 "### global filter ###\n" \
32 "# Use this to set filters for multiple events.\n" \
33 "# Only events with the given fields will be affected.\n" \
34 "# If no events are modified, an error message will be displayed here"
35
8b372562 36enum filter_op_ids
7ce7e424 37{
8b372562
TZ
38 OP_OR,
39 OP_AND,
b0f1a59a 40 OP_GLOB,
8b372562
TZ
41 OP_NE,
42 OP_EQ,
43 OP_LT,
44 OP_LE,
45 OP_GT,
46 OP_GE,
47 OP_NONE,
48 OP_OPEN_PAREN,
49};
50
51struct filter_op {
52 int id;
53 char *string;
54 int precedence;
55};
56
57static struct filter_op filter_ops[] = {
b0f1a59a
LZ
58 { OP_OR, "||", 1 },
59 { OP_AND, "&&", 2 },
60 { OP_GLOB, "~", 4 },
61 { OP_NE, "!=", 4 },
62 { OP_EQ, "==", 4 },
63 { OP_LT, "<", 5 },
64 { OP_LE, "<=", 5 },
65 { OP_GT, ">", 5 },
66 { OP_GE, ">=", 5 },
67 { OP_NONE, "OP_NONE", 0 },
68 { OP_OPEN_PAREN, "(", 0 },
8b372562
TZ
69};
70
71enum {
72 FILT_ERR_NONE,
73 FILT_ERR_INVALID_OP,
74 FILT_ERR_UNBALANCED_PAREN,
75 FILT_ERR_TOO_MANY_OPERANDS,
76 FILT_ERR_OPERAND_TOO_LONG,
77 FILT_ERR_FIELD_NOT_FOUND,
78 FILT_ERR_ILLEGAL_FIELD_OP,
79 FILT_ERR_ILLEGAL_INTVAL,
80 FILT_ERR_BAD_SUBSYS_FILTER,
81 FILT_ERR_TOO_MANY_PREDS,
82 FILT_ERR_MISSING_FIELD,
83 FILT_ERR_INVALID_FILTER,
5500fa51 84 FILT_ERR_IP_FIELD_ONLY,
8b372562
TZ
85};
86
87static char *err_text[] = {
88 "No error",
89 "Invalid operator",
90 "Unbalanced parens",
91 "Too many operands",
92 "Operand too long",
93 "Field not found",
94 "Illegal operation for field type",
95 "Illegal integer value",
96 "Couldn't find or set field in one of a subsystem's events",
97 "Too many terms in predicate expression",
98 "Missing field name and/or value",
99 "Meaningless filter expression",
5500fa51 100 "Only 'ip' field is supported for function trace",
8b372562
TZ
101};
102
103struct opstack_op {
104 int op;
105 struct list_head list;
106};
107
108struct postfix_elt {
109 int op;
110 char *operand;
111 struct list_head list;
112};
113
114struct filter_parse_state {
115 struct filter_op *ops;
116 struct list_head opstack;
117 struct list_head postfix;
118 int lasterr;
119 int lasterr_pos;
120
121 struct {
122 char *string;
123 unsigned int cnt;
124 unsigned int tail;
125 } infix;
126
127 struct {
128 char string[MAX_FILTER_STR_VAL];
129 int pos;
130 unsigned int tail;
131 } operand;
132};
133
61e9dea2
SR
134struct pred_stack {
135 struct filter_pred **preds;
136 int index;
137};
138
197e2eab 139#define DEFINE_COMPARISON_PRED(type) \
58d9a597 140static int filter_pred_##type(struct filter_pred *pred, void *event) \
197e2eab
LZ
141{ \
142 type *addr = (type *)(event + pred->offset); \
143 type val = (type)pred->val; \
144 int match = 0; \
145 \
146 switch (pred->op) { \
147 case OP_LT: \
148 match = (*addr < val); \
149 break; \
150 case OP_LE: \
151 match = (*addr <= val); \
152 break; \
153 case OP_GT: \
154 match = (*addr > val); \
155 break; \
156 case OP_GE: \
157 match = (*addr >= val); \
158 break; \
159 default: \
160 break; \
161 } \
162 \
163 return match; \
164}
165
166#define DEFINE_EQUALITY_PRED(size) \
58d9a597 167static int filter_pred_##size(struct filter_pred *pred, void *event) \
197e2eab
LZ
168{ \
169 u##size *addr = (u##size *)(event + pred->offset); \
170 u##size val = (u##size)pred->val; \
171 int match; \
172 \
173 match = (val == *addr) ^ pred->not; \
174 \
175 return match; \
176}
177
8b372562
TZ
178DEFINE_COMPARISON_PRED(s64);
179DEFINE_COMPARISON_PRED(u64);
180DEFINE_COMPARISON_PRED(s32);
181DEFINE_COMPARISON_PRED(u32);
182DEFINE_COMPARISON_PRED(s16);
183DEFINE_COMPARISON_PRED(u16);
184DEFINE_COMPARISON_PRED(s8);
185DEFINE_COMPARISON_PRED(u8);
186
187DEFINE_EQUALITY_PRED(64);
188DEFINE_EQUALITY_PRED(32);
189DEFINE_EQUALITY_PRED(16);
190DEFINE_EQUALITY_PRED(8);
191
e8808c10 192/* Filter predicate for fixed sized arrays of characters */
58d9a597 193static int filter_pred_string(struct filter_pred *pred, void *event)
7ce7e424
TZ
194{
195 char *addr = (char *)(event + pred->offset);
196 int cmp, match;
197
1889d209 198 cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
7ce7e424 199
1889d209 200 match = cmp ^ pred->not;
7ce7e424
TZ
201
202 return match;
203}
204
87a342f5 205/* Filter predicate for char * pointers */
58d9a597 206static int filter_pred_pchar(struct filter_pred *pred, void *event)
87a342f5
LZ
207{
208 char **addr = (char **)(event + pred->offset);
209 int cmp, match;
16da27a8 210 int len = strlen(*addr) + 1; /* including tailing '\0' */
87a342f5 211
16da27a8 212 cmp = pred->regex.match(*addr, &pred->regex, len);
87a342f5 213
1889d209 214 match = cmp ^ pred->not;
87a342f5
LZ
215
216 return match;
217}
218
e8808c10
FW
219/*
220 * Filter predicate for dynamic sized arrays of characters.
221 * These are implemented through a list of strings at the end
222 * of the entry.
223 * Also each of these strings have a field in the entry which
224 * contains its offset from the beginning of the entry.
225 * We have then first to get this field, dereference it
226 * and add it to the address of the entry, and at last we have
227 * the address of the string.
228 */
58d9a597 229static int filter_pred_strloc(struct filter_pred *pred, void *event)
e8808c10 230{
7d536cb3
LZ
231 u32 str_item = *(u32 *)(event + pred->offset);
232 int str_loc = str_item & 0xffff;
233 int str_len = str_item >> 16;
e8808c10
FW
234 char *addr = (char *)(event + str_loc);
235 int cmp, match;
236
1889d209 237 cmp = pred->regex.match(addr, &pred->regex, str_len);
e8808c10 238
1889d209 239 match = cmp ^ pred->not;
e8808c10
FW
240
241 return match;
242}
243
58d9a597 244static int filter_pred_none(struct filter_pred *pred, void *event)
0a19e53c
TZ
245{
246 return 0;
247}
248
d1303dd1
LZ
249/*
250 * regex_match_foo - Basic regex callbacks
251 *
252 * @str: the string to be searched
253 * @r: the regex structure containing the pattern string
254 * @len: the length of the string to be searched (including '\0')
255 *
256 * Note:
257 * - @str might not be NULL-terminated if it's of type DYN_STRING
258 * or STATIC_STRING
259 */
260
1889d209
FW
261static int regex_match_full(char *str, struct regex *r, int len)
262{
263 if (strncmp(str, r->pattern, len) == 0)
264 return 1;
265 return 0;
266}
267
268static int regex_match_front(char *str, struct regex *r, int len)
269{
285caad4 270 if (strncmp(str, r->pattern, r->len) == 0)
1889d209
FW
271 return 1;
272 return 0;
273}
274
275static int regex_match_middle(char *str, struct regex *r, int len)
276{
b2af211f 277 if (strnstr(str, r->pattern, len))
1889d209
FW
278 return 1;
279 return 0;
280}
281
282static int regex_match_end(char *str, struct regex *r, int len)
283{
a3291c14 284 int strlen = len - 1;
1889d209 285
a3291c14
LZ
286 if (strlen >= r->len &&
287 memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
1889d209
FW
288 return 1;
289 return 0;
290}
291
3f6fe06d
FW
292/**
293 * filter_parse_regex - parse a basic regex
294 * @buff: the raw regex
295 * @len: length of the regex
296 * @search: will point to the beginning of the string to compare
297 * @not: tell whether the match will have to be inverted
298 *
299 * This passes in a buffer containing a regex and this function will
1889d209
FW
300 * set search to point to the search part of the buffer and
301 * return the type of search it is (see enum above).
302 * This does modify buff.
303 *
304 * Returns enum type.
305 * search returns the pointer to use for comparison.
306 * not returns 1 if buff started with a '!'
307 * 0 otherwise.
308 */
3f6fe06d 309enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
1889d209
FW
310{
311 int type = MATCH_FULL;
312 int i;
313
314 if (buff[0] == '!') {
315 *not = 1;
316 buff++;
317 len--;
318 } else
319 *not = 0;
320
321 *search = buff;
322
323 for (i = 0; i < len; i++) {
324 if (buff[i] == '*') {
325 if (!i) {
326 *search = buff + 1;
327 type = MATCH_END_ONLY;
328 } else {
329 if (type == MATCH_END_ONLY)
330 type = MATCH_MIDDLE_ONLY;
331 else
332 type = MATCH_FRONT_ONLY;
333 buff[i] = 0;
334 break;
335 }
336 }
337 }
338
339 return type;
340}
341
b0f1a59a 342static void filter_build_regex(struct filter_pred *pred)
1889d209
FW
343{
344 struct regex *r = &pred->regex;
b0f1a59a
LZ
345 char *search;
346 enum regex_type type = MATCH_FULL;
347 int not = 0;
348
349 if (pred->op == OP_GLOB) {
350 type = filter_parse_regex(r->pattern, r->len, &search, &not);
351 r->len = strlen(search);
352 memmove(r->pattern, search, r->len+1);
353 }
1889d209
FW
354
355 switch (type) {
356 case MATCH_FULL:
357 r->match = regex_match_full;
358 break;
359 case MATCH_FRONT_ONLY:
360 r->match = regex_match_front;
361 break;
362 case MATCH_MIDDLE_ONLY:
363 r->match = regex_match_middle;
364 break;
365 case MATCH_END_ONLY:
366 r->match = regex_match_end;
367 break;
368 }
369
370 pred->not ^= not;
1889d209
FW
371}
372
61e9dea2
SR
373enum move_type {
374 MOVE_DOWN,
375 MOVE_UP_FROM_LEFT,
376 MOVE_UP_FROM_RIGHT
377};
378
379static struct filter_pred *
380get_pred_parent(struct filter_pred *pred, struct filter_pred *preds,
381 int index, enum move_type *move)
382{
383 if (pred->parent & FILTER_PRED_IS_RIGHT)
384 *move = MOVE_UP_FROM_RIGHT;
385 else
386 *move = MOVE_UP_FROM_LEFT;
387 pred = &preds[pred->parent & ~FILTER_PRED_IS_RIGHT];
388
389 return pred;
390}
391
f03f5979
JO
392enum walk_return {
393 WALK_PRED_ABORT,
394 WALK_PRED_PARENT,
395 WALK_PRED_DEFAULT,
396};
397
398typedef int (*filter_pred_walkcb_t) (enum move_type move,
399 struct filter_pred *pred,
400 int *err, void *data);
401
402static int walk_pred_tree(struct filter_pred *preds,
403 struct filter_pred *root,
404 filter_pred_walkcb_t cb, void *data)
405{
406 struct filter_pred *pred = root;
407 enum move_type move = MOVE_DOWN;
408 int done = 0;
409
410 if (!preds)
411 return -EINVAL;
412
413 do {
414 int err = 0, ret;
415
416 ret = cb(move, pred, &err, data);
417 if (ret == WALK_PRED_ABORT)
418 return err;
419 if (ret == WALK_PRED_PARENT)
420 goto get_parent;
421
422 switch (move) {
423 case MOVE_DOWN:
424 if (pred->left != FILTER_PRED_INVALID) {
425 pred = &preds[pred->left];
426 continue;
427 }
428 goto get_parent;
429 case MOVE_UP_FROM_LEFT:
430 pred = &preds[pred->right];
431 move = MOVE_DOWN;
432 continue;
433 case MOVE_UP_FROM_RIGHT:
434 get_parent:
435 if (pred == root)
436 break;
437 pred = get_pred_parent(pred, preds,
438 pred->parent,
439 &move);
440 continue;
441 }
442 done = 1;
443 } while (!done);
444
445 /* We are fine. */
446 return 0;
447}
448
43cd4145
SR
449/*
450 * A series of AND or ORs where found together. Instead of
451 * climbing up and down the tree branches, an array of the
452 * ops were made in order of checks. We can just move across
453 * the array and short circuit if needed.
454 */
455static int process_ops(struct filter_pred *preds,
456 struct filter_pred *op, void *rec)
457{
458 struct filter_pred *pred;
1ef1d1c2 459 int match = 0;
43cd4145 460 int type;
43cd4145
SR
461 int i;
462
463 /*
464 * Micro-optimization: We set type to true if op
465 * is an OR and false otherwise (AND). Then we
466 * just need to test if the match is equal to
467 * the type, and if it is, we can short circuit the
468 * rest of the checks:
469 *
470 * if ((match && op->op == OP_OR) ||
471 * (!match && op->op == OP_AND))
472 * return match;
473 */
474 type = op->op == OP_OR;
475
476 for (i = 0; i < op->val; i++) {
477 pred = &preds[op->ops[i]];
f30120fc
JO
478 if (!WARN_ON_ONCE(!pred->fn))
479 match = pred->fn(pred, rec);
43cd4145
SR
480 if (!!match == type)
481 return match;
482 }
483 return match;
484}
485
f30120fc
JO
486struct filter_match_preds_data {
487 struct filter_pred *preds;
488 int match;
489 void *rec;
490};
491
492static int filter_match_preds_cb(enum move_type move, struct filter_pred *pred,
493 int *err, void *data)
494{
495 struct filter_match_preds_data *d = data;
496
497 *err = 0;
498 switch (move) {
499 case MOVE_DOWN:
500 /* only AND and OR have children */
501 if (pred->left != FILTER_PRED_INVALID) {
502 /* If ops is set, then it was folded. */
503 if (!pred->ops)
504 return WALK_PRED_DEFAULT;
505 /* We can treat folded ops as a leaf node */
506 d->match = process_ops(d->preds, pred, d->rec);
507 } else {
508 if (!WARN_ON_ONCE(!pred->fn))
509 d->match = pred->fn(pred, d->rec);
510 }
511
512 return WALK_PRED_PARENT;
513 case MOVE_UP_FROM_LEFT:
514 /*
515 * Check for short circuits.
516 *
517 * Optimization: !!match == (pred->op == OP_OR)
518 * is the same as:
519 * if ((match && pred->op == OP_OR) ||
520 * (!match && pred->op == OP_AND))
521 */
522 if (!!d->match == (pred->op == OP_OR))
523 return WALK_PRED_PARENT;
524 break;
525 case MOVE_UP_FROM_RIGHT:
526 break;
527 }
528
529 return WALK_PRED_DEFAULT;
530}
531
7ce7e424 532/* return 1 if event matches, 0 otherwise (discard) */
6fb2915d 533int filter_match_preds(struct event_filter *filter, void *rec)
7ce7e424 534{
74e9e58c 535 struct filter_pred *preds;
61e9dea2 536 struct filter_pred *root;
f30120fc
JO
537 struct filter_match_preds_data data = {
538 /* match is currently meaningless */
539 .match = -1,
540 .rec = rec,
541 };
542 int n_preds, ret;
7ce7e424 543
6d54057d 544 /* no filter is considered a match */
75b8e982
SR
545 if (!filter)
546 return 1;
547
548 n_preds = filter->n_preds;
6d54057d
SR
549 if (!n_preds)
550 return 1;
551
c9c53ca0 552 /*
61e9dea2 553 * n_preds, root and filter->preds are protect with preemption disabled.
c9c53ca0 554 */
61e9dea2
SR
555 root = rcu_dereference_sched(filter->root);
556 if (!root)
557 return 1;
c9c53ca0 558
f30120fc
JO
559 data.preds = preds = rcu_dereference_sched(filter->preds);
560 ret = walk_pred_tree(preds, root, filter_match_preds_cb, &data);
561 WARN_ON(ret);
562 return data.match;
7ce7e424 563}
17c873ec 564EXPORT_SYMBOL_GPL(filter_match_preds);
7ce7e424 565
8b372562 566static void parse_error(struct filter_parse_state *ps, int err, int pos)
7ce7e424 567{
8b372562
TZ
568 ps->lasterr = err;
569 ps->lasterr_pos = pos;
570}
7ce7e424 571
8b372562
TZ
572static void remove_filter_string(struct event_filter *filter)
573{
75b8e982
SR
574 if (!filter)
575 return;
576
8b372562
TZ
577 kfree(filter->filter_string);
578 filter->filter_string = NULL;
579}
580
581static int replace_filter_string(struct event_filter *filter,
582 char *filter_string)
583{
584 kfree(filter->filter_string);
585 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
586 if (!filter->filter_string)
587 return -ENOMEM;
588
589 return 0;
590}
591
592static int append_filter_string(struct event_filter *filter,
593 char *string)
594{
595 int newlen;
596 char *new_filter_string;
597
598 BUG_ON(!filter->filter_string);
599 newlen = strlen(filter->filter_string) + strlen(string) + 1;
600 new_filter_string = kmalloc(newlen, GFP_KERNEL);
601 if (!new_filter_string)
602 return -ENOMEM;
603
604 strcpy(new_filter_string, filter->filter_string);
605 strcat(new_filter_string, string);
606 kfree(filter->filter_string);
607 filter->filter_string = new_filter_string;
608
609 return 0;
610}
611
612static void append_filter_err(struct filter_parse_state *ps,
613 struct event_filter *filter)
614{
615 int pos = ps->lasterr_pos;
616 char *buf, *pbuf;
617
618 buf = (char *)__get_free_page(GFP_TEMPORARY);
619 if (!buf)
4bda2d51 620 return;
7ce7e424 621
8b372562
TZ
622 append_filter_string(filter, "\n");
623 memset(buf, ' ', PAGE_SIZE);
624 if (pos > PAGE_SIZE - 128)
625 pos = 0;
626 buf[pos] = '^';
627 pbuf = &buf[pos] + 1;
628
629 sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
630 append_filter_string(filter, buf);
631 free_page((unsigned long) buf);
7ce7e424
TZ
632}
633
70c91fb9 634/* caller must hold event_mutex */
8b372562 635void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
ac1adc55 636{
70c91fb9 637 struct event_filter *filter = call->filter;
8b372562 638
8e254c1d 639 if (filter && filter->filter_string)
8b372562
TZ
640 trace_seq_printf(s, "%s\n", filter->filter_string);
641 else
642 trace_seq_printf(s, "none\n");
ac1adc55
TZ
643}
644
8b372562 645void print_subsystem_event_filter(struct event_subsystem *system,
ac1adc55
TZ
646 struct trace_seq *s)
647{
75b8e982 648 struct event_filter *filter;
8b372562 649
00e95830 650 mutex_lock(&event_mutex);
75b8e982 651 filter = system->filter;
8e254c1d 652 if (filter && filter->filter_string)
8b372562
TZ
653 trace_seq_printf(s, "%s\n", filter->filter_string);
654 else
49aa2951 655 trace_seq_printf(s, DEFAULT_SYS_FILTER_MESSAGE "\n");
00e95830 656 mutex_unlock(&event_mutex);
ac1adc55
TZ
657}
658
61e9dea2
SR
659static int __alloc_pred_stack(struct pred_stack *stack, int n_preds)
660{
47b0edcb 661 stack->preds = kcalloc(n_preds + 1, sizeof(*stack->preds), GFP_KERNEL);
61e9dea2
SR
662 if (!stack->preds)
663 return -ENOMEM;
664 stack->index = n_preds;
665 return 0;
666}
667
668static void __free_pred_stack(struct pred_stack *stack)
669{
670 kfree(stack->preds);
671 stack->index = 0;
672}
673
674static int __push_pred_stack(struct pred_stack *stack,
675 struct filter_pred *pred)
676{
677 int index = stack->index;
678
679 if (WARN_ON(index == 0))
680 return -ENOSPC;
681
682 stack->preds[--index] = pred;
683 stack->index = index;
684 return 0;
685}
686
687static struct filter_pred *
688__pop_pred_stack(struct pred_stack *stack)
689{
690 struct filter_pred *pred;
691 int index = stack->index;
692
693 pred = stack->preds[index++];
694 if (!pred)
695 return NULL;
696
697 stack->index = index;
698 return pred;
699}
700
701static int filter_set_pred(struct event_filter *filter,
702 int idx,
703 struct pred_stack *stack,
9d96cd17 704 struct filter_pred *src)
0a19e53c 705{
61e9dea2
SR
706 struct filter_pred *dest = &filter->preds[idx];
707 struct filter_pred *left;
708 struct filter_pred *right;
709
0a19e53c 710 *dest = *src;
61e9dea2 711 dest->index = idx;
0a19e53c 712
61e9dea2
SR
713 if (dest->op == OP_OR || dest->op == OP_AND) {
714 right = __pop_pred_stack(stack);
715 left = __pop_pred_stack(stack);
716 if (!left || !right)
717 return -EINVAL;
43cd4145
SR
718 /*
719 * If both children can be folded
720 * and they are the same op as this op or a leaf,
721 * then this op can be folded.
722 */
723 if (left->index & FILTER_PRED_FOLD &&
724 (left->op == dest->op ||
725 left->left == FILTER_PRED_INVALID) &&
726 right->index & FILTER_PRED_FOLD &&
727 (right->op == dest->op ||
728 right->left == FILTER_PRED_INVALID))
729 dest->index |= FILTER_PRED_FOLD;
730
731 dest->left = left->index & ~FILTER_PRED_FOLD;
732 dest->right = right->index & ~FILTER_PRED_FOLD;
733 left->parent = dest->index & ~FILTER_PRED_FOLD;
61e9dea2 734 right->parent = dest->index | FILTER_PRED_IS_RIGHT;
43cd4145 735 } else {
61e9dea2
SR
736 /*
737 * Make dest->left invalid to be used as a quick
738 * way to know this is a leaf node.
739 */
740 dest->left = FILTER_PRED_INVALID;
741
43cd4145
SR
742 /* All leafs allow folding the parent ops. */
743 dest->index |= FILTER_PRED_FOLD;
744 }
745
61e9dea2 746 return __push_pred_stack(stack, dest);
0a19e53c
TZ
747}
748
c9c53ca0
SR
749static void __free_preds(struct event_filter *filter)
750{
60705c89
SRRH
751 int i;
752
c9c53ca0 753 if (filter->preds) {
60705c89
SRRH
754 for (i = 0; i < filter->n_preds; i++)
755 kfree(filter->preds[i].ops);
c9c53ca0
SR
756 kfree(filter->preds);
757 filter->preds = NULL;
758 }
759 filter->a_preds = 0;
760 filter->n_preds = 0;
761}
762
75b8e982 763static void filter_disable(struct ftrace_event_call *call)
7ce7e424 764{
553552ce 765 call->flags &= ~TRACE_EVENT_FL_FILTERED;
0a19e53c
TZ
766}
767
c9c53ca0 768static void __free_filter(struct event_filter *filter)
2df75e41 769{
8e254c1d
LZ
770 if (!filter)
771 return;
772
c9c53ca0 773 __free_preds(filter);
57be8887 774 kfree(filter->filter_string);
2df75e41 775 kfree(filter);
6fb2915d
LZ
776}
777
75b8e982
SR
778/*
779 * Called when destroying the ftrace_event_call.
780 * The call is being freed, so we do not need to worry about
781 * the call being currently used. This is for module code removing
782 * the tracepoints from within it.
783 */
6fb2915d
LZ
784void destroy_preds(struct ftrace_event_call *call)
785{
c9c53ca0 786 __free_filter(call->filter);
2df75e41
LZ
787 call->filter = NULL;
788}
789
c9c53ca0 790static struct event_filter *__alloc_filter(void)
0a19e53c 791{
30e673b2 792 struct event_filter *filter;
0a19e53c 793
6fb2915d 794 filter = kzalloc(sizeof(*filter), GFP_KERNEL);
c9c53ca0
SR
795 return filter;
796}
797
798static int __alloc_preds(struct event_filter *filter, int n_preds)
799{
800 struct filter_pred *pred;
801 int i;
802
4defe682
SR
803 if (filter->preds)
804 __free_preds(filter);
805
47b0edcb 806 filter->preds = kcalloc(n_preds, sizeof(*filter->preds), GFP_KERNEL);
c9c53ca0 807
30e673b2 808 if (!filter->preds)
c9c53ca0
SR
809 return -ENOMEM;
810
4defe682
SR
811 filter->a_preds = n_preds;
812 filter->n_preds = 0;
30e673b2 813
c9c53ca0 814 for (i = 0; i < n_preds; i++) {
74e9e58c 815 pred = &filter->preds[i];
0a19e53c 816 pred->fn = filter_pred_none;
0a19e53c
TZ
817 }
818
c9c53ca0 819 return 0;
6fb2915d
LZ
820}
821
75b8e982 822static void filter_free_subsystem_preds(struct event_subsystem *system)
8e254c1d
LZ
823{
824 struct ftrace_event_call *call;
8e254c1d
LZ
825
826 list_for_each_entry(call, &ftrace_events, list) {
8f082018 827 if (strcmp(call->class->system, system->name) != 0)
8e254c1d
LZ
828 continue;
829
75b8e982
SR
830 filter_disable(call);
831 remove_filter_string(call->filter);
8e254c1d 832 }
8e254c1d 833}
7ce7e424 834
75b8e982 835static void filter_free_subsystem_filters(struct event_subsystem *system)
cfb180f3 836{
a59fd602 837 struct ftrace_event_call *call;
cfb180f3 838
a59fd602 839 list_for_each_entry(call, &ftrace_events, list) {
8f082018 840 if (strcmp(call->class->system, system->name) != 0)
8e254c1d 841 continue;
75b8e982
SR
842 __free_filter(call->filter);
843 call->filter = NULL;
cfb180f3
TZ
844 }
845}
846
9d96cd17
JO
847static int filter_add_pred(struct filter_parse_state *ps,
848 struct event_filter *filter,
849 struct filter_pred *pred,
850 struct pred_stack *stack)
7ce7e424 851{
61aaef55 852 int err;
7ce7e424 853
c9c53ca0 854 if (WARN_ON(filter->n_preds == filter->a_preds)) {
8b372562 855 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
0a19e53c 856 return -ENOSPC;
8b372562 857 }
7ce7e424 858
61aaef55 859 err = filter_set_pred(filter, filter->n_preds, stack, pred);
0a19e53c
TZ
860 if (err)
861 return err;
862
30e673b2 863 filter->n_preds++;
7ce7e424 864
0a19e53c 865 return 0;
7ce7e424
TZ
866}
867
aa38e9fc 868int filter_assign_type(const char *type)
7ce7e424 869{
7fcb7c47
LZ
870 if (strstr(type, "__data_loc") && strstr(type, "char"))
871 return FILTER_DYN_STRING;
872
7ce7e424 873 if (strchr(type, '[') && strstr(type, "char"))
e8808c10
FW
874 return FILTER_STATIC_STRING;
875
aa38e9fc
LZ
876 return FILTER_OTHER;
877}
878
02aa3162
JO
879static bool is_function_field(struct ftrace_event_field *field)
880{
881 return field->filter_type == FILTER_TRACE_FN;
882}
883
aa38e9fc
LZ
884static bool is_string_field(struct ftrace_event_field *field)
885{
886 return field->filter_type == FILTER_DYN_STRING ||
87a342f5
LZ
887 field->filter_type == FILTER_STATIC_STRING ||
888 field->filter_type == FILTER_PTR_STRING;
7ce7e424
TZ
889}
890
8b372562
TZ
891static int is_legal_op(struct ftrace_event_field *field, int op)
892{
b0f1a59a
LZ
893 if (is_string_field(field) &&
894 (op != OP_EQ && op != OP_NE && op != OP_GLOB))
895 return 0;
896 if (!is_string_field(field) && op == OP_GLOB)
8b372562
TZ
897 return 0;
898
899 return 1;
900}
901
902static filter_pred_fn_t select_comparison_fn(int op, int field_size,
903 int field_is_signed)
904{
905 filter_pred_fn_t fn = NULL;
906
907 switch (field_size) {
908 case 8:
909 if (op == OP_EQ || op == OP_NE)
910 fn = filter_pred_64;
911 else if (field_is_signed)
912 fn = filter_pred_s64;
913 else
914 fn = filter_pred_u64;
915 break;
916 case 4:
917 if (op == OP_EQ || op == OP_NE)
918 fn = filter_pred_32;
919 else if (field_is_signed)
920 fn = filter_pred_s32;
921 else
922 fn = filter_pred_u32;
923 break;
924 case 2:
925 if (op == OP_EQ || op == OP_NE)
926 fn = filter_pred_16;
927 else if (field_is_signed)
928 fn = filter_pred_s16;
929 else
930 fn = filter_pred_u16;
931 break;
932 case 1:
933 if (op == OP_EQ || op == OP_NE)
934 fn = filter_pred_8;
935 else if (field_is_signed)
936 fn = filter_pred_s8;
937 else
938 fn = filter_pred_u8;
939 break;
940 }
941
942 return fn;
943}
944
9d96cd17 945static int init_pred(struct filter_parse_state *ps,
61aaef55 946 struct ftrace_event_field *field,
9d96cd17
JO
947 struct filter_pred *pred)
948
7ce7e424 949{
9d96cd17 950 filter_pred_fn_t fn = filter_pred_none;
f66578a7 951 unsigned long long val;
5e4904cb 952 int ret;
7ce7e424 953
7ce7e424
TZ
954 pred->offset = field->offset;
955
8b372562
TZ
956 if (!is_legal_op(field, pred->op)) {
957 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
958 return -EINVAL;
959 }
960
aa38e9fc 961 if (is_string_field(field)) {
b0f1a59a 962 filter_build_regex(pred);
87a342f5 963
1889d209 964 if (field->filter_type == FILTER_STATIC_STRING) {
e8808c10 965 fn = filter_pred_string;
1889d209
FW
966 pred->regex.field_len = field->size;
967 } else if (field->filter_type == FILTER_DYN_STRING)
b0f1a59a 968 fn = filter_pred_strloc;
16da27a8 969 else
87a342f5 970 fn = filter_pred_pchar;
5500fa51
JO
971 } else if (is_function_field(field)) {
972 if (strcmp(field->name, "ip")) {
973 parse_error(ps, FILT_ERR_IP_FIELD_ONLY, 0);
974 return -EINVAL;
975 }
976 } else {
5e4904cb 977 if (field->is_signed)
bcd83ea6 978 ret = kstrtoll(pred->regex.pattern, 0, &val);
5e4904cb 979 else
bcd83ea6 980 ret = kstrtoull(pred->regex.pattern, 0, &val);
5e4904cb 981 if (ret) {
8b372562 982 parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
9f58a159 983 return -EINVAL;
8b372562 984 }
f66578a7 985 pred->val = val;
7ce7e424 986
1f9963cb
LZ
987 fn = select_comparison_fn(pred->op, field->size,
988 field->is_signed);
989 if (!fn) {
990 parse_error(ps, FILT_ERR_INVALID_OP, 0);
991 return -EINVAL;
992 }
7ce7e424
TZ
993 }
994
8b372562
TZ
995 if (pred->op == OP_NE)
996 pred->not = 1;
ac1adc55 997
9d96cd17 998 pred->fn = fn;
1f9963cb 999 return 0;
cfb180f3
TZ
1000}
1001
8b372562
TZ
1002static void parse_init(struct filter_parse_state *ps,
1003 struct filter_op *ops,
1004 char *infix_string)
1005{
1006 memset(ps, '\0', sizeof(*ps));
1007
1008 ps->infix.string = infix_string;
1009 ps->infix.cnt = strlen(infix_string);
1010 ps->ops = ops;
1011
1012 INIT_LIST_HEAD(&ps->opstack);
1013 INIT_LIST_HEAD(&ps->postfix);
1014}
1015
1016static char infix_next(struct filter_parse_state *ps)
1017{
1018 ps->infix.cnt--;
1019
1020 return ps->infix.string[ps->infix.tail++];
1021}
1022
1023static char infix_peek(struct filter_parse_state *ps)
1024{
1025 if (ps->infix.tail == strlen(ps->infix.string))
1026 return 0;
1027
1028 return ps->infix.string[ps->infix.tail];
1029}
1030
1031static void infix_advance(struct filter_parse_state *ps)
1032{
1033 ps->infix.cnt--;
1034 ps->infix.tail++;
1035}
1036
1037static inline int is_precedence_lower(struct filter_parse_state *ps,
1038 int a, int b)
1039{
1040 return ps->ops[a].precedence < ps->ops[b].precedence;
1041}
1042
1043static inline int is_op_char(struct filter_parse_state *ps, char c)
1044{
1045 int i;
1046
1047 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1048 if (ps->ops[i].string[0] == c)
1049 return 1;
1050 }
c4cff064 1051
0a19e53c 1052 return 0;
cfb180f3
TZ
1053}
1054
8b372562
TZ
1055static int infix_get_op(struct filter_parse_state *ps, char firstc)
1056{
1057 char nextc = infix_peek(ps);
1058 char opstr[3];
1059 int i;
1060
1061 opstr[0] = firstc;
1062 opstr[1] = nextc;
1063 opstr[2] = '\0';
1064
1065 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1066 if (!strcmp(opstr, ps->ops[i].string)) {
1067 infix_advance(ps);
1068 return ps->ops[i].id;
7ce7e424 1069 }
8b372562
TZ
1070 }
1071
1072 opstr[1] = '\0';
1073
1074 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
1075 if (!strcmp(opstr, ps->ops[i].string))
1076 return ps->ops[i].id;
1077 }
1078
1079 return OP_NONE;
1080}
1081
1082static inline void clear_operand_string(struct filter_parse_state *ps)
1083{
1084 memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
1085 ps->operand.tail = 0;
1086}
1087
1088static inline int append_operand_char(struct filter_parse_state *ps, char c)
1089{
5872144f 1090 if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
8b372562
TZ
1091 return -EINVAL;
1092
1093 ps->operand.string[ps->operand.tail++] = c;
1094
1095 return 0;
1096}
1097
1098static int filter_opstack_push(struct filter_parse_state *ps, int op)
1099{
1100 struct opstack_op *opstack_op;
1101
1102 opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
1103 if (!opstack_op)
1104 return -ENOMEM;
1105
1106 opstack_op->op = op;
1107 list_add(&opstack_op->list, &ps->opstack);
1108
1109 return 0;
1110}
1111
1112static int filter_opstack_empty(struct filter_parse_state *ps)
1113{
1114 return list_empty(&ps->opstack);
1115}
1116
1117static int filter_opstack_top(struct filter_parse_state *ps)
1118{
1119 struct opstack_op *opstack_op;
1120
1121 if (filter_opstack_empty(ps))
1122 return OP_NONE;
1123
1124 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
1125
1126 return opstack_op->op;
1127}
1128
1129static int filter_opstack_pop(struct filter_parse_state *ps)
1130{
1131 struct opstack_op *opstack_op;
1132 int op;
1133
1134 if (filter_opstack_empty(ps))
1135 return OP_NONE;
1136
1137 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
1138 op = opstack_op->op;
1139 list_del(&opstack_op->list);
1140
1141 kfree(opstack_op);
1142
1143 return op;
1144}
1145
1146static void filter_opstack_clear(struct filter_parse_state *ps)
1147{
1148 while (!filter_opstack_empty(ps))
1149 filter_opstack_pop(ps);
1150}
1151
1152static char *curr_operand(struct filter_parse_state *ps)
1153{
1154 return ps->operand.string;
1155}
1156
1157static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
1158{
1159 struct postfix_elt *elt;
1160
1161 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1162 if (!elt)
1163 return -ENOMEM;
1164
1165 elt->op = OP_NONE;
1166 elt->operand = kstrdup(operand, GFP_KERNEL);
1167 if (!elt->operand) {
1168 kfree(elt);
1169 return -ENOMEM;
1170 }
1171
1172 list_add_tail(&elt->list, &ps->postfix);
1173
1174 return 0;
1175}
1176
1177static int postfix_append_op(struct filter_parse_state *ps, int op)
1178{
1179 struct postfix_elt *elt;
1180
1181 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1182 if (!elt)
1183 return -ENOMEM;
1184
1185 elt->op = op;
1186 elt->operand = NULL;
1187
1188 list_add_tail(&elt->list, &ps->postfix);
1189
1190 return 0;
1191}
1192
1193static void postfix_clear(struct filter_parse_state *ps)
1194{
1195 struct postfix_elt *elt;
1196
1197 while (!list_empty(&ps->postfix)) {
1198 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
8b372562 1199 list_del(&elt->list);
8ad80731
LZ
1200 kfree(elt->operand);
1201 kfree(elt);
8b372562
TZ
1202 }
1203}
1204
1205static int filter_parse(struct filter_parse_state *ps)
1206{
5928c3cc 1207 int in_string = 0;
8b372562
TZ
1208 int op, top_op;
1209 char ch;
1210
1211 while ((ch = infix_next(ps))) {
5928c3cc
FW
1212 if (ch == '"') {
1213 in_string ^= 1;
1214 continue;
1215 }
1216
1217 if (in_string)
1218 goto parse_operand;
1219
8b372562
TZ
1220 if (isspace(ch))
1221 continue;
1222
1223 if (is_op_char(ps, ch)) {
1224 op = infix_get_op(ps, ch);
1225 if (op == OP_NONE) {
1226 parse_error(ps, FILT_ERR_INVALID_OP, 0);
7ce7e424
TZ
1227 return -EINVAL;
1228 }
8b372562
TZ
1229
1230 if (strlen(curr_operand(ps))) {
1231 postfix_append_operand(ps, curr_operand(ps));
1232 clear_operand_string(ps);
1233 }
1234
1235 while (!filter_opstack_empty(ps)) {
1236 top_op = filter_opstack_top(ps);
1237 if (!is_precedence_lower(ps, top_op, op)) {
1238 top_op = filter_opstack_pop(ps);
1239 postfix_append_op(ps, top_op);
1240 continue;
1241 }
1242 break;
1243 }
1244
1245 filter_opstack_push(ps, op);
7ce7e424
TZ
1246 continue;
1247 }
8b372562
TZ
1248
1249 if (ch == '(') {
1250 filter_opstack_push(ps, OP_OPEN_PAREN);
1251 continue;
1252 }
1253
1254 if (ch == ')') {
1255 if (strlen(curr_operand(ps))) {
1256 postfix_append_operand(ps, curr_operand(ps));
1257 clear_operand_string(ps);
1258 }
1259
1260 top_op = filter_opstack_pop(ps);
1261 while (top_op != OP_NONE) {
1262 if (top_op == OP_OPEN_PAREN)
1263 break;
1264 postfix_append_op(ps, top_op);
1265 top_op = filter_opstack_pop(ps);
1266 }
1267 if (top_op == OP_NONE) {
1268 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1269 return -EINVAL;
7ce7e424 1270 }
7ce7e424
TZ
1271 continue;
1272 }
5928c3cc 1273parse_operand:
8b372562
TZ
1274 if (append_operand_char(ps, ch)) {
1275 parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1276 return -EINVAL;
1277 }
1278 }
1279
1280 if (strlen(curr_operand(ps)))
1281 postfix_append_operand(ps, curr_operand(ps));
1282
1283 while (!filter_opstack_empty(ps)) {
1284 top_op = filter_opstack_pop(ps);
1285 if (top_op == OP_NONE)
1286 break;
1287 if (top_op == OP_OPEN_PAREN) {
1288 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1289 return -EINVAL;
1290 }
1291 postfix_append_op(ps, top_op);
1292 }
1293
1294 return 0;
1295}
1296
81570d9c 1297static struct filter_pred *create_pred(struct filter_parse_state *ps,
9d96cd17 1298 struct ftrace_event_call *call,
81570d9c 1299 int op, char *operand1, char *operand2)
8b372562 1300{
61aaef55 1301 struct ftrace_event_field *field;
81570d9c 1302 static struct filter_pred pred;
8b372562 1303
81570d9c
JO
1304 memset(&pred, 0, sizeof(pred));
1305 pred.op = op;
8b372562 1306
81570d9c
JO
1307 if (op == OP_AND || op == OP_OR)
1308 return &pred;
1309
1310 if (!operand1 || !operand2) {
1311 parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
8b372562
TZ
1312 return NULL;
1313 }
1314
b3a8c6fd 1315 field = trace_find_event_field(call, operand1);
61aaef55
JO
1316 if (!field) {
1317 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
8b372562 1318 return NULL;
61aaef55 1319 }
8b372562 1320
81570d9c
JO
1321 strcpy(pred.regex.pattern, operand2);
1322 pred.regex.len = strlen(pred.regex.pattern);
1d0e78e3 1323 pred.field = field;
61aaef55 1324 return init_pred(ps, field, &pred) ? NULL : &pred;
8b372562
TZ
1325}
1326
1327static int check_preds(struct filter_parse_state *ps)
1328{
1329 int n_normal_preds = 0, n_logical_preds = 0;
1330 struct postfix_elt *elt;
1331
1332 list_for_each_entry(elt, &ps->postfix, list) {
1333 if (elt->op == OP_NONE)
1334 continue;
1335
1336 if (elt->op == OP_AND || elt->op == OP_OR) {
1337 n_logical_preds++;
1338 continue;
7ce7e424 1339 }
8b372562 1340 n_normal_preds++;
7ce7e424
TZ
1341 }
1342
8b372562
TZ
1343 if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
1344 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
bcabd91c
LZ
1345 return -EINVAL;
1346 }
1347
8b372562
TZ
1348 return 0;
1349}
f66578a7 1350
c9c53ca0
SR
1351static int count_preds(struct filter_parse_state *ps)
1352{
1353 struct postfix_elt *elt;
1354 int n_preds = 0;
1355
1356 list_for_each_entry(elt, &ps->postfix, list) {
1357 if (elt->op == OP_NONE)
1358 continue;
1359 n_preds++;
1360 }
1361
1362 return n_preds;
1363}
1364
f03f5979
JO
1365struct check_pred_data {
1366 int count;
1367 int max;
1368};
1369
1370static int check_pred_tree_cb(enum move_type move, struct filter_pred *pred,
1371 int *err, void *data)
1372{
1373 struct check_pred_data *d = data;
1374
1375 if (WARN_ON(d->count++ > d->max)) {
1376 *err = -EINVAL;
1377 return WALK_PRED_ABORT;
1378 }
1379 return WALK_PRED_DEFAULT;
1380}
1381
ec126cac
SR
1382/*
1383 * The tree is walked at filtering of an event. If the tree is not correctly
1384 * built, it may cause an infinite loop. Check here that the tree does
1385 * indeed terminate.
1386 */
1387static int check_pred_tree(struct event_filter *filter,
1388 struct filter_pred *root)
1389{
f03f5979
JO
1390 struct check_pred_data data = {
1391 /*
1392 * The max that we can hit a node is three times.
1393 * Once going down, once coming up from left, and
1394 * once coming up from right. This is more than enough
1395 * since leafs are only hit a single time.
1396 */
1397 .max = 3 * filter->n_preds,
1398 .count = 0,
1399 };
ec126cac 1400
f03f5979
JO
1401 return walk_pred_tree(filter->preds, root,
1402 check_pred_tree_cb, &data);
ec126cac
SR
1403}
1404
c00b060f
JO
1405static int count_leafs_cb(enum move_type move, struct filter_pred *pred,
1406 int *err, void *data)
43cd4145 1407{
c00b060f 1408 int *count = data;
43cd4145 1409
c00b060f
JO
1410 if ((move == MOVE_DOWN) &&
1411 (pred->left == FILTER_PRED_INVALID))
1412 (*count)++;
43cd4145 1413
c00b060f
JO
1414 return WALK_PRED_DEFAULT;
1415}
1416
1417static int count_leafs(struct filter_pred *preds, struct filter_pred *root)
1418{
1419 int count = 0, ret;
43cd4145 1420
c00b060f
JO
1421 ret = walk_pred_tree(preds, root, count_leafs_cb, &count);
1422 WARN_ON(ret);
43cd4145
SR
1423 return count;
1424}
1425
96bc293a
JO
1426struct fold_pred_data {
1427 struct filter_pred *root;
1428 int count;
1429 int children;
1430};
1431
1432static int fold_pred_cb(enum move_type move, struct filter_pred *pred,
1433 int *err, void *data)
1434{
1435 struct fold_pred_data *d = data;
1436 struct filter_pred *root = d->root;
1437
1438 if (move != MOVE_DOWN)
1439 return WALK_PRED_DEFAULT;
1440 if (pred->left != FILTER_PRED_INVALID)
1441 return WALK_PRED_DEFAULT;
1442
1443 if (WARN_ON(d->count == d->children)) {
1444 *err = -EINVAL;
1445 return WALK_PRED_ABORT;
1446 }
1447
1448 pred->index &= ~FILTER_PRED_FOLD;
1449 root->ops[d->count++] = pred->index;
1450 return WALK_PRED_DEFAULT;
1451}
1452
43cd4145
SR
1453static int fold_pred(struct filter_pred *preds, struct filter_pred *root)
1454{
96bc293a
JO
1455 struct fold_pred_data data = {
1456 .root = root,
1457 .count = 0,
1458 };
43cd4145 1459 int children;
43cd4145
SR
1460
1461 /* No need to keep the fold flag */
1462 root->index &= ~FILTER_PRED_FOLD;
1463
1464 /* If the root is a leaf then do nothing */
1465 if (root->left == FILTER_PRED_INVALID)
1466 return 0;
1467
1468 /* count the children */
1469 children = count_leafs(preds, &preds[root->left]);
1470 children += count_leafs(preds, &preds[root->right]);
1471
47b0edcb 1472 root->ops = kcalloc(children, sizeof(*root->ops), GFP_KERNEL);
43cd4145
SR
1473 if (!root->ops)
1474 return -ENOMEM;
1475
1476 root->val = children;
96bc293a
JO
1477 data.children = children;
1478 return walk_pred_tree(preds, root, fold_pred_cb, &data);
43cd4145
SR
1479}
1480
1b797fe5
JO
1481static int fold_pred_tree_cb(enum move_type move, struct filter_pred *pred,
1482 int *err, void *data)
1483{
1484 struct filter_pred *preds = data;
1485
1486 if (move != MOVE_DOWN)
1487 return WALK_PRED_DEFAULT;
1488 if (!(pred->index & FILTER_PRED_FOLD))
1489 return WALK_PRED_DEFAULT;
1490
1491 *err = fold_pred(preds, pred);
1492 if (*err)
1493 return WALK_PRED_ABORT;
1494
1495 /* eveyrhing below is folded, continue with parent */
1496 return WALK_PRED_PARENT;
1497}
1498
43cd4145
SR
1499/*
1500 * To optimize the processing of the ops, if we have several "ors" or
1501 * "ands" together, we can put them in an array and process them all
1502 * together speeding up the filter logic.
1503 */
1504static int fold_pred_tree(struct event_filter *filter,
1505 struct filter_pred *root)
1506{
1b797fe5
JO
1507 return walk_pred_tree(filter->preds, root, fold_pred_tree_cb,
1508 filter->preds);
43cd4145
SR
1509}
1510
fce29d15 1511static int replace_preds(struct ftrace_event_call *call,
6fb2915d 1512 struct event_filter *filter,
8b372562 1513 struct filter_parse_state *ps,
1f9963cb
LZ
1514 char *filter_string,
1515 bool dry_run)
8b372562
TZ
1516{
1517 char *operand1 = NULL, *operand2 = NULL;
1518 struct filter_pred *pred;
ec126cac 1519 struct filter_pred *root;
8b372562 1520 struct postfix_elt *elt;
61e9dea2 1521 struct pred_stack stack = { }; /* init to NULL */
8b372562 1522 int err;
1f9963cb 1523 int n_preds = 0;
8b372562 1524
c9c53ca0
SR
1525 n_preds = count_preds(ps);
1526 if (n_preds >= MAX_FILTER_PRED) {
1527 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1528 return -ENOSPC;
1529 }
1530
8b372562
TZ
1531 err = check_preds(ps);
1532 if (err)
1533 return err;
1534
c9c53ca0 1535 if (!dry_run) {
61e9dea2 1536 err = __alloc_pred_stack(&stack, n_preds);
c9c53ca0
SR
1537 if (err)
1538 return err;
61e9dea2
SR
1539 err = __alloc_preds(filter, n_preds);
1540 if (err)
1541 goto fail;
c9c53ca0
SR
1542 }
1543
1544 n_preds = 0;
8b372562
TZ
1545 list_for_each_entry(elt, &ps->postfix, list) {
1546 if (elt->op == OP_NONE) {
1547 if (!operand1)
1548 operand1 = elt->operand;
1549 else if (!operand2)
1550 operand2 = elt->operand;
1551 else {
1552 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
61e9dea2
SR
1553 err = -EINVAL;
1554 goto fail;
8b372562
TZ
1555 }
1556 continue;
1557 }
1558
c9c53ca0 1559 if (WARN_ON(n_preds++ == MAX_FILTER_PRED)) {
1f9963cb 1560 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
61e9dea2
SR
1561 err = -ENOSPC;
1562 goto fail;
1f9963cb
LZ
1563 }
1564
9d96cd17 1565 pred = create_pred(ps, call, elt->op, operand1, operand2);
61e9dea2 1566 if (!pred) {
61aaef55 1567 err = -EINVAL;
61e9dea2
SR
1568 goto fail;
1569 }
61aaef55 1570
9d96cd17
JO
1571 if (!dry_run) {
1572 err = filter_add_pred(ps, filter, pred, &stack);
61aaef55 1573 if (err)
9d96cd17 1574 goto fail;
9d96cd17 1575 }
8b372562
TZ
1576
1577 operand1 = operand2 = NULL;
1578 }
7ce7e424 1579
61e9dea2
SR
1580 if (!dry_run) {
1581 /* We should have one item left on the stack */
1582 pred = __pop_pred_stack(&stack);
1583 if (!pred)
1584 return -EINVAL;
1585 /* This item is where we start from in matching */
ec126cac 1586 root = pred;
61e9dea2
SR
1587 /* Make sure the stack is empty */
1588 pred = __pop_pred_stack(&stack);
1589 if (WARN_ON(pred)) {
1590 err = -EINVAL;
1591 filter->root = NULL;
1592 goto fail;
1593 }
ec126cac
SR
1594 err = check_pred_tree(filter, root);
1595 if (err)
1596 goto fail;
1597
43cd4145
SR
1598 /* Optimize the tree */
1599 err = fold_pred_tree(filter, root);
1600 if (err)
1601 goto fail;
1602
ec126cac
SR
1603 /* We don't set root until we know it works */
1604 barrier();
1605 filter->root = root;
61e9dea2
SR
1606 }
1607
1608 err = 0;
1609fail:
1610 __free_pred_stack(&stack);
1611 return err;
7ce7e424
TZ
1612}
1613
75b8e982
SR
1614struct filter_list {
1615 struct list_head list;
1616 struct event_filter *filter;
1617};
1618
fce29d15
LZ
1619static int replace_system_preds(struct event_subsystem *system,
1620 struct filter_parse_state *ps,
1621 char *filter_string)
1622{
1623 struct ftrace_event_call *call;
75b8e982
SR
1624 struct filter_list *filter_item;
1625 struct filter_list *tmp;
1626 LIST_HEAD(filter_list);
fce29d15 1627 bool fail = true;
a66abe7f 1628 int err;
fce29d15
LZ
1629
1630 list_for_each_entry(call, &ftrace_events, list) {
1631
8f082018 1632 if (strcmp(call->class->system, system->name) != 0)
fce29d15
LZ
1633 continue;
1634
75b8e982
SR
1635 /*
1636 * Try to see if the filter can be applied
1637 * (filter arg is ignored on dry_run)
1638 */
1639 err = replace_preds(call, NULL, ps, filter_string, true);
fce29d15 1640 if (err)
ed0449af
LZ
1641 call->flags |= TRACE_EVENT_FL_NO_SET_FILTER;
1642 else
1643 call->flags &= ~TRACE_EVENT_FL_NO_SET_FILTER;
0fc3ca9a
SR
1644 }
1645
0fc3ca9a 1646 list_for_each_entry(call, &ftrace_events, list) {
75b8e982 1647 struct event_filter *filter;
0fc3ca9a
SR
1648
1649 if (strcmp(call->class->system, system->name) != 0)
1650 continue;
1651
ed0449af
LZ
1652 if (call->flags & TRACE_EVENT_FL_NO_SET_FILTER)
1653 continue;
1654
75b8e982
SR
1655 filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
1656 if (!filter_item)
1657 goto fail_mem;
0fc3ca9a 1658
75b8e982 1659 list_add_tail(&filter_item->list, &filter_list);
0fc3ca9a 1660
75b8e982
SR
1661 filter_item->filter = __alloc_filter();
1662 if (!filter_item->filter)
1663 goto fail_mem;
1664 filter = filter_item->filter;
0fc3ca9a 1665
75b8e982
SR
1666 /* Can only fail on no memory */
1667 err = replace_filter_string(filter, filter_string);
1668 if (err)
1669 goto fail_mem;
fce29d15 1670
6fb2915d 1671 err = replace_preds(call, filter, ps, filter_string, false);
75b8e982
SR
1672 if (err) {
1673 filter_disable(call);
1674 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1675 append_filter_err(ps, filter);
1676 } else
553552ce 1677 call->flags |= TRACE_EVENT_FL_FILTERED;
75b8e982
SR
1678 /*
1679 * Regardless of if this returned an error, we still
1680 * replace the filter for the call.
1681 */
1682 filter = call->filter;
d3d9acf6 1683 rcu_assign_pointer(call->filter, filter_item->filter);
75b8e982
SR
1684 filter_item->filter = filter;
1685
fce29d15
LZ
1686 fail = false;
1687 }
1688
0fc3ca9a
SR
1689 if (fail)
1690 goto fail;
1691
75b8e982
SR
1692 /*
1693 * The calls can still be using the old filters.
1694 * Do a synchronize_sched() to ensure all calls are
1695 * done with them before we free them.
1696 */
1697 synchronize_sched();
1698 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1699 __free_filter(filter_item->filter);
1700 list_del(&filter_item->list);
1701 kfree(filter_item);
1702 }
fce29d15 1703 return 0;
0fc3ca9a 1704 fail:
75b8e982
SR
1705 /* No call succeeded */
1706 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1707 list_del(&filter_item->list);
1708 kfree(filter_item);
1709 }
0fc3ca9a
SR
1710 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1711 return -EINVAL;
75b8e982
SR
1712 fail_mem:
1713 /* If any call succeeded, we still need to sync */
1714 if (!fail)
1715 synchronize_sched();
1716 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1717 __free_filter(filter_item->filter);
1718 list_del(&filter_item->list);
1719 kfree(filter_item);
1720 }
1721 return -ENOMEM;
fce29d15
LZ
1722}
1723
38b78eb8
TH
1724static int create_filter_start(char *filter_str, bool set_str,
1725 struct filter_parse_state **psp,
1726 struct event_filter **filterp)
1727{
1728 struct event_filter *filter;
1729 struct filter_parse_state *ps = NULL;
1730 int err = 0;
1731
1732 WARN_ON_ONCE(*psp || *filterp);
1733
1734 /* allocate everything, and if any fails, free all and fail */
1735 filter = __alloc_filter();
1736 if (filter && set_str)
1737 err = replace_filter_string(filter, filter_str);
1738
1739 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1740
1741 if (!filter || !ps || err) {
1742 kfree(ps);
1743 __free_filter(filter);
1744 return -ENOMEM;
1745 }
1746
1747 /* we're committed to creating a new filter */
1748 *filterp = filter;
1749 *psp = ps;
1750
1751 parse_init(ps, filter_ops, filter_str);
1752 err = filter_parse(ps);
1753 if (err && set_str)
1754 append_filter_err(ps, filter);
1755 return err;
1756}
1757
1758static void create_filter_finish(struct filter_parse_state *ps)
1759{
1760 if (ps) {
1761 filter_opstack_clear(ps);
1762 postfix_clear(ps);
1763 kfree(ps);
1764 }
1765}
1766
1767/**
1768 * create_filter - create a filter for a ftrace_event_call
1769 * @call: ftrace_event_call to create a filter for
1770 * @filter_str: filter string
1771 * @set_str: remember @filter_str and enable detailed error in filter
1772 * @filterp: out param for created filter (always updated on return)
1773 *
1774 * Creates a filter for @call with @filter_str. If @set_str is %true,
1775 * @filter_str is copied and recorded in the new filter.
1776 *
1777 * On success, returns 0 and *@filterp points to the new filter. On
1778 * failure, returns -errno and *@filterp may point to %NULL or to a new
1779 * filter. In the latter case, the returned filter contains error
1780 * information if @set_str is %true and the caller is responsible for
1781 * freeing it.
1782 */
1783static int create_filter(struct ftrace_event_call *call,
1784 char *filter_str, bool set_str,
1785 struct event_filter **filterp)
1786{
1787 struct event_filter *filter = NULL;
1788 struct filter_parse_state *ps = NULL;
1789 int err;
1790
1791 err = create_filter_start(filter_str, set_str, &ps, &filter);
1792 if (!err) {
1793 err = replace_preds(call, filter, ps, filter_str, false);
1794 if (err && set_str)
1795 append_filter_err(ps, filter);
1796 }
1797 create_filter_finish(ps);
1798
1799 *filterp = filter;
1800 return err;
1801}
1802
1803/**
1804 * create_system_filter - create a filter for an event_subsystem
1805 * @system: event_subsystem to create a filter for
1806 * @filter_str: filter string
1807 * @filterp: out param for created filter (always updated on return)
1808 *
1809 * Identical to create_filter() except that it creates a subsystem filter
1810 * and always remembers @filter_str.
1811 */
1812static int create_system_filter(struct event_subsystem *system,
1813 char *filter_str, struct event_filter **filterp)
1814{
1815 struct event_filter *filter = NULL;
1816 struct filter_parse_state *ps = NULL;
1817 int err;
1818
1819 err = create_filter_start(filter_str, true, &ps, &filter);
1820 if (!err) {
1821 err = replace_system_preds(system, ps, filter_str);
1822 if (!err) {
1823 /* System filters just show a default message */
1824 kfree(filter->filter_string);
1825 filter->filter_string = NULL;
1826 } else {
1827 append_filter_err(ps, filter);
1828 }
1829 }
1830 create_filter_finish(ps);
1831
1832 *filterp = filter;
1833 return err;
1834}
1835
70c91fb9 1836/* caller must hold event_mutex */
8b372562
TZ
1837int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1838{
75b8e982 1839 struct event_filter *filter;
70c91fb9 1840 int err;
8b372562
TZ
1841
1842 if (!strcmp(strstrip(filter_string), "0")) {
75b8e982
SR
1843 filter_disable(call);
1844 filter = call->filter;
1845 if (!filter)
70c91fb9 1846 return 0;
d3d9acf6 1847 RCU_INIT_POINTER(call->filter, NULL);
f76690af
SR
1848 /* Make sure the filter is not being used */
1849 synchronize_sched();
75b8e982 1850 __free_filter(filter);
70c91fb9 1851 return 0;
8b372562
TZ
1852 }
1853
38b78eb8 1854 err = create_filter(call, filter_string, true, &filter);
8b372562 1855
75b8e982
SR
1856 /*
1857 * Always swap the call filter with the new filter
1858 * even if there was an error. If there was an error
1859 * in the filter, we disable the filter and show the error
1860 * string
1861 */
38b78eb8
TH
1862 if (filter) {
1863 struct event_filter *tmp = call->filter;
1864
1865 if (!err)
1866 call->flags |= TRACE_EVENT_FL_FILTERED;
1867 else
1868 filter_disable(call);
1869
1870 rcu_assign_pointer(call->filter, filter);
1871
1872 if (tmp) {
1873 /* Make sure the call is done with the filter */
1874 synchronize_sched();
1875 __free_filter(tmp);
1876 }
75b8e982 1877 }
8b372562
TZ
1878
1879 return err;
1880}
1881
ae63b31e 1882int apply_subsystem_event_filter(struct ftrace_subsystem_dir *dir,
8b372562
TZ
1883 char *filter_string)
1884{
ae63b31e 1885 struct event_subsystem *system = dir->subsystem;
75b8e982
SR
1886 struct event_filter *filter;
1887 int err = 0;
8b372562 1888
00e95830 1889 mutex_lock(&event_mutex);
8b372562 1890
e9dbfae5 1891 /* Make sure the system still has events */
ae63b31e 1892 if (!dir->nr_events) {
e9dbfae5
SR
1893 err = -ENODEV;
1894 goto out_unlock;
1895 }
1896
8b372562 1897 if (!strcmp(strstrip(filter_string), "0")) {
fce29d15 1898 filter_free_subsystem_preds(system);
8b372562 1899 remove_filter_string(system->filter);
75b8e982
SR
1900 filter = system->filter;
1901 system->filter = NULL;
1902 /* Ensure all filters are no longer used */
1903 synchronize_sched();
1904 filter_free_subsystem_filters(system);
1905 __free_filter(filter);
a66abe7f 1906 goto out_unlock;
8b372562
TZ
1907 }
1908
38b78eb8
TH
1909 err = create_system_filter(system, filter_string, &filter);
1910 if (filter) {
1911 /*
1912 * No event actually uses the system filter
1913 * we can free it without synchronize_sched().
1914 */
1915 __free_filter(system->filter);
1916 system->filter = filter;
1917 }
8cd995b6 1918out_unlock:
00e95830 1919 mutex_unlock(&event_mutex);
8b372562
TZ
1920
1921 return err;
1922}
7ce7e424 1923
07b139c8 1924#ifdef CONFIG_PERF_EVENTS
6fb2915d
LZ
1925
1926void ftrace_profile_free_filter(struct perf_event *event)
1927{
1928 struct event_filter *filter = event->filter;
1929
1930 event->filter = NULL;
c9c53ca0 1931 __free_filter(filter);
6fb2915d
LZ
1932}
1933
5500fa51
JO
1934struct function_filter_data {
1935 struct ftrace_ops *ops;
1936 int first_filter;
1937 int first_notrace;
1938};
1939
1940#ifdef CONFIG_FUNCTION_TRACER
1941static char **
1942ftrace_function_filter_re(char *buf, int len, int *count)
1943{
1944 char *str, *sep, **re;
1945
1946 str = kstrndup(buf, len, GFP_KERNEL);
1947 if (!str)
1948 return NULL;
1949
1950 /*
1951 * The argv_split function takes white space
1952 * as a separator, so convert ',' into spaces.
1953 */
1954 while ((sep = strchr(str, ',')))
1955 *sep = ' ';
1956
1957 re = argv_split(GFP_KERNEL, str, count);
1958 kfree(str);
1959 return re;
1960}
1961
1962static int ftrace_function_set_regexp(struct ftrace_ops *ops, int filter,
1963 int reset, char *re, int len)
1964{
1965 int ret;
1966
1967 if (filter)
1968 ret = ftrace_set_filter(ops, re, len, reset);
1969 else
1970 ret = ftrace_set_notrace(ops, re, len, reset);
1971
1972 return ret;
1973}
1974
1975static int __ftrace_function_set_filter(int filter, char *buf, int len,
1976 struct function_filter_data *data)
1977{
92d8d4a8 1978 int i, re_cnt, ret = -EINVAL;
5500fa51
JO
1979 int *reset;
1980 char **re;
1981
1982 reset = filter ? &data->first_filter : &data->first_notrace;
1983
1984 /*
1985 * The 'ip' field could have multiple filters set, separated
1986 * either by space or comma. We first cut the filter and apply
1987 * all pieces separatelly.
1988 */
1989 re = ftrace_function_filter_re(buf, len, &re_cnt);
1990 if (!re)
1991 return -EINVAL;
1992
1993 for (i = 0; i < re_cnt; i++) {
1994 ret = ftrace_function_set_regexp(data->ops, filter, *reset,
1995 re[i], strlen(re[i]));
1996 if (ret)
1997 break;
1998
1999 if (*reset)
2000 *reset = 0;
2001 }
2002
2003 argv_free(re);
2004 return ret;
2005}
2006
2007static int ftrace_function_check_pred(struct filter_pred *pred, int leaf)
2008{
2009 struct ftrace_event_field *field = pred->field;
2010
2011 if (leaf) {
2012 /*
2013 * Check the leaf predicate for function trace, verify:
2014 * - only '==' and '!=' is used
2015 * - the 'ip' field is used
2016 */
2017 if ((pred->op != OP_EQ) && (pred->op != OP_NE))
2018 return -EINVAL;
2019
2020 if (strcmp(field->name, "ip"))
2021 return -EINVAL;
2022 } else {
2023 /*
2024 * Check the non leaf predicate for function trace, verify:
2025 * - only '||' is used
2026 */
2027 if (pred->op != OP_OR)
2028 return -EINVAL;
2029 }
2030
2031 return 0;
2032}
2033
2034static int ftrace_function_set_filter_cb(enum move_type move,
2035 struct filter_pred *pred,
2036 int *err, void *data)
2037{
2038 /* Checking the node is valid for function trace. */
2039 if ((move != MOVE_DOWN) ||
2040 (pred->left != FILTER_PRED_INVALID)) {
2041 *err = ftrace_function_check_pred(pred, 0);
2042 } else {
2043 *err = ftrace_function_check_pred(pred, 1);
2044 if (*err)
2045 return WALK_PRED_ABORT;
2046
2047 *err = __ftrace_function_set_filter(pred->op == OP_EQ,
2048 pred->regex.pattern,
2049 pred->regex.len,
2050 data);
2051 }
2052
2053 return (*err) ? WALK_PRED_ABORT : WALK_PRED_DEFAULT;
2054}
2055
2056static int ftrace_function_set_filter(struct perf_event *event,
2057 struct event_filter *filter)
2058{
2059 struct function_filter_data data = {
2060 .first_filter = 1,
2061 .first_notrace = 1,
2062 .ops = &event->ftrace_ops,
2063 };
2064
2065 return walk_pred_tree(filter->preds, filter->root,
2066 ftrace_function_set_filter_cb, &data);
2067}
2068#else
2069static int ftrace_function_set_filter(struct perf_event *event,
2070 struct event_filter *filter)
2071{
2072 return -ENODEV;
2073}
2074#endif /* CONFIG_FUNCTION_TRACER */
2075
6fb2915d
LZ
2076int ftrace_profile_set_filter(struct perf_event *event, int event_id,
2077 char *filter_str)
2078{
2079 int err;
2080 struct event_filter *filter;
3f78f935 2081 struct ftrace_event_call *call;
6fb2915d
LZ
2082
2083 mutex_lock(&event_mutex);
2084
3f78f935 2085 call = event->tp_event;
a66abe7f
IM
2086
2087 err = -EINVAL;
3f78f935 2088 if (!call)
a66abe7f 2089 goto out_unlock;
6fb2915d 2090
a66abe7f 2091 err = -EEXIST;
6fb2915d 2092 if (event->filter)
a66abe7f 2093 goto out_unlock;
6fb2915d 2094
38b78eb8 2095 err = create_filter(call, filter_str, false, &filter);
5500fa51
JO
2096 if (err)
2097 goto free_filter;
2098
2099 if (ftrace_event_is_function(call))
2100 err = ftrace_function_set_filter(event, filter);
38b78eb8 2101 else
5500fa51
JO
2102 event->filter = filter;
2103
2104free_filter:
2105 if (err || ftrace_event_is_function(call))
c9c53ca0 2106 __free_filter(filter);
6fb2915d 2107
a66abe7f 2108out_unlock:
6fb2915d
LZ
2109 mutex_unlock(&event_mutex);
2110
2111 return err;
2112}
2113
07b139c8 2114#endif /* CONFIG_PERF_EVENTS */
6fb2915d 2115
1d0e78e3
JO
2116#ifdef CONFIG_FTRACE_STARTUP_TEST
2117
2118#include <linux/types.h>
2119#include <linux/tracepoint.h>
2120
2121#define CREATE_TRACE_POINTS
2122#include "trace_events_filter_test.h"
2123
1d0e78e3
JO
2124#define DATA_REC(m, va, vb, vc, vd, ve, vf, vg, vh, nvisit) \
2125{ \
2126 .filter = FILTER, \
2127 .rec = { .a = va, .b = vb, .c = vc, .d = vd, \
2128 .e = ve, .f = vf, .g = vg, .h = vh }, \
2129 .match = m, \
2130 .not_visited = nvisit, \
2131}
2132#define YES 1
2133#define NO 0
2134
2135static struct test_filter_data_t {
2136 char *filter;
2137 struct ftrace_raw_ftrace_test_filter rec;
2138 int match;
2139 char *not_visited;
2140} test_filter_data[] = {
2141#define FILTER "a == 1 && b == 1 && c == 1 && d == 1 && " \
2142 "e == 1 && f == 1 && g == 1 && h == 1"
2143 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, ""),
2144 DATA_REC(NO, 0, 1, 1, 1, 1, 1, 1, 1, "bcdefgh"),
2145 DATA_REC(NO, 1, 1, 1, 1, 1, 1, 1, 0, ""),
2146#undef FILTER
2147#define FILTER "a == 1 || b == 1 || c == 1 || d == 1 || " \
2148 "e == 1 || f == 1 || g == 1 || h == 1"
2149 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 0, ""),
2150 DATA_REC(YES, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2151 DATA_REC(YES, 1, 0, 0, 0, 0, 0, 0, 0, "bcdefgh"),
2152#undef FILTER
2153#define FILTER "(a == 1 || b == 1) && (c == 1 || d == 1) && " \
2154 "(e == 1 || f == 1) && (g == 1 || h == 1)"
2155 DATA_REC(NO, 0, 0, 1, 1, 1, 1, 1, 1, "dfh"),
2156 DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2157 DATA_REC(YES, 1, 0, 1, 0, 0, 1, 0, 1, "bd"),
2158 DATA_REC(NO, 1, 0, 1, 0, 0, 1, 0, 0, "bd"),
2159#undef FILTER
2160#define FILTER "(a == 1 && b == 1) || (c == 1 && d == 1) || " \
2161 "(e == 1 && f == 1) || (g == 1 && h == 1)"
2162 DATA_REC(YES, 1, 0, 1, 1, 1, 1, 1, 1, "efgh"),
2163 DATA_REC(YES, 0, 0, 0, 0, 0, 0, 1, 1, ""),
2164 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2165#undef FILTER
2166#define FILTER "(a == 1 && b == 1) && (c == 1 && d == 1) && " \
2167 "(e == 1 && f == 1) || (g == 1 && h == 1)"
2168 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 0, "gh"),
2169 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2170 DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, ""),
2171#undef FILTER
2172#define FILTER "((a == 1 || b == 1) || (c == 1 || d == 1) || " \
2173 "(e == 1 || f == 1)) && (g == 1 || h == 1)"
2174 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 1, "bcdef"),
2175 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 0, ""),
2176 DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, "h"),
2177#undef FILTER
2178#define FILTER "((((((((a == 1) && (b == 1)) || (c == 1)) && (d == 1)) || " \
2179 "(e == 1)) && (f == 1)) || (g == 1)) && (h == 1))"
2180 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "ceg"),
2181 DATA_REC(NO, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2182 DATA_REC(NO, 1, 0, 1, 0, 1, 0, 1, 0, ""),
2183#undef FILTER
2184#define FILTER "((((((((a == 1) || (b == 1)) && (c == 1)) || (d == 1)) && " \
2185 "(e == 1)) || (f == 1)) && (g == 1)) || (h == 1))"
2186 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "bdfh"),
2187 DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2188 DATA_REC(YES, 1, 0, 1, 0, 1, 0, 1, 0, "bdfh"),
2189};
2190
2191#undef DATA_REC
2192#undef FILTER
2193#undef YES
2194#undef NO
2195
2196#define DATA_CNT (sizeof(test_filter_data)/sizeof(struct test_filter_data_t))
2197
2198static int test_pred_visited;
2199
2200static int test_pred_visited_fn(struct filter_pred *pred, void *event)
2201{
2202 struct ftrace_event_field *field = pred->field;
2203
2204 test_pred_visited = 1;
2205 printk(KERN_INFO "\npred visited %s\n", field->name);
2206 return 1;
2207}
2208
2209static int test_walk_pred_cb(enum move_type move, struct filter_pred *pred,
2210 int *err, void *data)
2211{
2212 char *fields = data;
2213
2214 if ((move == MOVE_DOWN) &&
2215 (pred->left == FILTER_PRED_INVALID)) {
2216 struct ftrace_event_field *field = pred->field;
2217
2218 if (!field) {
2219 WARN(1, "all leafs should have field defined");
2220 return WALK_PRED_DEFAULT;
2221 }
2222 if (!strchr(fields, *field->name))
2223 return WALK_PRED_DEFAULT;
2224
2225 WARN_ON(!pred->fn);
2226 pred->fn = test_pred_visited_fn;
2227 }
2228 return WALK_PRED_DEFAULT;
2229}
2230
2231static __init int ftrace_test_event_filter(void)
2232{
2233 int i;
2234
2235 printk(KERN_INFO "Testing ftrace filter: ");
2236
2237 for (i = 0; i < DATA_CNT; i++) {
2238 struct event_filter *filter = NULL;
2239 struct test_filter_data_t *d = &test_filter_data[i];
2240 int err;
2241
38b78eb8
TH
2242 err = create_filter(&event_ftrace_test_filter, d->filter,
2243 false, &filter);
1d0e78e3
JO
2244 if (err) {
2245 printk(KERN_INFO
2246 "Failed to get filter for '%s', err %d\n",
2247 d->filter, err);
38b78eb8 2248 __free_filter(filter);
1d0e78e3
JO
2249 break;
2250 }
2251
86b6ef21
SR
2252 /*
2253 * The preemption disabling is not really needed for self
2254 * tests, but the rcu dereference will complain without it.
2255 */
2256 preempt_disable();
1d0e78e3
JO
2257 if (*d->not_visited)
2258 walk_pred_tree(filter->preds, filter->root,
2259 test_walk_pred_cb,
2260 d->not_visited);
2261
2262 test_pred_visited = 0;
2263 err = filter_match_preds(filter, &d->rec);
86b6ef21 2264 preempt_enable();
1d0e78e3
JO
2265
2266 __free_filter(filter);
2267
2268 if (test_pred_visited) {
2269 printk(KERN_INFO
2270 "Failed, unwanted pred visited for filter %s\n",
2271 d->filter);
2272 break;
2273 }
2274
2275 if (err != d->match) {
2276 printk(KERN_INFO
2277 "Failed to match filter '%s', expected %d\n",
2278 d->filter, d->match);
2279 break;
2280 }
2281 }
2282
2283 if (i == DATA_CNT)
2284 printk(KERN_CONT "OK\n");
2285
2286 return 0;
2287}
2288
2289late_initcall(ftrace_test_event_filter);
2290
2291#endif /* CONFIG_FTRACE_STARTUP_TEST */