diff options
| author | Jiri Olsa <jolsa@redhat.com> | 2011-08-11 10:25:46 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2011-08-19 14:35:51 -0400 |
| commit | 9d96cd1743547f07a8a6c51a3f7741cfca0a0bee (patch) | |
| tree | b013bf238a63661eccb7134b0e9631ff09464a47 /kernel/trace | |
| parent | 81570d9caaad46a056580c9af078c5c55e6c764f (diff) | |
tracing/filter: Separate predicate init and filter addition
Making the code cleaner by having one function to fully prepare
the predicate (create_pred), and another to add the predicate to
the filter (filter_add_pred).
As a benefit, this way the dry_run flag stays only inside the
replace_preds function and is not passed deeper.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1313072754-4620-3-git-send-email-jolsa@redhat.com
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 56 |
1 files changed, 23 insertions, 33 deletions
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index cb295a117ee7..61c8dec3b2b7 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -685,8 +685,7 @@ __pop_pred_stack(struct pred_stack *stack) | |||
| 685 | static int filter_set_pred(struct event_filter *filter, | 685 | static int filter_set_pred(struct event_filter *filter, |
| 686 | int idx, | 686 | int idx, |
| 687 | struct pred_stack *stack, | 687 | struct pred_stack *stack, |
| 688 | struct filter_pred *src, | 688 | struct filter_pred *src) |
| 689 | filter_pred_fn_t fn) | ||
| 690 | { | 689 | { |
| 691 | struct filter_pred *dest = &filter->preds[idx]; | 690 | struct filter_pred *dest = &filter->preds[idx]; |
| 692 | struct filter_pred *left; | 691 | struct filter_pred *left; |
| @@ -698,7 +697,6 @@ static int filter_set_pred(struct event_filter *filter, | |||
| 698 | if (!dest->field_name) | 697 | if (!dest->field_name) |
| 699 | return -ENOMEM; | 698 | return -ENOMEM; |
| 700 | } | 699 | } |
| 701 | dest->fn = fn; | ||
| 702 | dest->index = idx; | 700 | dest->index = idx; |
| 703 | 701 | ||
| 704 | if (dest->op == OP_OR || dest->op == OP_AND) { | 702 | if (dest->op == OP_OR || dest->op == OP_AND) { |
| @@ -836,12 +834,10 @@ static void filter_free_subsystem_filters(struct event_subsystem *system) | |||
| 836 | } | 834 | } |
| 837 | } | 835 | } |
| 838 | 836 | ||
| 839 | static int filter_add_pred_fn(struct filter_parse_state *ps, | 837 | static int filter_add_pred(struct filter_parse_state *ps, |
| 840 | struct ftrace_event_call *call, | 838 | struct event_filter *filter, |
| 841 | struct event_filter *filter, | 839 | struct filter_pred *pred, |
| 842 | struct filter_pred *pred, | 840 | struct pred_stack *stack) |
| 843 | struct pred_stack *stack, | ||
| 844 | filter_pred_fn_t fn) | ||
| 845 | { | 841 | { |
| 846 | int idx, err; | 842 | int idx, err; |
| 847 | 843 | ||
| @@ -852,7 +848,7 @@ static int filter_add_pred_fn(struct filter_parse_state *ps, | |||
| 852 | 848 | ||
| 853 | idx = filter->n_preds; | 849 | idx = filter->n_preds; |
| 854 | filter_clear_pred(&filter->preds[idx]); | 850 | filter_clear_pred(&filter->preds[idx]); |
| 855 | err = filter_set_pred(filter, idx, stack, pred, fn); | 851 | err = filter_set_pred(filter, idx, stack, pred); |
| 856 | if (err) | 852 | if (err) |
| 857 | return err; | 853 | return err; |
| 858 | 854 | ||
| @@ -933,25 +929,16 @@ static filter_pred_fn_t select_comparison_fn(int op, int field_size, | |||
| 933 | return fn; | 929 | return fn; |
| 934 | } | 930 | } |
| 935 | 931 | ||
| 936 | static int filter_add_pred(struct filter_parse_state *ps, | 932 | static int init_pred(struct filter_parse_state *ps, |
| 937 | struct ftrace_event_call *call, | 933 | struct ftrace_event_call *call, |
| 938 | struct event_filter *filter, | 934 | struct filter_pred *pred) |
| 939 | struct filter_pred *pred, | 935 | |
| 940 | struct pred_stack *stack, | ||
| 941 | bool dry_run) | ||
| 942 | { | 936 | { |
| 943 | struct ftrace_event_field *field; | 937 | struct ftrace_event_field *field; |
| 944 | filter_pred_fn_t fn; | 938 | filter_pred_fn_t fn = filter_pred_none; |
| 945 | unsigned long long val; | 939 | unsigned long long val; |
| 946 | int ret; | 940 | int ret; |
| 947 | 941 | ||
| 948 | fn = pred->fn = filter_pred_none; | ||
| 949 | |||
| 950 | if (pred->op == OP_AND) | ||
| 951 | goto add_pred_fn; | ||
| 952 | else if (pred->op == OP_OR) | ||
| 953 | goto add_pred_fn; | ||
| 954 | |||
| 955 | field = find_event_field(call, pred->field_name); | 942 | field = find_event_field(call, pred->field_name); |
| 956 | if (!field) { | 943 | if (!field) { |
| 957 | parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0); | 944 | parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0); |
| @@ -997,9 +984,7 @@ static int filter_add_pred(struct filter_parse_state *ps, | |||
| 997 | if (pred->op == OP_NE) | 984 | if (pred->op == OP_NE) |
| 998 | pred->not = 1; | 985 | pred->not = 1; |
| 999 | 986 | ||
| 1000 | add_pred_fn: | 987 | pred->fn = fn; |
| 1001 | if (!dry_run) | ||
| 1002 | return filter_add_pred_fn(ps, call, filter, pred, stack, fn); | ||
| 1003 | return 0; | 988 | return 0; |
| 1004 | } | 989 | } |
| 1005 | 990 | ||
| @@ -1299,6 +1284,7 @@ parse_operand: | |||
| 1299 | } | 1284 | } |
| 1300 | 1285 | ||
| 1301 | static struct filter_pred *create_pred(struct filter_parse_state *ps, | 1286 | static struct filter_pred *create_pred(struct filter_parse_state *ps, |
| 1287 | struct ftrace_event_call *call, | ||
| 1302 | int op, char *operand1, char *operand2) | 1288 | int op, char *operand1, char *operand2) |
| 1303 | { | 1289 | { |
| 1304 | static struct filter_pred pred; | 1290 | static struct filter_pred pred; |
| @@ -1321,7 +1307,7 @@ static struct filter_pred *create_pred(struct filter_parse_state *ps, | |||
| 1321 | strcpy(pred.regex.pattern, operand2); | 1307 | strcpy(pred.regex.pattern, operand2); |
| 1322 | pred.regex.len = strlen(pred.regex.pattern); | 1308 | pred.regex.len = strlen(pred.regex.pattern); |
| 1323 | 1309 | ||
| 1324 | return &pred; | 1310 | return init_pred(ps, call, &pred) ? NULL : &pred; |
| 1325 | } | 1311 | } |
| 1326 | 1312 | ||
| 1327 | static int check_preds(struct filter_parse_state *ps) | 1313 | static int check_preds(struct filter_parse_state *ps) |
| @@ -1630,16 +1616,20 @@ static int replace_preds(struct ftrace_event_call *call, | |||
| 1630 | goto fail; | 1616 | goto fail; |
| 1631 | } | 1617 | } |
| 1632 | 1618 | ||
| 1633 | pred = create_pred(ps, elt->op, operand1, operand2); | 1619 | pred = create_pred(ps, call, elt->op, operand1, operand2); |
| 1634 | if (!pred) { | 1620 | if (!pred) { |
| 1635 | err = -ENOMEM; | 1621 | err = -ENOMEM; |
| 1636 | goto fail; | 1622 | goto fail; |
| 1637 | } | 1623 | } |
| 1638 | err = filter_add_pred(ps, call, filter, pred, &stack, dry_run); | 1624 | if (!dry_run) { |
| 1639 | filter_free_pred(pred); | 1625 | err = filter_add_pred(ps, filter, pred, &stack); |
| 1640 | if (err) | 1626 | if (err) { |
| 1641 | goto fail; | 1627 | filter_free_pred(pred); |
| 1628 | goto fail; | ||
| 1629 | } | ||
| 1630 | } | ||
| 1642 | 1631 | ||
| 1632 | filter_free_pred(pred); | ||
| 1643 | operand1 = operand2 = NULL; | 1633 | operand1 = operand2 = NULL; |
| 1644 | } | 1634 | } |
| 1645 | 1635 | ||
