diff options
Diffstat (limited to 'kernel/trace/trace.h')
-rw-r--r-- | kernel/trace/trace.h | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 866d0108fd2f..7736fe8c1b76 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -735,6 +735,7 @@ struct ftrace_event_field { | |||
735 | struct event_filter { | 735 | struct event_filter { |
736 | int n_preds; | 736 | int n_preds; |
737 | struct filter_pred **preds; | 737 | struct filter_pred **preds; |
738 | char *filter_string; | ||
738 | }; | 739 | }; |
739 | 740 | ||
740 | struct event_subsystem { | 741 | struct event_subsystem { |
@@ -746,7 +747,8 @@ struct event_subsystem { | |||
746 | 747 | ||
747 | struct filter_pred; | 748 | struct filter_pred; |
748 | 749 | ||
749 | typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event); | 750 | typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event, |
751 | int val1, int val2); | ||
750 | 752 | ||
751 | struct filter_pred { | 753 | struct filter_pred { |
752 | filter_pred_fn_t fn; | 754 | filter_pred_fn_t fn; |
@@ -756,23 +758,18 @@ struct filter_pred { | |||
756 | char *field_name; | 758 | char *field_name; |
757 | int offset; | 759 | int offset; |
758 | int not; | 760 | int not; |
759 | int or; | 761 | int op; |
760 | int compound; | 762 | int pop_n; |
761 | int clear; | ||
762 | }; | 763 | }; |
763 | 764 | ||
764 | extern void filter_free_pred(struct filter_pred *pred); | 765 | extern void print_event_filter(struct ftrace_event_call *call, |
765 | extern void filter_print_preds(struct ftrace_event_call *call, | ||
766 | struct trace_seq *s); | 766 | struct trace_seq *s); |
767 | extern int filter_parse(char **pbuf, struct filter_pred *pred); | 767 | extern int apply_event_filter(struct ftrace_event_call *call, |
768 | extern int filter_add_pred(struct ftrace_event_call *call, | 768 | char *filter_string); |
769 | struct filter_pred *pred); | 769 | extern int apply_subsystem_event_filter(struct event_subsystem *system, |
770 | extern void filter_disable_preds(struct ftrace_event_call *call); | 770 | char *filter_string); |
771 | extern void filter_free_subsystem_preds(struct event_subsystem *system); | 771 | extern void print_subsystem_event_filter(struct event_subsystem *system, |
772 | extern void filter_print_subsystem_preds(struct event_subsystem *system, | ||
773 | struct trace_seq *s); | 772 | struct trace_seq *s); |
774 | extern int filter_add_subsystem_pred(struct event_subsystem *system, | ||
775 | struct filter_pred *pred); | ||
776 | 773 | ||
777 | static inline int | 774 | static inline int |
778 | filter_check_discard(struct ftrace_event_call *call, void *rec, | 775 | filter_check_discard(struct ftrace_event_call *call, void *rec, |
@@ -787,6 +784,47 @@ filter_check_discard(struct ftrace_event_call *call, void *rec, | |||
787 | return 0; | 784 | return 0; |
788 | } | 785 | } |
789 | 786 | ||
787 | #define DEFINE_COMPARISON_PRED(type) \ | ||
788 | static int filter_pred_##type(struct filter_pred *pred, void *event, \ | ||
789 | int val1, int val2) \ | ||
790 | { \ | ||
791 | type *addr = (type *)(event + pred->offset); \ | ||
792 | type val = (type)pred->val; \ | ||
793 | int match = 0; \ | ||
794 | \ | ||
795 | switch (pred->op) { \ | ||
796 | case OP_LT: \ | ||
797 | match = (*addr < val); \ | ||
798 | break; \ | ||
799 | case OP_LE: \ | ||
800 | match = (*addr <= val); \ | ||
801 | break; \ | ||
802 | case OP_GT: \ | ||
803 | match = (*addr > val); \ | ||
804 | break; \ | ||
805 | case OP_GE: \ | ||
806 | match = (*addr >= val); \ | ||
807 | break; \ | ||
808 | default: \ | ||
809 | break; \ | ||
810 | } \ | ||
811 | \ | ||
812 | return match; \ | ||
813 | } | ||
814 | |||
815 | #define DEFINE_EQUALITY_PRED(size) \ | ||
816 | static int filter_pred_##size(struct filter_pred *pred, void *event, \ | ||
817 | int val1, int val2) \ | ||
818 | { \ | ||
819 | u##size *addr = (u##size *)(event + pred->offset); \ | ||
820 | u##size val = (u##size)pred->val; \ | ||
821 | int match; \ | ||
822 | \ | ||
823 | match = (val == *addr) ^ pred->not; \ | ||
824 | \ | ||
825 | return match; \ | ||
826 | } | ||
827 | |||
790 | extern struct list_head ftrace_events; | 828 | extern struct list_head ftrace_events; |
791 | 829 | ||
792 | extern const char *__start___trace_bprintk_fmt[]; | 830 | extern const char *__start___trace_bprintk_fmt[]; |