Commit 81570d9c authored by Jiri Olsa's avatar Jiri Olsa Committed by Steven Rostedt

tracing/filter: Use static allocation for filter predicates

Don't dynamically allocate filter_pred struct, use static memory.
This way we can get rid of the code managing the dynamic filter_pred
struct object.

The create_pred function integrates create_logical_pred function.
This way the static predicate memory is returned only from
one place.
Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1313072754-4620-2-git-send-email-jolsa@redhat.comSigned-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 2f3aa7a0
...@@ -630,11 +630,7 @@ find_event_field(struct ftrace_event_call *call, char *name) ...@@ -630,11 +630,7 @@ find_event_field(struct ftrace_event_call *call, char *name)
static void filter_free_pred(struct filter_pred *pred) static void filter_free_pred(struct filter_pred *pred)
{ {
if (!pred)
return;
kfree(pred->field_name); kfree(pred->field_name);
kfree(pred);
} }
static void filter_clear_pred(struct filter_pred *pred) static void filter_clear_pred(struct filter_pred *pred)
...@@ -1302,39 +1298,30 @@ static int filter_parse(struct filter_parse_state *ps) ...@@ -1302,39 +1298,30 @@ static int filter_parse(struct filter_parse_state *ps)
return 0; return 0;
} }
static struct filter_pred *create_pred(int op, char *operand1, char *operand2) static struct filter_pred *create_pred(struct filter_parse_state *ps,
int op, char *operand1, char *operand2)
{ {
struct filter_pred *pred; static struct filter_pred pred;
pred = kzalloc(sizeof(*pred), GFP_KERNEL); memset(&pred, 0, sizeof(pred));
if (!pred) pred.op = op;
return NULL;
pred->field_name = kstrdup(operand1, GFP_KERNEL); if (op == OP_AND || op == OP_OR)
if (!pred->field_name) { return &pred;
kfree(pred);
if (!operand1 || !operand2) {
parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
return NULL; return NULL;
} }
strcpy(pred->regex.pattern, operand2); pred.field_name = kstrdup(operand1, GFP_KERNEL);
pred->regex.len = strlen(pred->regex.pattern); if (!pred.field_name)
pred->op = op;
return pred;
}
static struct filter_pred *create_logical_pred(int op)
{
struct filter_pred *pred;
pred = kzalloc(sizeof(*pred), GFP_KERNEL);
if (!pred)
return NULL; return NULL;
pred->op = op; strcpy(pred.regex.pattern, operand2);
pred.regex.len = strlen(pred.regex.pattern);
return pred; return &pred;
} }
static int check_preds(struct filter_parse_state *ps) static int check_preds(struct filter_parse_state *ps)
...@@ -1643,19 +1630,7 @@ static int replace_preds(struct ftrace_event_call *call, ...@@ -1643,19 +1630,7 @@ static int replace_preds(struct ftrace_event_call *call,
goto fail; goto fail;
} }
if (elt->op == OP_AND || elt->op == OP_OR) { pred = create_pred(ps, elt->op, operand1, operand2);
pred = create_logical_pred(elt->op);
goto add_pred;
}
if (!operand1 || !operand2) {
parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
err = -EINVAL;
goto fail;
}
pred = create_pred(elt->op, operand1, operand2);
add_pred:
if (!pred) { if (!pred) {
err = -ENOMEM; err = -ENOMEM;
goto fail; goto fail;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment