Root/kernel/trace/trace_events_filter.c

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
21#include <linux/module.h>
22#include <linux/ctype.h>
23#include <linux/mutex.h>
24#include <linux/perf_event.h>
25#include <linux/slab.h>
26
27#include "trace.h"
28#include "trace_output.h"
29
30enum filter_op_ids
31{
32    OP_OR,
33    OP_AND,
34    OP_GLOB,
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[] = {
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 },
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
126#define DEFINE_COMPARISON_PRED(type) \
127static int filter_pred_##type(struct filter_pred *pred, void *event, \
128                  int val1, int val2) \
129{ \
130    type *addr = (type *)(event + pred->offset); \
131    type val = (type)pred->val; \
132    int match = 0; \
133                                    \
134    switch (pred->op) { \
135    case OP_LT: \
136        match = (*addr < val); \
137        break; \
138    case OP_LE: \
139        match = (*addr <= val); \
140        break; \
141    case OP_GT: \
142        match = (*addr > val); \
143        break; \
144    case OP_GE: \
145        match = (*addr >= val); \
146        break; \
147    default: \
148        break; \
149    } \
150                                    \
151    return match; \
152}
153
154#define DEFINE_EQUALITY_PRED(size) \
155static int filter_pred_##size(struct filter_pred *pred, void *event, \
156                  int val1, int val2) \
157{ \
158    u##size *addr = (u##size *)(event + pred->offset); \
159    u##size val = (u##size)pred->val; \
160    int match; \
161                                    \
162    match = (val == *addr) ^ pred->not; \
163                                    \
164    return match; \
165}
166
167DEFINE_COMPARISON_PRED(s64);
168DEFINE_COMPARISON_PRED(u64);
169DEFINE_COMPARISON_PRED(s32);
170DEFINE_COMPARISON_PRED(u32);
171DEFINE_COMPARISON_PRED(s16);
172DEFINE_COMPARISON_PRED(u16);
173DEFINE_COMPARISON_PRED(s8);
174DEFINE_COMPARISON_PRED(u8);
175
176DEFINE_EQUALITY_PRED(64);
177DEFINE_EQUALITY_PRED(32);
178DEFINE_EQUALITY_PRED(16);
179DEFINE_EQUALITY_PRED(8);
180
181static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
182               void *event __attribute((unused)),
183               int val1, int val2)
184{
185    return val1 && val2;
186}
187
188static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
189              void *event __attribute((unused)),
190              int val1, int val2)
191{
192    return val1 || val2;
193}
194
195/* Filter predicate for fixed sized arrays of characters */
196static int filter_pred_string(struct filter_pred *pred, void *event,
197                  int val1, int val2)
198{
199    char *addr = (char *)(event + pred->offset);
200    int cmp, match;
201
202    cmp = pred->regex.match(addr, &pred->regex, pred->regex.field_len);
203
204    match = cmp ^ pred->not;
205
206    return match;
207}
208
209/* Filter predicate for char * pointers */
210static int filter_pred_pchar(struct filter_pred *pred, void *event,
211                 int val1, int val2)
212{
213    char **addr = (char **)(event + pred->offset);
214    int cmp, match;
215    int len = strlen(*addr) + 1; /* including tailing '\0' */
216
217    cmp = pred->regex.match(*addr, &pred->regex, len);
218
219    match = cmp ^ pred->not;
220
221    return match;
222}
223
224/*
225 * Filter predicate for dynamic sized arrays of characters.
226 * These are implemented through a list of strings at the end
227 * of the entry.
228 * Also each of these strings have a field in the entry which
229 * contains its offset from the beginning of the entry.
230 * We have then first to get this field, dereference it
231 * and add it to the address of the entry, and at last we have
232 * the address of the string.
233 */
234static int filter_pred_strloc(struct filter_pred *pred, void *event,
235                  int val1, int val2)
236{
237    u32 str_item = *(u32 *)(event + pred->offset);
238    int str_loc = str_item & 0xffff;
239    int str_len = str_item >> 16;
240    char *addr = (char *)(event + str_loc);
241    int cmp, match;
242
243    cmp = pred->regex.match(addr, &pred->regex, str_len);
244
245    match = cmp ^ pred->not;
246
247    return match;
248}
249
250static int filter_pred_none(struct filter_pred *pred, void *event,
251                int val1, int val2)
252{
253    return 0;
254}
255
256/*
257 * regex_match_foo - Basic regex callbacks
258 *
259 * @str: the string to be searched
260 * @r: the regex structure containing the pattern string
261 * @len: the length of the string to be searched (including '\0')
262 *
263 * Note:
264 * - @str might not be NULL-terminated if it's of type DYN_STRING
265 * or STATIC_STRING
266 */
267
268static int regex_match_full(char *str, struct regex *r, int len)
269{
270    if (strncmp(str, r->pattern, len) == 0)
271        return 1;
272    return 0;
273}
274
275static int regex_match_front(char *str, struct regex *r, int len)
276{
277    if (strncmp(str, r->pattern, r->len) == 0)
278        return 1;
279    return 0;
280}
281
282static int regex_match_middle(char *str, struct regex *r, int len)
283{
284    if (strnstr(str, r->pattern, len))
285        return 1;
286    return 0;
287}
288
289static int regex_match_end(char *str, struct regex *r, int len)
290{
291    int strlen = len - 1;
292
293    if (strlen >= r->len &&
294        memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
295        return 1;
296    return 0;
297}
298
299/**
300 * filter_parse_regex - parse a basic regex
301 * @buff: the raw regex
302 * @len: length of the regex
303 * @search: will point to the beginning of the string to compare
304 * @not: tell whether the match will have to be inverted
305 *
306 * This passes in a buffer containing a regex and this function will
307 * set search to point to the search part of the buffer and
308 * return the type of search it is (see enum above).
309 * This does modify buff.
310 *
311 * Returns enum type.
312 * search returns the pointer to use for comparison.
313 * not returns 1 if buff started with a '!'
314 * 0 otherwise.
315 */
316enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not)
317{
318    int type = MATCH_FULL;
319    int i;
320
321    if (buff[0] == '!') {
322        *not = 1;
323        buff++;
324        len--;
325    } else
326        *not = 0;
327
328    *search = buff;
329
330    for (i = 0; i < len; i++) {
331        if (buff[i] == '*') {
332            if (!i) {
333                *search = buff + 1;
334                type = MATCH_END_ONLY;
335            } else {
336                if (type == MATCH_END_ONLY)
337                    type = MATCH_MIDDLE_ONLY;
338                else
339                    type = MATCH_FRONT_ONLY;
340                buff[i] = 0;
341                break;
342            }
343        }
344    }
345
346    return type;
347}
348
349static void filter_build_regex(struct filter_pred *pred)
350{
351    struct regex *r = &pred->regex;
352    char *search;
353    enum regex_type type = MATCH_FULL;
354    int not = 0;
355
356    if (pred->op == OP_GLOB) {
357        type = filter_parse_regex(r->pattern, r->len, &search, &not);
358        r->len = strlen(search);
359        memmove(r->pattern, search, r->len+1);
360    }
361
362    switch (type) {
363    case MATCH_FULL:
364        r->match = regex_match_full;
365        break;
366    case MATCH_FRONT_ONLY:
367        r->match = regex_match_front;
368        break;
369    case MATCH_MIDDLE_ONLY:
370        r->match = regex_match_middle;
371        break;
372    case MATCH_END_ONLY:
373        r->match = regex_match_end;
374        break;
375    }
376
377    pred->not ^= not;
378}
379
380/* return 1 if event matches, 0 otherwise (discard) */
381int filter_match_preds(struct event_filter *filter, void *rec)
382{
383    int match, top = 0, val1 = 0, val2 = 0;
384    int stack[MAX_FILTER_PRED];
385    struct filter_pred *pred;
386    int i;
387
388    for (i = 0; i < filter->n_preds; i++) {
389        pred = filter->preds[i];
390        if (!pred->pop_n) {
391            match = pred->fn(pred, rec, val1, val2);
392            stack[top++] = match;
393            continue;
394        }
395        if (pred->pop_n > top) {
396            WARN_ON_ONCE(1);
397            return 0;
398        }
399        val1 = stack[--top];
400        val2 = stack[--top];
401        match = pred->fn(pred, rec, val1, val2);
402        stack[top++] = match;
403    }
404
405    return stack[--top];
406}
407EXPORT_SYMBOL_GPL(filter_match_preds);
408
409static void parse_error(struct filter_parse_state *ps, int err, int pos)
410{
411    ps->lasterr = err;
412    ps->lasterr_pos = pos;
413}
414
415static void remove_filter_string(struct event_filter *filter)
416{
417    kfree(filter->filter_string);
418    filter->filter_string = NULL;
419}
420
421static int replace_filter_string(struct event_filter *filter,
422                 char *filter_string)
423{
424    kfree(filter->filter_string);
425    filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
426    if (!filter->filter_string)
427        return -ENOMEM;
428
429    return 0;
430}
431
432static int append_filter_string(struct event_filter *filter,
433                char *string)
434{
435    int newlen;
436    char *new_filter_string;
437
438    BUG_ON(!filter->filter_string);
439    newlen = strlen(filter->filter_string) + strlen(string) + 1;
440    new_filter_string = kmalloc(newlen, GFP_KERNEL);
441    if (!new_filter_string)
442        return -ENOMEM;
443
444    strcpy(new_filter_string, filter->filter_string);
445    strcat(new_filter_string, string);
446    kfree(filter->filter_string);
447    filter->filter_string = new_filter_string;
448
449    return 0;
450}
451
452static void append_filter_err(struct filter_parse_state *ps,
453                  struct event_filter *filter)
454{
455    int pos = ps->lasterr_pos;
456    char *buf, *pbuf;
457
458    buf = (char *)__get_free_page(GFP_TEMPORARY);
459    if (!buf)
460        return;
461
462    append_filter_string(filter, "\n");
463    memset(buf, ' ', PAGE_SIZE);
464    if (pos > PAGE_SIZE - 128)
465        pos = 0;
466    buf[pos] = '^';
467    pbuf = &buf[pos] + 1;
468
469    sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
470    append_filter_string(filter, buf);
471    free_page((unsigned long) buf);
472}
473
474void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
475{
476    struct event_filter *filter = call->filter;
477
478    mutex_lock(&event_mutex);
479    if (filter && filter->filter_string)
480        trace_seq_printf(s, "%s\n", filter->filter_string);
481    else
482        trace_seq_printf(s, "none\n");
483    mutex_unlock(&event_mutex);
484}
485
486void print_subsystem_event_filter(struct event_subsystem *system,
487                  struct trace_seq *s)
488{
489    struct event_filter *filter = system->filter;
490
491    mutex_lock(&event_mutex);
492    if (filter && filter->filter_string)
493        trace_seq_printf(s, "%s\n", filter->filter_string);
494    else
495        trace_seq_printf(s, "none\n");
496    mutex_unlock(&event_mutex);
497}
498
499static struct ftrace_event_field *
500__find_event_field(struct list_head *head, char *name)
501{
502    struct ftrace_event_field *field;
503
504    list_for_each_entry(field, head, link) {
505        if (!strcmp(field->name, name))
506            return field;
507    }
508
509    return NULL;
510}
511
512static struct ftrace_event_field *
513find_event_field(struct ftrace_event_call *call, char *name)
514{
515    struct ftrace_event_field *field;
516    struct list_head *head;
517
518    field = __find_event_field(&ftrace_common_fields, name);
519    if (field)
520        return field;
521
522    head = trace_get_fields(call);
523    return __find_event_field(head, name);
524}
525
526static void filter_free_pred(struct filter_pred *pred)
527{
528    if (!pred)
529        return;
530
531    kfree(pred->field_name);
532    kfree(pred);
533}
534
535static void filter_clear_pred(struct filter_pred *pred)
536{
537    kfree(pred->field_name);
538    pred->field_name = NULL;
539    pred->regex.len = 0;
540}
541
542static int filter_set_pred(struct filter_pred *dest,
543               struct filter_pred *src,
544               filter_pred_fn_t fn)
545{
546    *dest = *src;
547    if (src->field_name) {
548        dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
549        if (!dest->field_name)
550            return -ENOMEM;
551    }
552    dest->fn = fn;
553
554    return 0;
555}
556
557static void filter_disable_preds(struct ftrace_event_call *call)
558{
559    struct event_filter *filter = call->filter;
560    int i;
561
562    call->flags &= ~TRACE_EVENT_FL_FILTERED;
563    filter->n_preds = 0;
564
565    for (i = 0; i < MAX_FILTER_PRED; i++)
566        filter->preds[i]->fn = filter_pred_none;
567}
568
569static void __free_preds(struct event_filter *filter)
570{
571    int i;
572
573    if (!filter)
574        return;
575
576    for (i = 0; i < MAX_FILTER_PRED; i++) {
577        if (filter->preds[i])
578            filter_free_pred(filter->preds[i]);
579    }
580    kfree(filter->preds);
581    kfree(filter->filter_string);
582    kfree(filter);
583}
584
585void destroy_preds(struct ftrace_event_call *call)
586{
587    __free_preds(call->filter);
588    call->filter = NULL;
589    call->flags &= ~TRACE_EVENT_FL_FILTERED;
590}
591
592static struct event_filter *__alloc_preds(void)
593{
594    struct event_filter *filter;
595    struct filter_pred *pred;
596    int i;
597
598    filter = kzalloc(sizeof(*filter), GFP_KERNEL);
599    if (!filter)
600        return ERR_PTR(-ENOMEM);
601
602    filter->n_preds = 0;
603
604    filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
605    if (!filter->preds)
606        goto oom;
607
608    for (i = 0; i < MAX_FILTER_PRED; i++) {
609        pred = kzalloc(sizeof(*pred), GFP_KERNEL);
610        if (!pred)
611            goto oom;
612        pred->fn = filter_pred_none;
613        filter->preds[i] = pred;
614    }
615
616    return filter;
617
618oom:
619    __free_preds(filter);
620    return ERR_PTR(-ENOMEM);
621}
622
623static int init_preds(struct ftrace_event_call *call)
624{
625    if (call->filter)
626        return 0;
627
628    call->flags &= ~TRACE_EVENT_FL_FILTERED;
629    call->filter = __alloc_preds();
630    if (IS_ERR(call->filter))
631        return PTR_ERR(call->filter);
632
633    return 0;
634}
635
636static int init_subsystem_preds(struct event_subsystem *system)
637{
638    struct ftrace_event_call *call;
639    int err;
640
641    list_for_each_entry(call, &ftrace_events, list) {
642        if (strcmp(call->class->system, system->name) != 0)
643            continue;
644
645        err = init_preds(call);
646        if (err)
647            return err;
648    }
649
650    return 0;
651}
652
653static void filter_free_subsystem_preds(struct event_subsystem *system)
654{
655    struct ftrace_event_call *call;
656
657    list_for_each_entry(call, &ftrace_events, list) {
658        if (strcmp(call->class->system, system->name) != 0)
659            continue;
660
661        filter_disable_preds(call);
662        remove_filter_string(call->filter);
663    }
664}
665
666static int filter_add_pred_fn(struct filter_parse_state *ps,
667                  struct ftrace_event_call *call,
668                  struct event_filter *filter,
669                  struct filter_pred *pred,
670                  filter_pred_fn_t fn)
671{
672    int idx, err;
673
674    if (filter->n_preds == MAX_FILTER_PRED) {
675        parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
676        return -ENOSPC;
677    }
678
679    idx = filter->n_preds;
680    filter_clear_pred(filter->preds[idx]);
681    err = filter_set_pred(filter->preds[idx], pred, fn);
682    if (err)
683        return err;
684
685    filter->n_preds++;
686
687    return 0;
688}
689
690int filter_assign_type(const char *type)
691{
692    if (strstr(type, "__data_loc") && strstr(type, "char"))
693        return FILTER_DYN_STRING;
694
695    if (strchr(type, '[') && strstr(type, "char"))
696        return FILTER_STATIC_STRING;
697
698    return FILTER_OTHER;
699}
700
701static bool is_string_field(struct ftrace_event_field *field)
702{
703    return field->filter_type == FILTER_DYN_STRING ||
704           field->filter_type == FILTER_STATIC_STRING ||
705           field->filter_type == FILTER_PTR_STRING;
706}
707
708static int is_legal_op(struct ftrace_event_field *field, int op)
709{
710    if (is_string_field(field) &&
711        (op != OP_EQ && op != OP_NE && op != OP_GLOB))
712        return 0;
713    if (!is_string_field(field) && op == OP_GLOB)
714        return 0;
715
716    return 1;
717}
718
719static filter_pred_fn_t select_comparison_fn(int op, int field_size,
720                         int field_is_signed)
721{
722    filter_pred_fn_t fn = NULL;
723
724    switch (field_size) {
725    case 8:
726        if (op == OP_EQ || op == OP_NE)
727            fn = filter_pred_64;
728        else if (field_is_signed)
729            fn = filter_pred_s64;
730        else
731            fn = filter_pred_u64;
732        break;
733    case 4:
734        if (op == OP_EQ || op == OP_NE)
735            fn = filter_pred_32;
736        else if (field_is_signed)
737            fn = filter_pred_s32;
738        else
739            fn = filter_pred_u32;
740        break;
741    case 2:
742        if (op == OP_EQ || op == OP_NE)
743            fn = filter_pred_16;
744        else if (field_is_signed)
745            fn = filter_pred_s16;
746        else
747            fn = filter_pred_u16;
748        break;
749    case 1:
750        if (op == OP_EQ || op == OP_NE)
751            fn = filter_pred_8;
752        else if (field_is_signed)
753            fn = filter_pred_s8;
754        else
755            fn = filter_pred_u8;
756        break;
757    }
758
759    return fn;
760}
761
762static int filter_add_pred(struct filter_parse_state *ps,
763               struct ftrace_event_call *call,
764               struct event_filter *filter,
765               struct filter_pred *pred,
766               bool dry_run)
767{
768    struct ftrace_event_field *field;
769    filter_pred_fn_t fn;
770    unsigned long long val;
771    int ret;
772
773    pred->fn = filter_pred_none;
774
775    if (pred->op == OP_AND) {
776        pred->pop_n = 2;
777        fn = filter_pred_and;
778        goto add_pred_fn;
779    } else if (pred->op == OP_OR) {
780        pred->pop_n = 2;
781        fn = filter_pred_or;
782        goto add_pred_fn;
783    }
784
785    field = find_event_field(call, pred->field_name);
786    if (!field) {
787        parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
788        return -EINVAL;
789    }
790
791    pred->offset = field->offset;
792
793    if (!is_legal_op(field, pred->op)) {
794        parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
795        return -EINVAL;
796    }
797
798    if (is_string_field(field)) {
799        filter_build_regex(pred);
800
801        if (field->filter_type == FILTER_STATIC_STRING) {
802            fn = filter_pred_string;
803            pred->regex.field_len = field->size;
804        } else if (field->filter_type == FILTER_DYN_STRING)
805            fn = filter_pred_strloc;
806        else
807            fn = filter_pred_pchar;
808    } else {
809        if (field->is_signed)
810            ret = strict_strtoll(pred->regex.pattern, 0, &val);
811        else
812            ret = strict_strtoull(pred->regex.pattern, 0, &val);
813        if (ret) {
814            parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
815            return -EINVAL;
816        }
817        pred->val = val;
818
819        fn = select_comparison_fn(pred->op, field->size,
820                      field->is_signed);
821        if (!fn) {
822            parse_error(ps, FILT_ERR_INVALID_OP, 0);
823            return -EINVAL;
824        }
825    }
826
827    if (pred->op == OP_NE)
828        pred->not = 1;
829
830add_pred_fn:
831    if (!dry_run)
832        return filter_add_pred_fn(ps, call, filter, pred, fn);
833    return 0;
834}
835
836static void parse_init(struct filter_parse_state *ps,
837               struct filter_op *ops,
838               char *infix_string)
839{
840    memset(ps, '\0', sizeof(*ps));
841
842    ps->infix.string = infix_string;
843    ps->infix.cnt = strlen(infix_string);
844    ps->ops = ops;
845
846    INIT_LIST_HEAD(&ps->opstack);
847    INIT_LIST_HEAD(&ps->postfix);
848}
849
850static char infix_next(struct filter_parse_state *ps)
851{
852    ps->infix.cnt--;
853
854    return ps->infix.string[ps->infix.tail++];
855}
856
857static char infix_peek(struct filter_parse_state *ps)
858{
859    if (ps->infix.tail == strlen(ps->infix.string))
860        return 0;
861
862    return ps->infix.string[ps->infix.tail];
863}
864
865static void infix_advance(struct filter_parse_state *ps)
866{
867    ps->infix.cnt--;
868    ps->infix.tail++;
869}
870
871static inline int is_precedence_lower(struct filter_parse_state *ps,
872                      int a, int b)
873{
874    return ps->ops[a].precedence < ps->ops[b].precedence;
875}
876
877static inline int is_op_char(struct filter_parse_state *ps, char c)
878{
879    int i;
880
881    for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
882        if (ps->ops[i].string[0] == c)
883            return 1;
884    }
885
886    return 0;
887}
888
889static int infix_get_op(struct filter_parse_state *ps, char firstc)
890{
891    char nextc = infix_peek(ps);
892    char opstr[3];
893    int i;
894
895    opstr[0] = firstc;
896    opstr[1] = nextc;
897    opstr[2] = '\0';
898
899    for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
900        if (!strcmp(opstr, ps->ops[i].string)) {
901            infix_advance(ps);
902            return ps->ops[i].id;
903        }
904    }
905
906    opstr[1] = '\0';
907
908    for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
909        if (!strcmp(opstr, ps->ops[i].string))
910            return ps->ops[i].id;
911    }
912
913    return OP_NONE;
914}
915
916static inline void clear_operand_string(struct filter_parse_state *ps)
917{
918    memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
919    ps->operand.tail = 0;
920}
921
922static inline int append_operand_char(struct filter_parse_state *ps, char c)
923{
924    if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
925        return -EINVAL;
926
927    ps->operand.string[ps->operand.tail++] = c;
928
929    return 0;
930}
931
932static int filter_opstack_push(struct filter_parse_state *ps, int op)
933{
934    struct opstack_op *opstack_op;
935
936    opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
937    if (!opstack_op)
938        return -ENOMEM;
939
940    opstack_op->op = op;
941    list_add(&opstack_op->list, &ps->opstack);
942
943    return 0;
944}
945
946static int filter_opstack_empty(struct filter_parse_state *ps)
947{
948    return list_empty(&ps->opstack);
949}
950
951static int filter_opstack_top(struct filter_parse_state *ps)
952{
953    struct opstack_op *opstack_op;
954
955    if (filter_opstack_empty(ps))
956        return OP_NONE;
957
958    opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
959
960    return opstack_op->op;
961}
962
963static int filter_opstack_pop(struct filter_parse_state *ps)
964{
965    struct opstack_op *opstack_op;
966    int op;
967
968    if (filter_opstack_empty(ps))
969        return OP_NONE;
970
971    opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
972    op = opstack_op->op;
973    list_del(&opstack_op->list);
974
975    kfree(opstack_op);
976
977    return op;
978}
979
980static void filter_opstack_clear(struct filter_parse_state *ps)
981{
982    while (!filter_opstack_empty(ps))
983        filter_opstack_pop(ps);
984}
985
986static char *curr_operand(struct filter_parse_state *ps)
987{
988    return ps->operand.string;
989}
990
991static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
992{
993    struct postfix_elt *elt;
994
995    elt = kmalloc(sizeof(*elt), GFP_KERNEL);
996    if (!elt)
997        return -ENOMEM;
998
999    elt->op = OP_NONE;
1000    elt->operand = kstrdup(operand, GFP_KERNEL);
1001    if (!elt->operand) {
1002        kfree(elt);
1003        return -ENOMEM;
1004    }
1005
1006    list_add_tail(&elt->list, &ps->postfix);
1007
1008    return 0;
1009}
1010
1011static int postfix_append_op(struct filter_parse_state *ps, int op)
1012{
1013    struct postfix_elt *elt;
1014
1015    elt = kmalloc(sizeof(*elt), GFP_KERNEL);
1016    if (!elt)
1017        return -ENOMEM;
1018
1019    elt->op = op;
1020    elt->operand = NULL;
1021
1022    list_add_tail(&elt->list, &ps->postfix);
1023
1024    return 0;
1025}
1026
1027static void postfix_clear(struct filter_parse_state *ps)
1028{
1029    struct postfix_elt *elt;
1030
1031    while (!list_empty(&ps->postfix)) {
1032        elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
1033        list_del(&elt->list);
1034        kfree(elt->operand);
1035        kfree(elt);
1036    }
1037}
1038
1039static int filter_parse(struct filter_parse_state *ps)
1040{
1041    int in_string = 0;
1042    int op, top_op;
1043    char ch;
1044
1045    while ((ch = infix_next(ps))) {
1046        if (ch == '"') {
1047            in_string ^= 1;
1048            continue;
1049        }
1050
1051        if (in_string)
1052            goto parse_operand;
1053
1054        if (isspace(ch))
1055            continue;
1056
1057        if (is_op_char(ps, ch)) {
1058            op = infix_get_op(ps, ch);
1059            if (op == OP_NONE) {
1060                parse_error(ps, FILT_ERR_INVALID_OP, 0);
1061                return -EINVAL;
1062            }
1063
1064            if (strlen(curr_operand(ps))) {
1065                postfix_append_operand(ps, curr_operand(ps));
1066                clear_operand_string(ps);
1067            }
1068
1069            while (!filter_opstack_empty(ps)) {
1070                top_op = filter_opstack_top(ps);
1071                if (!is_precedence_lower(ps, top_op, op)) {
1072                    top_op = filter_opstack_pop(ps);
1073                    postfix_append_op(ps, top_op);
1074                    continue;
1075                }
1076                break;
1077            }
1078
1079            filter_opstack_push(ps, op);
1080            continue;
1081        }
1082
1083        if (ch == '(') {
1084            filter_opstack_push(ps, OP_OPEN_PAREN);
1085            continue;
1086        }
1087
1088        if (ch == ')') {
1089            if (strlen(curr_operand(ps))) {
1090                postfix_append_operand(ps, curr_operand(ps));
1091                clear_operand_string(ps);
1092            }
1093
1094            top_op = filter_opstack_pop(ps);
1095            while (top_op != OP_NONE) {
1096                if (top_op == OP_OPEN_PAREN)
1097                    break;
1098                postfix_append_op(ps, top_op);
1099                top_op = filter_opstack_pop(ps);
1100            }
1101            if (top_op == OP_NONE) {
1102                parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1103                return -EINVAL;
1104            }
1105            continue;
1106        }
1107parse_operand:
1108        if (append_operand_char(ps, ch)) {
1109            parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
1110            return -EINVAL;
1111        }
1112    }
1113
1114    if (strlen(curr_operand(ps)))
1115        postfix_append_operand(ps, curr_operand(ps));
1116
1117    while (!filter_opstack_empty(ps)) {
1118        top_op = filter_opstack_pop(ps);
1119        if (top_op == OP_NONE)
1120            break;
1121        if (top_op == OP_OPEN_PAREN) {
1122            parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
1123            return -EINVAL;
1124        }
1125        postfix_append_op(ps, top_op);
1126    }
1127
1128    return 0;
1129}
1130
1131static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
1132{
1133    struct filter_pred *pred;
1134
1135    pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1136    if (!pred)
1137        return NULL;
1138
1139    pred->field_name = kstrdup(operand1, GFP_KERNEL);
1140    if (!pred->field_name) {
1141        kfree(pred);
1142        return NULL;
1143    }
1144
1145    strcpy(pred->regex.pattern, operand2);
1146    pred->regex.len = strlen(pred->regex.pattern);
1147
1148    pred->op = op;
1149
1150    return pred;
1151}
1152
1153static struct filter_pred *create_logical_pred(int op)
1154{
1155    struct filter_pred *pred;
1156
1157    pred = kzalloc(sizeof(*pred), GFP_KERNEL);
1158    if (!pred)
1159        return NULL;
1160
1161    pred->op = op;
1162
1163    return pred;
1164}
1165
1166static int check_preds(struct filter_parse_state *ps)
1167{
1168    int n_normal_preds = 0, n_logical_preds = 0;
1169    struct postfix_elt *elt;
1170
1171    list_for_each_entry(elt, &ps->postfix, list) {
1172        if (elt->op == OP_NONE)
1173            continue;
1174
1175        if (elt->op == OP_AND || elt->op == OP_OR) {
1176            n_logical_preds++;
1177            continue;
1178        }
1179        n_normal_preds++;
1180    }
1181
1182    if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
1183        parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
1184        return -EINVAL;
1185    }
1186
1187    return 0;
1188}
1189
1190static int replace_preds(struct ftrace_event_call *call,
1191             struct event_filter *filter,
1192             struct filter_parse_state *ps,
1193             char *filter_string,
1194             bool dry_run)
1195{
1196    char *operand1 = NULL, *operand2 = NULL;
1197    struct filter_pred *pred;
1198    struct postfix_elt *elt;
1199    int err;
1200    int n_preds = 0;
1201
1202    err = check_preds(ps);
1203    if (err)
1204        return err;
1205
1206    list_for_each_entry(elt, &ps->postfix, list) {
1207        if (elt->op == OP_NONE) {
1208            if (!operand1)
1209                operand1 = elt->operand;
1210            else if (!operand2)
1211                operand2 = elt->operand;
1212            else {
1213                parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1214                return -EINVAL;
1215            }
1216            continue;
1217        }
1218
1219        if (n_preds++ == MAX_FILTER_PRED) {
1220            parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
1221            return -ENOSPC;
1222        }
1223
1224        if (elt->op == OP_AND || elt->op == OP_OR) {
1225            pred = create_logical_pred(elt->op);
1226            goto add_pred;
1227        }
1228
1229        if (!operand1 || !operand2) {
1230            parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1231            return -EINVAL;
1232        }
1233
1234        pred = create_pred(elt->op, operand1, operand2);
1235add_pred:
1236        if (!pred)
1237            return -ENOMEM;
1238        err = filter_add_pred(ps, call, filter, pred, dry_run);
1239        filter_free_pred(pred);
1240        if (err)
1241            return err;
1242
1243        operand1 = operand2 = NULL;
1244    }
1245
1246    return 0;
1247}
1248
1249static int replace_system_preds(struct event_subsystem *system,
1250                struct filter_parse_state *ps,
1251                char *filter_string)
1252{
1253    struct ftrace_event_call *call;
1254    bool fail = true;
1255    int err;
1256
1257    list_for_each_entry(call, &ftrace_events, list) {
1258        struct event_filter *filter = call->filter;
1259
1260        if (strcmp(call->class->system, system->name) != 0)
1261            continue;
1262
1263        /* try to see if the filter can be applied */
1264        err = replace_preds(call, filter, ps, filter_string, true);
1265        if (err)
1266            continue;
1267
1268        /* really apply the filter */
1269        filter_disable_preds(call);
1270        err = replace_preds(call, filter, ps, filter_string, false);
1271        if (err)
1272            filter_disable_preds(call);
1273        else {
1274            call->flags |= TRACE_EVENT_FL_FILTERED;
1275            replace_filter_string(filter, filter_string);
1276        }
1277        fail = false;
1278    }
1279
1280    if (fail) {
1281        parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
1282        return -EINVAL;
1283    }
1284    return 0;
1285}
1286
1287int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1288{
1289    int err;
1290    struct filter_parse_state *ps;
1291
1292    mutex_lock(&event_mutex);
1293
1294    err = init_preds(call);
1295    if (err)
1296        goto out_unlock;
1297
1298    if (!strcmp(strstrip(filter_string), "0")) {
1299        filter_disable_preds(call);
1300        remove_filter_string(call->filter);
1301        goto out_unlock;
1302    }
1303
1304    err = -ENOMEM;
1305    ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1306    if (!ps)
1307        goto out_unlock;
1308
1309    filter_disable_preds(call);
1310    replace_filter_string(call->filter, filter_string);
1311
1312    parse_init(ps, filter_ops, filter_string);
1313    err = filter_parse(ps);
1314    if (err) {
1315        append_filter_err(ps, call->filter);
1316        goto out;
1317    }
1318
1319    err = replace_preds(call, call->filter, ps, filter_string, false);
1320    if (err)
1321        append_filter_err(ps, call->filter);
1322    else
1323        call->flags |= TRACE_EVENT_FL_FILTERED;
1324out:
1325    filter_opstack_clear(ps);
1326    postfix_clear(ps);
1327    kfree(ps);
1328out_unlock:
1329    mutex_unlock(&event_mutex);
1330
1331    return err;
1332}
1333
1334int apply_subsystem_event_filter(struct event_subsystem *system,
1335                 char *filter_string)
1336{
1337    int err;
1338    struct filter_parse_state *ps;
1339
1340    mutex_lock(&event_mutex);
1341
1342    err = init_subsystem_preds(system);
1343    if (err)
1344        goto out_unlock;
1345
1346    if (!strcmp(strstrip(filter_string), "0")) {
1347        filter_free_subsystem_preds(system);
1348        remove_filter_string(system->filter);
1349        goto out_unlock;
1350    }
1351
1352    err = -ENOMEM;
1353    ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1354    if (!ps)
1355        goto out_unlock;
1356
1357    replace_filter_string(system->filter, filter_string);
1358
1359    parse_init(ps, filter_ops, filter_string);
1360    err = filter_parse(ps);
1361    if (err) {
1362        append_filter_err(ps, system->filter);
1363        goto out;
1364    }
1365
1366    err = replace_system_preds(system, ps, filter_string);
1367    if (err)
1368        append_filter_err(ps, system->filter);
1369
1370out:
1371    filter_opstack_clear(ps);
1372    postfix_clear(ps);
1373    kfree(ps);
1374out_unlock:
1375    mutex_unlock(&event_mutex);
1376
1377    return err;
1378}
1379
1380#ifdef CONFIG_PERF_EVENTS
1381
1382void ftrace_profile_free_filter(struct perf_event *event)
1383{
1384    struct event_filter *filter = event->filter;
1385
1386    event->filter = NULL;
1387    __free_preds(filter);
1388}
1389
1390int ftrace_profile_set_filter(struct perf_event *event, int event_id,
1391                  char *filter_str)
1392{
1393    int err;
1394    struct event_filter *filter;
1395    struct filter_parse_state *ps;
1396    struct ftrace_event_call *call = NULL;
1397
1398    mutex_lock(&event_mutex);
1399
1400    list_for_each_entry(call, &ftrace_events, list) {
1401        if (call->event.type == event_id)
1402            break;
1403    }
1404
1405    err = -EINVAL;
1406    if (&call->list == &ftrace_events)
1407        goto out_unlock;
1408
1409    err = -EEXIST;
1410    if (event->filter)
1411        goto out_unlock;
1412
1413    filter = __alloc_preds();
1414    if (IS_ERR(filter)) {
1415        err = PTR_ERR(filter);
1416        goto out_unlock;
1417    }
1418
1419    err = -ENOMEM;
1420    ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1421    if (!ps)
1422        goto free_preds;
1423
1424    parse_init(ps, filter_ops, filter_str);
1425    err = filter_parse(ps);
1426    if (err)
1427        goto free_ps;
1428
1429    err = replace_preds(call, filter, ps, filter_str, false);
1430    if (!err)
1431        event->filter = filter;
1432
1433free_ps:
1434    filter_opstack_clear(ps);
1435    postfix_clear(ps);
1436    kfree(ps);
1437
1438free_preds:
1439    if (err)
1440        __free_preds(filter);
1441
1442out_unlock:
1443    mutex_unlock(&event_mutex);
1444
1445    return err;
1446}
1447
1448#endif /* CONFIG_PERF_EVENTS */
1449
1450

Archive Download this file



interactive