aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-01-27 22:37:09 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-02-07 20:56:18 -0500
commit58d9a597c4275d830a819625e7d437cd6fb23fa5 (patch)
tree823a4eea8d421314c1b2e259bc5fb376734f7847 /kernel/trace
parent6d54057d76e25c91165cda0e6e007f1811faa2be (diff)
tracing/filter: Move OR and AND logic out of fn() method
The ops OR and AND act different from the other ops, as they are the only ones to take other ops as their arguements. These ops als change the logic of the filter_match_preds. By removing the OR and AND fn's we can also remove the val1 and val2 that is passed to all other fn's and are unused. Cc: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace')
-rw-r--r--kernel/trace/trace.h3
-rw-r--r--kernel/trace/trace_events_filter.c51
2 files changed, 20 insertions, 34 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 9021f8c0c0c3..1597bc0749c1 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -677,8 +677,7 @@ struct event_subsystem {
677struct filter_pred; 677struct filter_pred;
678struct regex; 678struct regex;
679 679
680typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event, 680typedef int (*filter_pred_fn_t) (struct filter_pred *pred, void *event);
681 int val1, int val2);
682 681
683typedef int (*regex_match_func)(char *str, struct regex *r, int len); 682typedef int (*regex_match_func)(char *str, struct regex *r, int len);
684 683
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 7275f0310ed8..5d719b340a2b 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -124,8 +124,7 @@ struct filter_parse_state {
124}; 124};
125 125
126#define DEFINE_COMPARISON_PRED(type) \ 126#define DEFINE_COMPARISON_PRED(type) \
127static int filter_pred_##type(struct filter_pred *pred, void *event, \ 127static int filter_pred_##type(struct filter_pred *pred, void *event) \
128 int val1, int val2) \
129{ \ 128{ \
130 type *addr = (type *)(event + pred->offset); \ 129 type *addr = (type *)(event + pred->offset); \
131 type val = (type)pred->val; \ 130 type val = (type)pred->val; \
@@ -152,8 +151,7 @@ static int filter_pred_##type(struct filter_pred *pred, void *event, \
152} 151}
153 152
154#define DEFINE_EQUALITY_PRED(size) \ 153#define DEFINE_EQUALITY_PRED(size) \
155static int filter_pred_##size(struct filter_pred *pred, void *event, \ 154static int filter_pred_##size(struct filter_pred *pred, void *event) \
156 int val1, int val2) \
157{ \ 155{ \
158 u##size *addr = (u##size *)(event + pred->offset); \ 156 u##size *addr = (u##size *)(event + pred->offset); \
159 u##size val = (u##size)pred->val; \ 157 u##size val = (u##size)pred->val; \
@@ -178,23 +176,8 @@ DEFINE_EQUALITY_PRED(32);
178DEFINE_EQUALITY_PRED(16); 176DEFINE_EQUALITY_PRED(16);
179DEFINE_EQUALITY_PRED(8); 177DEFINE_EQUALITY_PRED(8);
180 178
181static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
182 void *event __attribute((unused)),
183 int val1, int val2)
184{
185 return val1 && val2;
186}
187
188static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
189 void *event __attribute((unused)),
190 int val1, int val2)
191{
192 return val1 || val2;
193}
194
195/* Filter predicate for fixed sized arrays of characters */ 179/* Filter predicate for fixed sized arrays of characters */
196static int filter_pred_string(struct filter_pred *pred, void *event, 180static int filter_pred_string(struct filter_pred *pred, void *event)
197 int val1, int val2)
198{ 181{
199 char *addr = (char *)(event + pred->offset); 182 char *addr = (char *)(event + pred->offset);
200 int cmp, match; 183 int cmp, match;
@@ -207,8 +190,7 @@ static int filter_pred_string(struct filter_pred *pred, void *event,
207} 190}
208 191
209/* Filter predicate for char * pointers */ 192/* Filter predicate for char * pointers */
210static int filter_pred_pchar(struct filter_pred *pred, void *event, 193static int filter_pred_pchar(struct filter_pred *pred, void *event)
211 int val1, int val2)
212{ 194{
213 char **addr = (char **)(event + pred->offset); 195 char **addr = (char **)(event + pred->offset);
214 int cmp, match; 196 int cmp, match;
@@ -231,8 +213,7 @@ static int filter_pred_pchar(struct filter_pred *pred, void *event,
231 * and add it to the address of the entry, and at last we have 213 * and add it to the address of the entry, and at last we have
232 * the address of the string. 214 * the address of the string.
233 */ 215 */
234static int filter_pred_strloc(struct filter_pred *pred, void *event, 216static int filter_pred_strloc(struct filter_pred *pred, void *event)
235 int val1, int val2)
236{ 217{
237 u32 str_item = *(u32 *)(event + pred->offset); 218 u32 str_item = *(u32 *)(event + pred->offset);
238 int str_loc = str_item & 0xffff; 219 int str_loc = str_item & 0xffff;
@@ -247,8 +228,7 @@ static int filter_pred_strloc(struct filter_pred *pred, void *event,
247 return match; 228 return match;
248} 229}
249 230
250static int filter_pred_none(struct filter_pred *pred, void *event, 231static int filter_pred_none(struct filter_pred *pred, void *event)
251 int val1, int val2)
252{ 232{
253 return 0; 233 return 0;
254} 234}
@@ -380,7 +360,7 @@ static void filter_build_regex(struct filter_pred *pred)
380/* return 1 if event matches, 0 otherwise (discard) */ 360/* return 1 if event matches, 0 otherwise (discard) */
381int filter_match_preds(struct event_filter *filter, void *rec) 361int filter_match_preds(struct event_filter *filter, void *rec)
382{ 362{
383 int match, top = 0, val1 = 0, val2 = 0; 363 int match = -1, top = 0, val1 = 0, val2 = 0;
384 int stack[MAX_FILTER_PRED]; 364 int stack[MAX_FILTER_PRED];
385 struct filter_pred *pred; 365 struct filter_pred *pred;
386 int n_preds = ACCESS_ONCE(filter->n_preds); 366 int n_preds = ACCESS_ONCE(filter->n_preds);
@@ -393,7 +373,7 @@ int filter_match_preds(struct event_filter *filter, void *rec)
393 for (i = 0; i < n_preds; i++) { 373 for (i = 0; i < n_preds; i++) {
394 pred = filter->preds[i]; 374 pred = filter->preds[i];
395 if (!pred->pop_n) { 375 if (!pred->pop_n) {
396 match = pred->fn(pred, rec, val1, val2); 376 match = pred->fn(pred, rec);
397 stack[top++] = match; 377 stack[top++] = match;
398 continue; 378 continue;
399 } 379 }
@@ -403,7 +383,16 @@ int filter_match_preds(struct event_filter *filter, void *rec)
403 } 383 }
404 val1 = stack[--top]; 384 val1 = stack[--top];
405 val2 = stack[--top]; 385 val2 = stack[--top];
406 match = pred->fn(pred, rec, val1, val2); 386 switch (pred->op) {
387 case OP_AND:
388 match = val1 && val2;
389 break;
390 case OP_OR:
391 match = val1 || val2;
392 break;
393 default:
394 WARN_ONCE(1, "filter op is not AND or OR");
395 }
407 stack[top++] = match; 396 stack[top++] = match;
408 } 397 }
409 398
@@ -775,15 +764,13 @@ static int filter_add_pred(struct filter_parse_state *ps,
775 unsigned long long val; 764 unsigned long long val;
776 int ret; 765 int ret;
777 766
778 pred->fn = filter_pred_none; 767 fn = pred->fn = filter_pred_none;
779 768
780 if (pred->op == OP_AND) { 769 if (pred->op == OP_AND) {
781 pred->pop_n = 2; 770 pred->pop_n = 2;
782 fn = filter_pred_and;
783 goto add_pred_fn; 771 goto add_pred_fn;
784 } else if (pred->op == OP_OR) { 772 } else if (pred->op == OP_OR) {
785 pred->pop_n = 2; 773 pred->pop_n = 2;
786 fn = filter_pred_or;
787 goto add_pred_fn; 774 goto add_pred_fn;
788 } 775 }
789 776