summaryrefslogtreecommitdiff
path: root/kernel/trace/trace_events_filter.c
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/trace_events_filter.c
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/trace_events_filter.c')
-rw-r--r--kernel/trace/trace_events_filter.c31
1 files changed, 9 insertions, 22 deletions
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)
{
int match = -1, top = 0, val1 = 0, val2 = 0;
int stack[MAX_FILTER_PRED];
- struct filter_pred **preds;
+ struct filter_pred *preds;
struct filter_pred *pred;
int n_preds = ACCESS_ONCE(filter->n_preds);
int i;
@@ -377,7 +377,7 @@ int filter_match_preds(struct event_filter *filter, void *rec)
preds = rcu_dereference_sched(filter->preds);
for (i = 0; i < n_preds; i++) {
- pred = preds[i];
+ pred = &preds[i];
if (!pred->pop_n) {
match = pred->fn(pred, rec);
stack[top++] = match;
@@ -559,10 +559,8 @@ static void __free_preds(struct event_filter *filter)
int i;
if (filter->preds) {
- for (i = 0; i < filter->a_preds; i++) {
- if (filter->preds[i])
- filter_free_pred(filter->preds[i]);
- }
+ for (i = 0; i < filter->a_preds; i++)
+ kfree(filter->preds[i].field_name);
kfree(filter->preds);
filter->preds = NULL;
}
@@ -572,7 +570,6 @@ static void __free_preds(struct event_filter *filter)
static void reset_preds(struct event_filter *filter)
{
- struct filter_pred *pred;
int n_preds = filter->n_preds;
int i;
@@ -580,10 +577,8 @@ static void reset_preds(struct event_filter *filter)
if (!filter->preds)
return;
- for (i = 0; i < n_preds; i++) {
- pred = filter->preds[i];
- pred->fn = filter_pred_none;
- }
+ for (i = 0; i < n_preds; i++)
+ filter->preds[i].fn = filter_pred_none;
}
static void filter_disable_preds(struct ftrace_event_call *call)
@@ -658,19 +653,11 @@ static int __alloc_preds(struct event_filter *filter, int n_preds)
return -EINVAL;
for (i = 0; i < n_preds; i++) {
- pred = filter->preds[i];
- if (!pred)
- pred = kzalloc(sizeof(*pred), GFP_KERNEL);
- if (!pred)
- goto oom;
+ pred = &filter->preds[i];
pred->fn = filter_pred_none;
- filter->preds[i] = pred;
}
return 0;
- oom:
- __free_preds(filter);
- return -ENOMEM;
}
static int init_filter(struct ftrace_event_call *call)
@@ -730,8 +717,8 @@ static int filter_add_pred_fn(struct filter_parse_state *ps,
}
idx = filter->n_preds;
- filter_clear_pred(filter->preds[idx]);
- err = filter_set_pred(filter->preds[idx], pred, fn);
+ filter_clear_pred(&filter->preds[idx]);
+ err = filter_set_pred(&filter->preds[idx], pred, fn);
if (err)
return err;