1
2
3
4
5
6
7
8#include <linux/uaccess.h>
9#include <linux/module.h>
10#include <linux/ctype.h>
11#include <linux/mutex.h>
12#include <linux/perf_event.h>
13#include <linux/slab.h>
14
15#include "trace.h"
16#include "trace_output.h"
17
18#define DEFAULT_SYS_FILTER_MESSAGE \
19 "### global filter ###\n" \
20 "# Use this to set filters for multiple events.\n" \
21 "# Only events with the given fields will be affected.\n" \
22 "# If no events are modified, an error message will be displayed here"
23
24
25#define OPS \
26 C( OP_GLOB, "~" ), \
27 C( OP_NE, "!=" ), \
28 C( OP_EQ, "==" ), \
29 C( OP_LE, "<=" ), \
30 C( OP_LT, "<" ), \
31 C( OP_GE, ">=" ), \
32 C( OP_GT, ">" ), \
33 C( OP_BAND, "&" ), \
34 C( OP_MAX, NULL )
35
36#undef C
37#define C(a, b) a
38
39enum filter_op_ids { OPS };
40
41#undef C
42#define C(a, b) b
43
44static const char * ops[] = { OPS };
45
46
47
48
49
50#define PRED_FUNC_START OP_LE
51#define PRED_FUNC_MAX (OP_BAND - PRED_FUNC_START)
52
53#define ERRORS \
54 C(NONE, "No error"), \
55 C(INVALID_OP, "Invalid operator"), \
56 C(TOO_MANY_OPEN, "Too many '('"), \
57 C(TOO_MANY_CLOSE, "Too few '('"), \
58 C(MISSING_QUOTE, "Missing matching quote"), \
59 C(OPERAND_TOO_LONG, "Operand too long"), \
60 C(EXPECT_STRING, "Expecting string field"), \
61 C(EXPECT_DIGIT, "Expecting numeric field"), \
62 C(ILLEGAL_FIELD_OP, "Illegal operation for field type"), \
63 C(FIELD_NOT_FOUND, "Field not found"), \
64 C(ILLEGAL_INTVAL, "Illegal integer value"), \
65 C(BAD_SUBSYS_FILTER, "Couldn't find or set field in one of a subsystem's events"), \
66 C(TOO_MANY_PREDS, "Too many terms in predicate expression"), \
67 C(INVALID_FILTER, "Meaningless filter expression"), \
68 C(IP_FIELD_ONLY, "Only 'ip' field is supported for function trace"), \
69 C(INVALID_VALUE, "Invalid value (did you forget quotes)?"), \
70 C(ERRNO, "Error"), \
71 C(NO_FILTER, "No filter found")
72
73#undef C
74#define C(a, b) FILT_ERR_##a
75
76enum { ERRORS };
77
78#undef C
79#define C(a, b) b
80
81static const char *err_text[] = { ERRORS };
82
83
84static bool is_not(const char *str)
85{
86 switch (str[1]) {
87 case '=':
88 case '~':
89 return false;
90 }
91 return true;
92}
93
94
95
96
97
98
99
100struct prog_entry {
101 int target;
102 int when_to_branch;
103 struct filter_pred *pred;
104};
105
106
107
108
109
110
111
112
113
114
115
116
117
118static void update_preds(struct prog_entry *prog, int N, int invert)
119{
120 int t, s;
121
122 t = prog[N].target;
123 s = prog[t].target;
124 prog[t].when_to_branch = invert;
125 prog[t].target = N;
126 prog[N].target = s;
127}
128
129struct filter_parse_error {
130 int lasterr;
131 int lasterr_pos;
132};
133
134static void parse_error(struct filter_parse_error *pe, int err, int pos)
135{
136 pe->lasterr = err;
137 pe->lasterr_pos = pos;
138}
139
140typedef int (*parse_pred_fn)(const char *str, void *data, int pos,
141 struct filter_parse_error *pe,
142 struct filter_pred **pred);
143
144enum {
145 INVERT = 1,
146 PROCESS_AND = 2,
147 PROCESS_OR = 4,
148};
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410static struct prog_entry *
411predicate_parse(const char *str, int nr_parens, int nr_preds,
412 parse_pred_fn parse_pred, void *data,
413 struct filter_parse_error *pe)
414{
415 struct prog_entry *prog_stack;
416 struct prog_entry *prog;
417 const char *ptr = str;
418 char *inverts = NULL;
419 int *op_stack;
420 int *top;
421 int invert = 0;
422 int ret = -ENOMEM;
423 int len;
424 int N = 0;
425 int i;
426
427 nr_preds += 2;
428
429 op_stack = kmalloc_array(nr_parens, sizeof(*op_stack), GFP_KERNEL);
430 if (!op_stack)
431 return ERR_PTR(-ENOMEM);
432 prog_stack = kcalloc(nr_preds, sizeof(*prog_stack), GFP_KERNEL);
433 if (!prog_stack) {
434 parse_error(pe, -ENOMEM, 0);
435 goto out_free;
436 }
437 inverts = kmalloc_array(nr_preds, sizeof(*inverts), GFP_KERNEL);
438 if (!inverts) {
439 parse_error(pe, -ENOMEM, 0);
440 goto out_free;
441 }
442
443 top = op_stack;
444 prog = prog_stack;
445 *top = 0;
446
447
448 while (*ptr) {
449 const char *next = ptr++;
450
451 if (isspace(*next))
452 continue;
453
454 switch (*next) {
455 case '(':
456 if (top - op_stack > nr_parens) {
457 ret = -EINVAL;
458 goto out_free;
459 }
460 *(++top) = invert;
461 continue;
462 case '!':
463 if (!is_not(next))
464 break;
465 invert = !invert;
466 continue;
467 }
468
469 if (N >= nr_preds) {
470 parse_error(pe, FILT_ERR_TOO_MANY_PREDS, next - str);
471 goto out_free;
472 }
473
474 inverts[N] = invert;
475 prog[N].target = N-1;
476
477 len = parse_pred(next, data, ptr - str, pe, &prog[N].pred);
478 if (len < 0) {
479 ret = len;
480 goto out_free;
481 }
482 ptr = next + len;
483
484 N++;
485
486 ret = -1;
487 while (1) {
488 next = ptr++;
489 if (isspace(*next))
490 continue;
491
492 switch (*next) {
493 case ')':
494 case '\0':
495 break;
496 case '&':
497 case '|':
498
499 if (next[1] == next[0]) {
500 ptr++;
501 break;
502 }
503 fallthrough;
504 default:
505 parse_error(pe, FILT_ERR_TOO_MANY_PREDS,
506 next - str);
507 goto out_free;
508 }
509
510 invert = *top & INVERT;
511
512 if (*top & PROCESS_AND) {
513 update_preds(prog, N - 1, invert);
514 *top &= ~PROCESS_AND;
515 }
516 if (*next == '&') {
517 *top |= PROCESS_AND;
518 break;
519 }
520 if (*top & PROCESS_OR) {
521 update_preds(prog, N - 1, !invert);
522 *top &= ~PROCESS_OR;
523 }
524 if (*next == '|') {
525 *top |= PROCESS_OR;
526 break;
527 }
528 if (!*next)
529 goto out;
530
531 if (top == op_stack) {
532 ret = -1;
533
534 parse_error(pe, FILT_ERR_TOO_MANY_CLOSE, ptr - str);
535 goto out_free;
536 }
537 top--;
538 }
539 }
540 out:
541 if (top != op_stack) {
542
543 parse_error(pe, FILT_ERR_TOO_MANY_OPEN, ptr - str);
544 goto out_free;
545 }
546
547 if (!N) {
548
549 ret = -EINVAL;
550 parse_error(pe, FILT_ERR_NO_FILTER, ptr - str);
551 goto out_free;
552 }
553
554 prog[N].pred = NULL;
555 prog[N].target = 1;
556 prog[N+1].pred = NULL;
557 prog[N+1].target = 0;
558 prog[N-1].target = N;
559 prog[N-1].when_to_branch = false;
560
561
562 for (i = N-1 ; i--; ) {
563 int target = prog[i].target;
564 if (prog[i].when_to_branch == prog[target].when_to_branch)
565 prog[i].target = prog[target].target;
566 }
567
568
569 for (i = 0; i < N; i++) {
570 invert = inverts[i] ^ prog[i].when_to_branch;
571 prog[i].when_to_branch = invert;
572
573 if (WARN_ON(prog[i].target <= i)) {
574 ret = -EINVAL;
575 goto out_free;
576 }
577 }
578
579 kfree(op_stack);
580 kfree(inverts);
581 return prog;
582out_free:
583 kfree(op_stack);
584 kfree(inverts);
585 if (prog_stack) {
586 for (i = 0; prog_stack[i].pred; i++)
587 kfree(prog_stack[i].pred);
588 kfree(prog_stack);
589 }
590 return ERR_PTR(ret);
591}
592
593#define DEFINE_COMPARISON_PRED(type) \
594static int filter_pred_LT_##type(struct filter_pred *pred, void *event) \
595{ \
596 type *addr = (type *)(event + pred->offset); \
597 type val = (type)pred->val; \
598 return *addr < val; \
599} \
600static int filter_pred_LE_##type(struct filter_pred *pred, void *event) \
601{ \
602 type *addr = (type *)(event + pred->offset); \
603 type val = (type)pred->val; \
604 return *addr <= val; \
605} \
606static int filter_pred_GT_##type(struct filter_pred *pred, void *event) \
607{ \
608 type *addr = (type *)(event + pred->offset); \
609 type val = (type)pred->val; \
610 return *addr > val; \
611} \
612static int filter_pred_GE_##type(struct filter_pred *pred, void *event) \
613{ \
614 type *addr = (type *)(event + pred->offset); \
615 type val = (type)pred->val; \
616 return *addr >= val; \
617} \
618static int filter_pred_BAND_##type(struct filter_pred *pred, void *event) \
619{ \
620 type *addr = (type *)(event + pred->offset); \
621 type val = (type)pred->val; \
622 return !!(*addr & val); \
623} \
624static const filter_pred_fn_t pred_funcs_##type[] = { \
625 filter_pred_LE_##type, \
626 filter_pred_LT_##type, \
627 filter_pred_GE_##type, \
628 filter_pred_GT_##type, \
629 filter_pred_BAND_##type, \
630};
631
632#define DEFINE_EQUALITY_PRED(size) \
633static int filter_pred_##size(struct filter_pred *pred, void *event) \
634{ \
635 u##size *addr = (u##size *)(event + pred->offset); \
636 u##size val = (u##size)pred->val; \
637 int match; \
638 \
639 match = (val == *addr) ^ pred->not; \
640 \
641 return match; \
642}
643
644DEFINE_COMPARISON_PRED(s64);
645DEFINE_COMPARISON_PRED(u64);
646DEFINE_COMPARISON_PRED(s32);
647DEFINE_COMPARISON_PRED(u32);
648DEFINE_COMPARISON_PRED(s16);
649DEFINE_COMPARISON_PRED(u16);
650DEFINE_COMPARISON_PRED(s8);
651DEFINE_COMPARISON_PRED(u8);
652
653DEFINE_EQUALITY_PRED(64);
654DEFINE_EQUALITY_PRED(32);
655DEFINE_EQUALITY_PRED(16);
656DEFINE_EQUALITY_PRED(8);
657
658
659#define USTRING_BUF_SIZE 1024
660
661struct ustring_buffer {
662 char buffer[USTRING_BUF_SIZE];
663};
664
665static __percpu struct ustring_buffer *ustring_per_cpu;
666
667static __always_inline char *test_string(char *str)
668{
669 struct ustring_buffer *ubuf;
670 char *kstr;
671
672 if (!ustring_per_cpu)
673 return NULL;
674
675 ubuf = this_cpu_ptr(ustring_per_cpu);
676 kstr = ubuf->buffer;
677
678
679 if (!strncpy_from_kernel_nofault(kstr, str, USTRING_BUF_SIZE))
680 return NULL;
681 return kstr;
682}
683
684static __always_inline char *test_ustring(char *str)
685{
686 struct ustring_buffer *ubuf;
687 char __user *ustr;
688 char *kstr;
689
690 if (!ustring_per_cpu)
691 return NULL;
692
693 ubuf = this_cpu_ptr(ustring_per_cpu);
694 kstr = ubuf->buffer;
695
696
697 ustr = (char __user *)str;
698 if (!strncpy_from_user_nofault(kstr, ustr, USTRING_BUF_SIZE))
699 return NULL;
700
701 return kstr;
702}
703
704
705static int filter_pred_string(struct filter_pred *pred, void *event)
706{
707 char *addr = (char *)(event + pred->offset);
708 int cmp, match;
709
710 cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
711
712 match = cmp ^ pred->not;
713
714 return match;
715}
716
717static __always_inline int filter_pchar(struct filter_pred *pred, char *str)
718{
719 int cmp, match;
720 int len;
721
722 len = strlen(str) + 1;
723 cmp = pred->regex.match(str, &pred->regex, len);
724
725 match = cmp ^ pred->not;
726
727 return match;
728}
729
730static int filter_pred_pchar(struct filter_pred *pred, void *event)
731{
732 char **addr = (char **)(event + pred->offset);
733 char *str;
734
735 str = test_string(*addr);
736 if (!str)
737 return 0;
738
739 return filter_pchar(pred, str);
740}
741
742
743static int filter_pred_pchar_user(struct filter_pred *pred, void *event)
744{
745 char **addr = (char **)(event + pred->offset);
746 char *str;
747
748 str = test_ustring(*addr);
749 if (!str)
750 return 0;
751
752 return filter_pchar(pred, str);
753}
754
755
756
757
758
759
760
761
762
763
764
765static int filter_pred_strloc(struct filter_pred *pred, void *event)
766{
767 u32 str_item = *(u32 *)(event + pred->offset);
768 int str_loc = str_item & 0xffff;
769 int str_len = str_item >> 16;
770 char *addr = (char *)(event + str_loc);
771 int cmp, match;
772
773 cmp = pred->regex.match(addr, &pred->regex, str_len);
774
775 match = cmp ^ pred->not;
776
777 return match;
778}
779
780
781
782
783
784
785
786
787static int filter_pred_strrelloc(struct filter_pred *pred, void *event)
788{
789 u32 *item = (u32 *)(event + pred->offset);
790 u32 str_item = *item;
791 int str_loc = str_item & 0xffff;
792 int str_len = str_item >> 16;
793 char *addr = (char *)(&item[1]) + str_loc;
794 int cmp, match;
795
796 cmp = pred->regex.match(addr, &pred->regex, str_len);
797
798 match = cmp ^ pred->not;
799
800 return match;
801}
802
803
804static int filter_pred_cpu(struct filter_pred *pred, void *event)
805{
806 int cpu, cmp;
807
808 cpu = raw_smp_processor_id();
809 cmp = pred->val;
810
811 switch (pred->op) {
812 case OP_EQ:
813 return cpu == cmp;
814 case OP_NE:
815 return cpu != cmp;
816 case OP_LT:
817 return cpu < cmp;
818 case OP_LE:
819 return cpu <= cmp;
820 case OP_GT:
821 return cpu > cmp;
822 case OP_GE:
823 return cpu >= cmp;
824 default:
825 return 0;
826 }
827}
828
829
830static int filter_pred_comm(struct filter_pred *pred, void *event)
831{
832 int cmp;
833
834 cmp = pred->regex.match(current->comm, &pred->regex,
835 TASK_COMM_LEN);
836 return cmp ^ pred->not;
837}
838
839static int filter_pred_none(struct filter_pred *pred, void *event)
840{
841 return 0;
842}
843
844
845
846
847
848
849
850
851
852
853
854
855
856static int regex_match_full(char *str, struct regex *r, int len)
857{
858
859 if (!len)
860 return strcmp(str, r->pattern) == 0;
861
862 return strncmp(str, r->pattern, len) == 0;
863}
864
865static int regex_match_front(char *str, struct regex *r, int len)
866{
867 if (len && len < r->len)
868 return 0;
869
870 return strncmp(str, r->pattern, r->len) == 0;
871}
872
873static int regex_match_middle(char *str, struct regex *r, int len)
874{
875 if (!len)
876 return strstr(str, r->pattern) != NULL;
877
878 return strnstr(str, r->pattern, len) != NULL;
879}
880
881static int regex_match_end(char *str, struct regex *r, int len)
882{
883 int strlen = len - 1;
884
885 if (strlen >= r->len &&
886 memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
887 return 1;
888 return 0;
889}
890
891static int regex_match_glob(char *str, struct regex *r, int len __maybe_unused)
892{
893 if (glob_match(r->pattern, str))
894 return 1;
895 return 0;
896}
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
916{
917 int type = MATCH_FULL;
918 int i;
919
920 if (buff[0] == '!') {
921 *not = 1;
922 buff++;
923 len--;
924 } else
925 *not = 0;
926
927 *search = buff;
928
929 if (isdigit(buff[0]))
930 return MATCH_INDEX;
931
932 for (i = 0; i < len; i++) {
933 if (buff[i] == '*') {
934 if (!i) {
935 type = MATCH_END_ONLY;
936 } else if (i == len - 1) {
937 if (type == MATCH_END_ONLY)
938 type = MATCH_MIDDLE_ONLY;
939 else
940 type = MATCH_FRONT_ONLY;
941 buff[i] = 0;
942 break;
943 } else {
944 return MATCH_GLOB;
945 }
946 } else if (strchr("[?\\", buff[i])) {
947 return MATCH_GLOB;
948 }
949 }
950 if (buff[0] == '*')
951 *search = buff + 1;
952
953 return type;
954}
955
956static void filter_build_regex(struct filter_pred *pred)
957{
958 struct regex *r = &pred->regex;
959 char *search;
960 enum regex_type type = MATCH_FULL;
961
962 if (pred->op == OP_GLOB) {
963 type = filter_parse_regex(r->pattern, r->len, &search, &pred->not);
964 r->len = strlen(search);
965 memmove(r->pattern, search, r->len+1);
966 }
967
968 switch (type) {
969
970 case MATCH_INDEX:
971 case MATCH_FULL:
972 r->match = regex_match_full;
973 break;
974 case MATCH_FRONT_ONLY:
975 r->match = regex_match_front;
976 break;
977 case MATCH_MIDDLE_ONLY:
978 r->match = regex_match_middle;
979 break;
980 case MATCH_END_ONLY:
981 r->match = regex_match_end;
982 break;
983 case MATCH_GLOB:
984 r->match = regex_match_glob;
985 break;
986 }
987}
988
989
990int filter_match_preds(struct event_filter *filter, void *rec)
991{
992 struct prog_entry *prog;
993 int i;
994
995
996 if (!filter)
997 return 1;
998
999
1000 prog = rcu_dereference_raw(filter->prog);
1001 if (!prog)
1002 return 1;
1003
1004 for (i = 0; prog[i].pred; i++) {
1005 struct filter_pred *pred = prog[i].pred;
1006 int match = pred->fn(pred, rec);
1007 if (match == prog[i].when_to_branch)
1008 i = prog[i].target;
1009 }
1010 return prog[i].target;
1011}
1012EXPORT_SYMBOL_GPL(filter_match_preds);
1013
1014static void remove_filter_string(struct event_filter *filter)
1015{
1016 if (!filter)
1017 return;
1018
1019 kfree(filter->filter_string);
1020 filter->filter_string = NULL;
1021}
1022
1023static void append_filter_err(struct trace_array *tr,
1024 struct filter_parse_error *pe,
1025 struct event_filter *filter)
1026{
1027 struct trace_seq *s;
1028 int pos = pe->lasterr_pos;
1029 char *buf;
1030 int len;
1031
1032 if (WARN_ON(!filter->filter_string))
1033 return;
1034
1035 s = kmalloc(sizeof(*s), GFP_KERNEL);
1036 if (!s)
1037 return;
1038 trace_seq_init(s);
1039
1040 len = strlen(filter->filter_string);
1041 if (pos > len)
1042 pos = len;
1043
1044
1045 if (pos)
1046 pos++;
1047
1048 trace_seq_puts(s, filter->filter_string);
1049 if (pe->lasterr > 0) {
1050 trace_seq_printf(s, "\n%*s", pos, "^");
1051 trace_seq_printf(s, "\nparse_error: %s\n", err_text[pe->lasterr]);
1052 tracing_log_err(tr, "event filter parse error",
1053 filter->filter_string, err_text,
1054 pe->lasterr, pe->lasterr_pos);
1055 } else {
1056 trace_seq_printf(s, "\nError: (%d)\n", pe->lasterr);
1057 tracing_log_err(tr, "event filter parse error",
1058 filter->filter_string, err_text,
1059 FILT_ERR_ERRNO, 0);
1060 }
1061 trace_seq_putc(s, 0);
1062 buf = kmemdup_nul(s->buffer, s->seq.len, GFP_KERNEL);
1063 if (buf) {
1064 kfree(filter->filter_string);
1065 filter->filter_string = buf;
1066 }
1067 kfree(s);
1068}
1069
1070static inline struct event_filter *event_filter(struct trace_event_file *file)
1071{
1072 return file->filter;
1073}
1074
1075
1076void print_event_filter(struct trace_event_file *file, struct trace_seq *s)
1077{
1078 struct event_filter *filter = event_filter(file);
1079
1080 if (filter && filter->filter_string)
1081 trace_seq_printf(s, "%s\n", filter->filter_string);
1082 else
1083 trace_seq_puts(s, "none\n");
1084}
1085
1086void print_subsystem_event_filter(struct event_subsystem *system,
1087 struct trace_seq *s)
1088{
1089 struct event_filter *filter;
1090
1091 mutex_lock(&event_mutex);
1092 filter = system->filter;
1093 if (filter && filter->filter_string)
1094 trace_seq_printf(s, "%s\n", filter->filter_string);
1095 else
1096 trace_seq_puts(s, DEFAULT_SYS_FILTER_MESSAGE "\n");
1097 mutex_unlock(&event_mutex);
1098}
1099
1100static void free_prog(struct event_filter *filter)
1101{
1102 struct prog_entry *prog;
1103 int i;
1104
1105 prog = rcu_access_pointer(filter->prog);
1106 if (!prog)
1107 return;
1108
1109 for (i = 0; prog[i].pred; i++)
1110 kfree(prog[i].pred);
1111 kfree(prog);
1112}
1113
1114static void filter_disable(struct trace_event_file *file)
1115{
1116 unsigned long old_flags = file->flags;
1117
1118 file->flags &= ~EVENT_FILE_FL_FILTERED;
1119
1120 if (old_flags != file->flags)
1121 trace_buffered_event_disable();
1122}
1123
1124static void __free_filter(struct event_filter *filter)
1125{
1126 if (!filter)
1127 return;
1128
1129 free_prog(filter);
1130 kfree(filter->filter_string);
1131 kfree(filter);
1132}
1133
1134void free_event_filter(struct event_filter *filter)
1135{
1136 __free_filter(filter);
1137}
1138
1139static inline void __remove_filter(struct trace_event_file *file)
1140{
1141 filter_disable(file);
1142 remove_filter_string(file->filter);
1143}
1144
1145static void filter_free_subsystem_preds(struct trace_subsystem_dir *dir,
1146 struct trace_array *tr)
1147{
1148 struct trace_event_file *file;
1149
1150 list_for_each_entry(file, &tr->events, list) {
1151 if (file->system != dir)
1152 continue;
1153 __remove_filter(file);
1154 }
1155}
1156
1157static inline void __free_subsystem_filter(struct trace_event_file *file)
1158{
1159 __free_filter(file->filter);
1160 file->filter = NULL;
1161}
1162
1163static void filter_free_subsystem_filters(struct trace_subsystem_dir *dir,
1164 struct trace_array *tr)
1165{
1166 struct trace_event_file *file;
1167
1168 list_for_each_entry(file, &tr->events, list) {
1169 if (file->system != dir)
1170 continue;
1171 __free_subsystem_filter(file);
1172 }
1173}
1174
1175int filter_assign_type(const char *type)
1176{
1177 if (strstr(type, "__data_loc") && strstr(type, "char"))
1178 return FILTER_DYN_STRING;
1179
1180 if (strstr(type, "__rel_loc") && strstr(type, "char"))
1181 return FILTER_RDYN_STRING;
1182
1183 if (strchr(type, '[') && strstr(type, "char"))
1184 return FILTER_STATIC_STRING;
1185
1186 if (strcmp(type, "char *") == 0 || strcmp(type, "const char *") == 0)
1187 return FILTER_PTR_STRING;
1188
1189 return FILTER_OTHER;
1190}
1191
1192static filter_pred_fn_t select_comparison_fn(enum filter_op_ids op,
1193 int field_size, int field_is_signed)
1194{
1195 filter_pred_fn_t fn = NULL;
1196 int pred_func_index = -1;
1197
1198 switch (op) {
1199 case OP_EQ:
1200 case OP_NE:
1201 break;
1202 default:
1203 if (WARN_ON_ONCE(op < PRED_FUNC_START))
1204 return NULL;
1205 pred_func_index = op - PRED_FUNC_START;
1206 if (WARN_ON_ONCE(pred_func_index > PRED_FUNC_MAX))
1207 return NULL;
1208 }
1209
1210 switch (field_size) {
1211 case 8:
1212 if (pred_func_index < 0)
1213 fn = filter_pred_64;
1214 else if (field_is_signed)
1215 fn = pred_funcs_s64[pred_func_index];
1216 else
1217 fn = pred_funcs_u64[pred_func_index];
1218 break;
1219 case 4:
1220 if (pred_func_index < 0)
1221 fn = filter_pred_32;
1222 else if (field_is_signed)
1223 fn = pred_funcs_s32[pred_func_index];
1224 else
1225 fn = pred_funcs_u32[pred_func_index];
1226 break;
1227 case 2:
1228 if (pred_func_index < 0)
1229 fn = filter_pred_16;
1230 else if (field_is_signed)
1231 fn = pred_funcs_s16[pred_func_index];
1232 else
1233 fn = pred_funcs_u16[pred_func_index];
1234 break;
1235 case 1:
1236 if (pred_func_index < 0)
1237 fn = filter_pred_8;
1238 else if (field_is_signed)
1239 fn = pred_funcs_s8[pred_func_index];
1240 else
1241 fn = pred_funcs_u8[pred_func_index];
1242 break;
1243 }
1244
1245 return fn;
1246}
1247
1248
1249static int parse_pred(const char *str, void *data,
1250 int pos, struct filter_parse_error *pe,
1251 struct filter_pred **pred_ptr)
1252{
1253 struct trace_event_call *call = data;
1254 struct ftrace_event_field *field;
1255 struct filter_pred *pred = NULL;
1256 char num_buf[24];
1257 char *field_name;
1258 bool ustring = false;
1259 char q;
1260 u64 val;
1261 int len;
1262 int ret;
1263 int op;
1264 int s;
1265 int i = 0;
1266
1267
1268 while (isspace(str[i]))
1269 i++;
1270 s = i;
1271
1272 while (isalnum(str[i]) || str[i] == '_')
1273 i++;
1274
1275 len = i - s;
1276
1277 if (!len)
1278 return -1;
1279
1280 field_name = kmemdup_nul(str + s, len, GFP_KERNEL);
1281 if (!field_name)
1282 return -ENOMEM;
1283
1284
1285
1286 field = trace_find_event_field(call, field_name);
1287 kfree(field_name);
1288 if (!field) {
1289 parse_error(pe, FILT_ERR_FIELD_NOT_FOUND, pos + i);
1290 return -EINVAL;
1291 }
1292
1293
1294 if ((len = str_has_prefix(str + i, ".ustring"))) {
1295 ustring = true;
1296 i += len;
1297 }
1298
1299 while (isspace(str[i]))
1300 i++;
1301
1302
1303 for (op = 0; ops[op]; op++) {
1304
1305 if (strncmp(str + i, ops[op], strlen(ops[op])) == 0)
1306 break;
1307 }
1308
1309 if (!ops[op]) {
1310 parse_error(pe, FILT_ERR_INVALID_OP, pos + i);
1311 goto err_free;
1312 }
1313
1314 i += strlen(ops[op]);
1315
1316 while (isspace(str[i]))
1317 i++;
1318
1319 s = i;
1320
1321 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1322 if (!pred)
1323 return -ENOMEM;
1324
1325 pred->field = field;
1326 pred->offset = field->offset;
1327 pred->op = op;
1328
1329 if (ftrace_event_is_function(call)) {
1330
1331
1332
1333
1334
1335
1336
1337 if (strcmp(field->name, "ip") != 0) {
1338 parse_error(pe, FILT_ERR_IP_FIELD_ONLY, pos + i);
1339 goto err_free;
1340 }
1341 pred->fn = filter_pred_none;
1342
1343
1344
1345
1346
1347 if (str[i] == '\'' || str[i] == '"')
1348 q = str[i];
1349 else
1350 q = 0;
1351
1352 for (i++; str[i]; i++) {
1353 if (q && str[i] == q)
1354 break;
1355 if (!q && (str[i] == ')' || str[i] == '&' ||
1356 str[i] == '|'))
1357 break;
1358 }
1359
1360 if (q)
1361 s++;
1362 len = i - s;
1363 if (len >= MAX_FILTER_STR_VAL) {
1364 parse_error(pe, FILT_ERR_OPERAND_TOO_LONG, pos + i);
1365 goto err_free;
1366 }
1367
1368 pred->regex.len = len;
1369 strncpy(pred->regex.pattern, str + s, len);
1370 pred->regex.pattern[len] = 0;
1371
1372
1373 } else if (str[i] == '\'' || str[i] == '"') {
1374 char q = str[i];
1375
1376
1377 switch (op) {
1378 case OP_NE:
1379 pred->not = 1;
1380 fallthrough;
1381 case OP_GLOB:
1382 case OP_EQ:
1383 break;
1384 default:
1385 parse_error(pe, FILT_ERR_ILLEGAL_FIELD_OP, pos + i);
1386 goto err_free;
1387 }
1388
1389
1390 if (!is_string_field(field)) {
1391 parse_error(pe, FILT_ERR_EXPECT_DIGIT, pos + i);
1392 goto err_free;
1393 }
1394
1395 for (i++; str[i]; i++) {
1396 if (str[i] == q)
1397 break;
1398 }
1399 if (!str[i]) {
1400 parse_error(pe, FILT_ERR_MISSING_QUOTE, pos + i);
1401 goto err_free;
1402 }
1403
1404
1405 s++;
1406 len = i - s;
1407 if (len >= MAX_FILTER_STR_VAL) {
1408 parse_error(pe, FILT_ERR_OPERAND_TOO_LONG, pos + i);
1409 goto err_free;
1410 }
1411
1412 pred->regex.len = len;
1413 strncpy(pred->regex.pattern, str + s, len);
1414 pred->regex.pattern[len] = 0;
1415
1416 filter_build_regex(pred);
1417
1418 if (field->filter_type == FILTER_COMM) {
1419 pred->fn = filter_pred_comm;
1420
1421 } else if (field->filter_type == FILTER_STATIC_STRING) {
1422 pred->fn = filter_pred_string;
1423 pred->regex.field_len = field->size;
1424
1425 } else if (field->filter_type == FILTER_DYN_STRING) {
1426 pred->fn = filter_pred_strloc;
1427 } else if (field->filter_type == FILTER_RDYN_STRING)
1428 pred->fn = filter_pred_strrelloc;
1429 else {
1430
1431 if (!ustring_per_cpu) {
1432
1433 ustring_per_cpu = alloc_percpu(struct ustring_buffer);
1434 if (!ustring_per_cpu)
1435 goto err_mem;
1436 }
1437
1438 if (ustring)
1439 pred->fn = filter_pred_pchar_user;
1440 else
1441 pred->fn = filter_pred_pchar;
1442 }
1443
1444 i++;
1445
1446 } else if (isdigit(str[i]) || str[i] == '-') {
1447
1448
1449 if (is_string_field(field)) {
1450 parse_error(pe, FILT_ERR_EXPECT_STRING, pos + i);
1451 goto err_free;
1452 }
1453
1454 if (op == OP_GLOB) {
1455 parse_error(pe, FILT_ERR_ILLEGAL_FIELD_OP, pos + i);
1456 goto err_free;
1457 }
1458
1459 if (str[i] == '-')
1460 i++;
1461
1462
1463 while (isalnum(str[i]))
1464 i++;
1465
1466 len = i - s;
1467
1468 if (len >= sizeof(num_buf)) {
1469 parse_error(pe, FILT_ERR_OPERAND_TOO_LONG, pos + i);
1470 goto err_free;
1471 }
1472
1473 strncpy(num_buf, str + s, len);
1474 num_buf[len] = 0;
1475
1476
1477 if (field->is_signed)
1478 ret = kstrtoll(num_buf, 0, &val);
1479 else
1480 ret = kstrtoull(num_buf, 0, &val);
1481 if (ret) {
1482 parse_error(pe, FILT_ERR_ILLEGAL_INTVAL, pos + s);
1483 goto err_free;
1484 }
1485
1486 pred->val = val;
1487
1488 if (field->filter_type == FILTER_CPU)
1489 pred->fn = filter_pred_cpu;
1490 else {
1491 pred->fn = select_comparison_fn(pred->op, field->size,
1492 field->is_signed);
1493 if (pred->op == OP_NE)
1494 pred->not = 1;
1495 }
1496
1497 } else {
1498 parse_error(pe, FILT_ERR_INVALID_VALUE, pos + i);
1499 goto err_free;
1500 }
1501
1502 *pred_ptr = pred;
1503 return i;
1504
1505err_free:
1506 kfree(pred);
1507 return -EINVAL;
1508err_mem:
1509 kfree(pred);
1510 return -ENOMEM;
1511}
1512
1513enum {
1514 TOO_MANY_CLOSE = -1,
1515 TOO_MANY_OPEN = -2,
1516 MISSING_QUOTE = -3,
1517};
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529static int calc_stack(const char *str, int *parens, int *preds, int *err)
1530{
1531 bool is_pred = false;
1532 int nr_preds = 0;
1533 int open = 1;
1534 int last_quote = 0;
1535 int max_open = 1;
1536 int quote = 0;
1537 int i;
1538
1539 *err = 0;
1540
1541 for (i = 0; str[i]; i++) {
1542 if (isspace(str[i]))
1543 continue;
1544 if (quote) {
1545 if (str[i] == quote)
1546 quote = 0;
1547 continue;
1548 }
1549
1550 switch (str[i]) {
1551 case '\'':
1552 case '"':
1553 quote = str[i];
1554 last_quote = i;
1555 break;
1556 case '|':
1557 case '&':
1558 if (str[i+1] != str[i])
1559 break;
1560 is_pred = false;
1561 continue;
1562 case '(':
1563 is_pred = false;
1564 open++;
1565 if (open > max_open)
1566 max_open = open;
1567 continue;
1568 case ')':
1569 is_pred = false;
1570 if (open == 1) {
1571 *err = i;
1572 return TOO_MANY_CLOSE;
1573 }
1574 open--;
1575 continue;
1576 }
1577 if (!is_pred) {
1578 nr_preds++;
1579 is_pred = true;
1580 }
1581 }
1582
1583 if (quote) {
1584 *err = last_quote;
1585 return MISSING_QUOTE;
1586 }
1587
1588 if (open != 1) {
1589 int level = open;
1590
1591
1592 for (i--; i; i--) {
1593 if (quote) {
1594 if (str[i] == quote)
1595 quote = 0;
1596 continue;
1597 }
1598 switch (str[i]) {
1599 case '(':
1600 if (level == open) {
1601 *err = i;
1602 return TOO_MANY_OPEN;
1603 }
1604 level--;
1605 break;
1606 case ')':
1607 level++;
1608 break;
1609 case '\'':
1610 case '"':
1611 quote = str[i];
1612 break;
1613 }
1614 }
1615
1616 *err = 0;
1617 return TOO_MANY_OPEN;
1618 }
1619
1620
1621 *parens = max_open;
1622 *preds = nr_preds;
1623 return 0;
1624}
1625
1626static int process_preds(struct trace_event_call *call,
1627 const char *filter_string,
1628 struct event_filter *filter,
1629 struct filter_parse_error *pe)
1630{
1631 struct prog_entry *prog;
1632 int nr_parens;
1633 int nr_preds;
1634 int index;
1635 int ret;
1636
1637 ret = calc_stack(filter_string, &nr_parens, &nr_preds, &index);
1638 if (ret < 0) {
1639 switch (ret) {
1640 case MISSING_QUOTE:
1641 parse_error(pe, FILT_ERR_MISSING_QUOTE, index);
1642 break;
1643 case TOO_MANY_OPEN:
1644 parse_error(pe, FILT_ERR_TOO_MANY_OPEN, index);
1645 break;
1646 default:
1647 parse_error(pe, FILT_ERR_TOO_MANY_CLOSE, index);
1648 }
1649 return ret;
1650 }
1651
1652 if (!nr_preds)
1653 return -EINVAL;
1654
1655 prog = predicate_parse(filter_string, nr_parens, nr_preds,
1656 parse_pred, call, pe);
1657 if (IS_ERR(prog))
1658 return PTR_ERR(prog);
1659
1660 rcu_assign_pointer(filter->prog, prog);
1661 return 0;
1662}
1663
1664static inline void event_set_filtered_flag(struct trace_event_file *file)
1665{
1666 unsigned long old_flags = file->flags;
1667
1668 file->flags |= EVENT_FILE_FL_FILTERED;
1669
1670 if (old_flags != file->flags)
1671 trace_buffered_event_enable();
1672}
1673
1674static inline void event_set_filter(struct trace_event_file *file,
1675 struct event_filter *filter)
1676{
1677 rcu_assign_pointer(file->filter, filter);
1678}
1679
1680static inline void event_clear_filter(struct trace_event_file *file)
1681{
1682 RCU_INIT_POINTER(file->filter, NULL);
1683}
1684
1685struct filter_list {
1686 struct list_head list;
1687 struct event_filter *filter;
1688};
1689
1690static int process_system_preds(struct trace_subsystem_dir *dir,
1691 struct trace_array *tr,
1692 struct filter_parse_error *pe,
1693 char *filter_string)
1694{
1695 struct trace_event_file *file;
1696 struct filter_list *filter_item;
1697 struct event_filter *filter = NULL;
1698 struct filter_list *tmp;
1699 LIST_HEAD(filter_list);
1700 bool fail = true;
1701 int err;
1702
1703 list_for_each_entry(file, &tr->events, list) {
1704
1705 if (file->system != dir)
1706 continue;
1707
1708 filter = kzalloc(sizeof(*filter), GFP_KERNEL);
1709 if (!filter)
1710 goto fail_mem;
1711
1712 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
1713 if (!filter->filter_string)
1714 goto fail_mem;
1715
1716 err = process_preds(file->event_call, filter_string, filter, pe);
1717 if (err) {
1718 filter_disable(file);
1719 parse_error(pe, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1720 append_filter_err(tr, pe, filter);
1721 } else
1722 event_set_filtered_flag(file);
1723
1724
1725 filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
1726 if (!filter_item)
1727 goto fail_mem;
1728
1729 list_add_tail(&filter_item->list, &filter_list);
1730
1731
1732
1733
1734 filter_item->filter = event_filter(file);
1735 event_set_filter(file, filter);
1736 filter = NULL;
1737
1738 fail = false;
1739 }
1740
1741 if (fail)
1742 goto fail;
1743
1744
1745
1746
1747
1748
1749 tracepoint_synchronize_unregister();
1750 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1751 __free_filter(filter_item->filter);
1752 list_del(&filter_item->list);
1753 kfree(filter_item);
1754 }
1755 return 0;
1756 fail:
1757
1758 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1759 list_del(&filter_item->list);
1760 kfree(filter_item);
1761 }
1762 parse_error(pe, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1763 return -EINVAL;
1764 fail_mem:
1765 __free_filter(filter);
1766
1767 if (!fail)
1768 tracepoint_synchronize_unregister();
1769 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1770 __free_filter(filter_item->filter);
1771 list_del(&filter_item->list);
1772 kfree(filter_item);
1773 }
1774 return -ENOMEM;
1775}
1776
1777static int create_filter_start(char *filter_string, bool set_str,
1778 struct filter_parse_error **pse,
1779 struct event_filter **filterp)
1780{
1781 struct event_filter *filter;
1782 struct filter_parse_error *pe = NULL;
1783 int err = 0;
1784
1785 if (WARN_ON_ONCE(*pse || *filterp))
1786 return -EINVAL;
1787
1788 filter = kzalloc(sizeof(*filter), GFP_KERNEL);
1789 if (filter && set_str) {
1790 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
1791 if (!filter->filter_string)
1792 err = -ENOMEM;
1793 }
1794
1795 pe = kzalloc(sizeof(*pe), GFP_KERNEL);
1796
1797 if (!filter || !pe || err) {
1798 kfree(pe);
1799 __free_filter(filter);
1800 return -ENOMEM;
1801 }
1802
1803
1804 *filterp = filter;
1805 *pse = pe;
1806
1807 return 0;
1808}
1809
1810static void create_filter_finish(struct filter_parse_error *pe)
1811{
1812 kfree(pe);
1813}
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833static int create_filter(struct trace_array *tr,
1834 struct trace_event_call *call,
1835 char *filter_string, bool set_str,
1836 struct event_filter **filterp)
1837{
1838 struct filter_parse_error *pe = NULL;
1839 int err;
1840
1841
1842 if (WARN_ON(*filterp))
1843 *filterp = NULL;
1844
1845 err = create_filter_start(filter_string, set_str, &pe, filterp);
1846 if (err)
1847 return err;
1848
1849 err = process_preds(call, filter_string, *filterp, pe);
1850 if (err && set_str)
1851 append_filter_err(tr, pe, *filterp);
1852 create_filter_finish(pe);
1853
1854 return err;
1855}
1856
1857int create_event_filter(struct trace_array *tr,
1858 struct trace_event_call *call,
1859 char *filter_str, bool set_str,
1860 struct event_filter **filterp)
1861{
1862 return create_filter(tr, call, filter_str, set_str, filterp);
1863}
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874static int create_system_filter(struct trace_subsystem_dir *dir,
1875 char *filter_str, struct event_filter **filterp)
1876{
1877 struct filter_parse_error *pe = NULL;
1878 int err;
1879
1880 err = create_filter_start(filter_str, true, &pe, filterp);
1881 if (!err) {
1882 err = process_system_preds(dir, dir->tr, pe, filter_str);
1883 if (!err) {
1884
1885 kfree((*filterp)->filter_string);
1886 (*filterp)->filter_string = NULL;
1887 } else {
1888 append_filter_err(dir->tr, pe, *filterp);
1889 }
1890 }
1891 create_filter_finish(pe);
1892
1893 return err;
1894}
1895
1896
1897int apply_event_filter(struct trace_event_file *file, char *filter_string)
1898{
1899 struct trace_event_call *call = file->event_call;
1900 struct event_filter *filter = NULL;
1901 int err;
1902
1903 if (!strcmp(strstrip(filter_string), "0")) {
1904 filter_disable(file);
1905 filter = event_filter(file);
1906
1907 if (!filter)
1908 return 0;
1909
1910 event_clear_filter(file);
1911
1912
1913 tracepoint_synchronize_unregister();
1914 __free_filter(filter);
1915
1916 return 0;
1917 }
1918
1919 err = create_filter(file->tr, call, filter_string, true, &filter);
1920
1921
1922
1923
1924
1925
1926
1927 if (filter) {
1928 struct event_filter *tmp;
1929
1930 tmp = event_filter(file);
1931 if (!err)
1932 event_set_filtered_flag(file);
1933 else
1934 filter_disable(file);
1935
1936 event_set_filter(file, filter);
1937
1938 if (tmp) {
1939
1940 tracepoint_synchronize_unregister();
1941 __free_filter(tmp);
1942 }
1943 }
1944
1945 return err;
1946}
1947
1948int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
1949 char *filter_string)
1950{
1951 struct event_subsystem *system = dir->subsystem;
1952 struct trace_array *tr = dir->tr;
1953 struct event_filter *filter = NULL;
1954 int err = 0;
1955
1956 mutex_lock(&event_mutex);
1957
1958
1959 if (!dir->nr_events) {
1960 err = -ENODEV;
1961 goto out_unlock;
1962 }
1963
1964 if (!strcmp(strstrip(filter_string), "0")) {
1965 filter_free_subsystem_preds(dir, tr);
1966 remove_filter_string(system->filter);
1967 filter = system->filter;
1968 system->filter = NULL;
1969
1970 tracepoint_synchronize_unregister();
1971 filter_free_subsystem_filters(dir, tr);
1972 __free_filter(filter);
1973 goto out_unlock;
1974 }
1975
1976 err = create_system_filter(dir, filter_string, &filter);
1977 if (filter) {
1978
1979
1980
1981
1982 __free_filter(system->filter);
1983 system->filter = filter;
1984 }
1985out_unlock:
1986 mutex_unlock(&event_mutex);
1987
1988 return err;
1989}
1990
1991#ifdef CONFIG_PERF_EVENTS
1992
1993void ftrace_profile_free_filter(struct perf_event *event)
1994{
1995 struct event_filter *filter = event->filter;
1996
1997 event->filter = NULL;
1998 __free_filter(filter);
1999}
2000
2001struct function_filter_data {
2002 struct ftrace_ops *ops;
2003 int first_filter;
2004 int first_notrace;
2005};
2006
2007#ifdef CONFIG_FUNCTION_TRACER
2008static char **
2009ftrace_function_filter_re(char *buf, int len, int *count)
2010{
2011 char *str, **re;
2012
2013 str = kstrndup(buf, len, GFP_KERNEL);
2014 if (!str)
2015 return NULL;
2016
2017
2018
2019
2020
2021 strreplace(str, ',', ' ');
2022
2023 re = argv_split(GFP_KERNEL, str, count);
2024 kfree(str);
2025 return re;
2026}
2027
2028static int ftrace_function_set_regexp(struct ftrace_ops *ops, int filter,
2029 int reset, char *re, int len)
2030{
2031 int ret;
2032
2033 if (filter)
2034 ret = ftrace_set_filter(ops, re, len, reset);
2035 else
2036 ret = ftrace_set_notrace(ops, re, len, reset);
2037
2038 return ret;
2039}
2040
2041static int __ftrace_function_set_filter(int filter, char *buf, int len,
2042 struct function_filter_data *data)
2043{
2044 int i, re_cnt, ret = -EINVAL;
2045 int *reset;
2046 char **re;
2047
2048 reset = filter ? &data->first_filter : &data->first_notrace;
2049
2050
2051
2052
2053
2054
2055 re = ftrace_function_filter_re(buf, len, &re_cnt);
2056 if (!re)
2057 return -EINVAL;
2058
2059 for (i = 0; i < re_cnt; i++) {
2060 ret = ftrace_function_set_regexp(data->ops, filter, *reset,
2061 re[i], strlen(re[i]));
2062 if (ret)
2063 break;
2064
2065 if (*reset)
2066 *reset = 0;
2067 }
2068
2069 argv_free(re);
2070 return ret;
2071}
2072
2073static int ftrace_function_check_pred(struct filter_pred *pred)
2074{
2075 struct ftrace_event_field *field = pred->field;
2076
2077
2078
2079
2080
2081
2082 if ((pred->op != OP_EQ) && (pred->op != OP_NE))
2083 return -EINVAL;
2084
2085 if (strcmp(field->name, "ip"))
2086 return -EINVAL;
2087
2088 return 0;
2089}
2090
2091static int ftrace_function_set_filter_pred(struct filter_pred *pred,
2092 struct function_filter_data *data)
2093{
2094 int ret;
2095
2096
2097 ret = ftrace_function_check_pred(pred);
2098 if (ret)
2099 return ret;
2100
2101 return __ftrace_function_set_filter(pred->op == OP_EQ,
2102 pred->regex.pattern,
2103 pred->regex.len,
2104 data);
2105}
2106
2107static bool is_or(struct prog_entry *prog, int i)
2108{
2109 int target;
2110
2111
2112
2113
2114
2115
2116 target = prog[i].target + 1;
2117
2118 if (prog[target].pred)
2119 return false;
2120
2121
2122 return prog[i].when_to_branch == prog[target].target;
2123}
2124
2125static int ftrace_function_set_filter(struct perf_event *event,
2126 struct event_filter *filter)
2127{
2128 struct prog_entry *prog = rcu_dereference_protected(filter->prog,
2129 lockdep_is_held(&event_mutex));
2130 struct function_filter_data data = {
2131 .first_filter = 1,
2132 .first_notrace = 1,
2133 .ops = &event->ftrace_ops,
2134 };
2135 int i;
2136
2137 for (i = 0; prog[i].pred; i++) {
2138 struct filter_pred *pred = prog[i].pred;
2139
2140 if (!is_or(prog, i))
2141 return -EINVAL;
2142
2143 if (ftrace_function_set_filter_pred(pred, &data) < 0)
2144 return -EINVAL;
2145 }
2146 return 0;
2147}
2148#else
2149static int ftrace_function_set_filter(struct perf_event *event,
2150 struct event_filter *filter)
2151{
2152 return -ENODEV;
2153}
2154#endif
2155
2156int ftrace_profile_set_filter(struct perf_event *event, int event_id,
2157 char *filter_str)
2158{
2159 int err;
2160 struct event_filter *filter = NULL;
2161 struct trace_event_call *call;
2162
2163 mutex_lock(&event_mutex);
2164
2165 call = event->tp_event;
2166
2167 err = -EINVAL;
2168 if (!call)
2169 goto out_unlock;
2170
2171 err = -EEXIST;
2172 if (event->filter)
2173 goto out_unlock;
2174
2175 err = create_filter(NULL, call, filter_str, false, &filter);
2176 if (err)
2177 goto free_filter;
2178
2179 if (ftrace_event_is_function(call))
2180 err = ftrace_function_set_filter(event, filter);
2181 else
2182 event->filter = filter;
2183
2184free_filter:
2185 if (err || ftrace_event_is_function(call))
2186 __free_filter(filter);
2187
2188out_unlock:
2189 mutex_unlock(&event_mutex);
2190
2191 return err;
2192}
2193
2194#endif
2195
2196#ifdef CONFIG_FTRACE_STARTUP_TEST
2197
2198#include <linux/types.h>
2199#include <linux/tracepoint.h>
2200
2201#define CREATE_TRACE_POINTS
2202#include "trace_events_filter_test.h"
2203
2204#define DATA_REC(m, va, vb, vc, vd, ve, vf, vg, vh, nvisit) \
2205{ \
2206 .filter = FILTER, \
2207 .rec = { .a = va, .b = vb, .c = vc, .d = vd, \
2208 .e = ve, .f = vf, .g = vg, .h = vh }, \
2209 .match = m, \
2210 .not_visited = nvisit, \
2211}
2212#define YES 1
2213#define NO 0
2214
2215static struct test_filter_data_t {
2216 char *filter;
2217 struct trace_event_raw_ftrace_test_filter rec;
2218 int match;
2219 char *not_visited;
2220} test_filter_data[] = {
2221#define FILTER "a == 1 && b == 1 && c == 1 && d == 1 && " \
2222 "e == 1 && f == 1 && g == 1 && h == 1"
2223 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, ""),
2224 DATA_REC(NO, 0, 1, 1, 1, 1, 1, 1, 1, "bcdefgh"),
2225 DATA_REC(NO, 1, 1, 1, 1, 1, 1, 1, 0, ""),
2226#undef FILTER
2227#define FILTER "a == 1 || b == 1 || c == 1 || d == 1 || " \
2228 "e == 1 || f == 1 || g == 1 || h == 1"
2229 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 0, ""),
2230 DATA_REC(YES, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2231 DATA_REC(YES, 1, 0, 0, 0, 0, 0, 0, 0, "bcdefgh"),
2232#undef FILTER
2233#define FILTER "(a == 1 || b == 1) && (c == 1 || d == 1) && " \
2234 "(e == 1 || f == 1) && (g == 1 || h == 1)"
2235 DATA_REC(NO, 0, 0, 1, 1, 1, 1, 1, 1, "dfh"),
2236 DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2237 DATA_REC(YES, 1, 0, 1, 0, 0, 1, 0, 1, "bd"),
2238 DATA_REC(NO, 1, 0, 1, 0, 0, 1, 0, 0, "bd"),
2239#undef FILTER
2240#define FILTER "(a == 1 && b == 1) || (c == 1 && d == 1) || " \
2241 "(e == 1 && f == 1) || (g == 1 && h == 1)"
2242 DATA_REC(YES, 1, 0, 1, 1, 1, 1, 1, 1, "efgh"),
2243 DATA_REC(YES, 0, 0, 0, 0, 0, 0, 1, 1, ""),
2244 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2245#undef FILTER
2246#define FILTER "(a == 1 && b == 1) && (c == 1 && d == 1) && " \
2247 "(e == 1 && f == 1) || (g == 1 && h == 1)"
2248 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 0, "gh"),
2249 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 1, ""),
2250 DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, ""),
2251#undef FILTER
2252#define FILTER "((a == 1 || b == 1) || (c == 1 || d == 1) || " \
2253 "(e == 1 || f == 1)) && (g == 1 || h == 1)"
2254 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 0, 1, "bcdef"),
2255 DATA_REC(NO, 0, 0, 0, 0, 0, 0, 0, 0, ""),
2256 DATA_REC(YES, 1, 1, 1, 1, 1, 0, 1, 1, "h"),
2257#undef FILTER
2258#define FILTER "((((((((a == 1) && (b == 1)) || (c == 1)) && (d == 1)) || " \
2259 "(e == 1)) && (f == 1)) || (g == 1)) && (h == 1))"
2260 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "ceg"),
2261 DATA_REC(NO, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2262 DATA_REC(NO, 1, 0, 1, 0, 1, 0, 1, 0, ""),
2263#undef FILTER
2264#define FILTER "((((((((a == 1) || (b == 1)) && (c == 1)) || (d == 1)) && " \
2265 "(e == 1)) || (f == 1)) && (g == 1)) || (h == 1))"
2266 DATA_REC(YES, 1, 1, 1, 1, 1, 1, 1, 1, "bdfh"),
2267 DATA_REC(YES, 0, 1, 0, 1, 0, 1, 0, 1, ""),
2268 DATA_REC(YES, 1, 0, 1, 0, 1, 0, 1, 0, "bdfh"),
2269};
2270
2271#undef DATA_REC
2272#undef FILTER
2273#undef YES
2274#undef NO
2275
2276#define DATA_CNT ARRAY_SIZE(test_filter_data)
2277
2278static int test_pred_visited;
2279
2280static int test_pred_visited_fn(struct filter_pred *pred, void *event)
2281{
2282 struct ftrace_event_field *field = pred->field;
2283
2284 test_pred_visited = 1;
2285 printk(KERN_INFO "\npred visited %s\n", field->name);
2286 return 1;
2287}
2288
2289static void update_pred_fn(struct event_filter *filter, char *fields)
2290{
2291 struct prog_entry *prog = rcu_dereference_protected(filter->prog,
2292 lockdep_is_held(&event_mutex));
2293 int i;
2294
2295 for (i = 0; prog[i].pred; i++) {
2296 struct filter_pred *pred = prog[i].pred;
2297 struct ftrace_event_field *field = pred->field;
2298
2299 WARN_ON_ONCE(!pred->fn);
2300
2301 if (!field) {
2302 WARN_ONCE(1, "all leafs should have field defined %d", i);
2303 continue;
2304 }
2305
2306 if (!strchr(fields, *field->name))
2307 continue;
2308
2309 pred->fn = test_pred_visited_fn;
2310 }
2311}
2312
2313static __init int ftrace_test_event_filter(void)
2314{
2315 int i;
2316
2317 printk(KERN_INFO "Testing ftrace filter: ");
2318
2319 for (i = 0; i < DATA_CNT; i++) {
2320 struct event_filter *filter = NULL;
2321 struct test_filter_data_t *d = &test_filter_data[i];
2322 int err;
2323
2324 err = create_filter(NULL, &event_ftrace_test_filter,
2325 d->filter, false, &filter);
2326 if (err) {
2327 printk(KERN_INFO
2328 "Failed to get filter for '%s', err %d\n",
2329 d->filter, err);
2330 __free_filter(filter);
2331 break;
2332 }
2333
2334
2335 mutex_lock(&event_mutex);
2336
2337
2338
2339
2340 preempt_disable();
2341 if (*d->not_visited)
2342 update_pred_fn(filter, d->not_visited);
2343
2344 test_pred_visited = 0;
2345 err = filter_match_preds(filter, &d->rec);
2346 preempt_enable();
2347
2348 mutex_unlock(&event_mutex);
2349
2350 __free_filter(filter);
2351
2352 if (test_pred_visited) {
2353 printk(KERN_INFO
2354 "Failed, unwanted pred visited for filter %s\n",
2355 d->filter);
2356 break;
2357 }
2358
2359 if (err != d->match) {
2360 printk(KERN_INFO
2361 "Failed to match filter '%s', expected %d\n",
2362 d->filter, d->match);
2363 break;
2364 }
2365 }
2366
2367 if (i == DATA_CNT)
2368 printk(KERN_CONT "OK\n");
2369
2370 return 0;
2371}
2372
2373late_initcall(ftrace_test_event_filter);
2374
2375#endif
2376