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