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