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