aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-01-27 22:49:48 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-02-07 20:56:18 -0500
commit74e9e58c350a24139e268dd6857bbaa55c5aafcf (patch)
tree26f4769080314a042d67a73975656331add7648d /kernel/trace
parent0fc3ca9a10a61a77f18710fb708b41fd99c79a56 (diff)
tracing/filter: Allocate the preds in an array
Currently we allocate an array of pointers to filter_preds, and then allocate a separate filter_pred for each item in the array. This adds slight overhead in the filters as it needs to derefernce twice to get to the op condition. Allocating the preds themselves in a single array removes a dereference as well as helps on the cache footprint. 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.h2
-rw-r--r--kernel/trace/trace_events_filter.c31
2 files changed, 10 insertions, 23 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 441fc1bc85d6..254d04a84ec3 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -663,7 +663,7 @@ struct ftrace_event_field {
663struct event_filter { 663struct event_filter {
664 int n_preds; /* Number assigned */ 664 int n_preds; /* Number assigned */
665 int a_preds; /* allocated */ 665 int a_preds; /* allocated */
666 struct filter_pred **preds; 666 struct filter_pred *preds;
667 char *filter_string; 667 char *filter_string;
668}; 668};
669 669
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 8f00a11ce778..b6c910642a1e 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -362,7 +362,7 @@ int filter_match_preds(struct event_filter *filter, void *rec)
362{ 362{
363 int match = -1, top = 0, val1 = 0, val2 = 0; 363 int match = -1, top = 0, val1 = 0, val2 = 0;
364 int stack[MAX_FILTER_PRED]; 364 int stack[MAX_FILTER_PRED];
365 struct filter_pred **preds; 365 struct filter_pred *preds;
366 struct filter_pred *pred; 366 struct filter_pred *pred;
367 int n_preds = ACCESS_ONCE(filter->n_preds); 367 int n_preds = ACCESS_ONCE(filter->n_preds);
368 int i; 368 int i;
@@ -377,7 +377,7 @@ int filter_match_preds(struct event_filter *filter, void *rec)
377 preds = rcu_dereference_sched(filter->preds); 377 preds = rcu_dereference_sched(filter->preds);
378 378
379 for (i = 0; i < n_preds; i++) { 379 for (i = 0; i < n_preds; i++) {
380 pred = preds[i]; 380 pred = &preds[i];
381 if (!pred->pop_n) { 381 if (!pred->pop_n) {
382 match = pred->fn(pred, rec); 382 match = pred->fn(pred, rec);
383 stack[top++] = match; 383 stack[top++] = match;
@@ -559,10 +559,8 @@ static void __free_preds(struct event_filter *filter)
559 int i; 559 int i;
560 560
561 if (filter->preds) { 561 if (filter->preds) {
562 for (i = 0; i < filter->a_preds; i++) { 562 for (i = 0; i < filter->a_preds; i++)
563 if (filter->preds[i]) 563 kfree(filter->preds[i].field_name);
564 filter_free_pred(filter->preds[i]);
565 }
566 kfree(filter->preds); 564 kfree(filter->preds);
567 filter->preds = NULL; 565 filter->preds = NULL;
568 } 566 }
@@ -572,7 +570,6 @@ static void __free_preds(struct event_filter *filter)
572 570
573static void reset_preds(struct event_filter *filter) 571static void reset_preds(struct event_filter *filter)
574{ 572{
575 struct filter_pred *pred;
576 int n_preds = filter->n_preds; 573 int n_preds = filter->n_preds;
577 int i; 574 int i;
578 575
@@ -580,10 +577,8 @@ static void reset_preds(struct event_filter *filter)
580 if (!filter->preds) 577 if (!filter->preds)
581 return; 578 return;
582 579
583 for (i = 0; i < n_preds; i++) { 580 for (i = 0; i < n_preds; i++)
584 pred = filter->preds[i]; 581 filter->preds[i].fn = filter_pred_none;
585 pred->fn = filter_pred_none;
586 }
587} 582}
588 583
589static void filter_disable_preds(struct ftrace_event_call *call) 584static void filter_disable_preds(struct ftrace_event_call *call)
@@ -658,19 +653,11 @@ static int __alloc_preds(struct event_filter *filter, int n_preds)
658 return -EINVAL; 653 return -EINVAL;
659 654
660 for (i = 0; i < n_preds; i++) { 655 for (i = 0; i < n_preds; i++) {
661 pred = filter->preds[i]; 656 pred = &filter->preds[i];
662 if (!pred)
663 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
664 if (!pred)
665 goto oom;
666 pred->fn = filter_pred_none; 657 pred->fn = filter_pred_none;
667 filter->preds[i] = pred;
668 } 658 }
669 659
670 return 0; 660 return 0;
671 oom:
672 __free_preds(filter);
673 return -ENOMEM;
674} 661}
675 662
676static int init_filter(struct ftrace_event_call *call) 663static int init_filter(struct ftrace_event_call *call)
@@ -730,8 +717,8 @@ static int filter_add_pred_fn(struct filter_parse_state *ps,
730 } 717 }
731 718
732 idx = filter->n_preds; 719 idx = filter->n_preds;
733 filter_clear_pred(filter->preds[idx]); 720 filter_clear_pred(&filter->preds[idx]);
734 err = filter_set_pred(filter->preds[idx], pred, fn); 721 err = filter_set_pred(&filter->preds[idx], pred, fn);
735 if (err) 722 if (err)
736 return err; 723 return err;
737 724