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