Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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.com


Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 2f3aa7a0
Loading
Loading
Loading
Loading
+16 −41
Original line number Diff line number Diff line
@@ -630,11 +630,7 @@ find_event_field(struct ftrace_event_call *call, char *name)

static void filter_free_pred(struct filter_pred *pred)
{
	if (!pred)
		return;

	kfree(pred->field_name);
	kfree(pred);
}

static void filter_clear_pred(struct filter_pred *pred)
@@ -1302,39 +1298,30 @@ static int filter_parse(struct filter_parse_state *ps)
	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;

	pred = kzalloc(sizeof(*pred), GFP_KERNEL);
	if (!pred)
		return NULL;
	static struct filter_pred pred;

	pred->field_name = kstrdup(operand1, GFP_KERNEL);
	if (!pred->field_name) {
		kfree(pred);
		return NULL;
	}
	memset(&pred, 0, sizeof(pred));
	pred.op = op;

	strcpy(pred->regex.pattern, operand2);
	pred->regex.len = strlen(pred->regex.pattern);
	if (op == OP_AND || op == OP_OR)
		return &pred;

	pred->op = op;

	return pred;
	if (!operand1 || !operand2) {
		parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
		return NULL;
	}

static struct filter_pred *create_logical_pred(int op)
{
	struct filter_pred *pred;

	pred = kzalloc(sizeof(*pred), GFP_KERNEL);
	if (!pred)
	pred.field_name = kstrdup(operand1, GFP_KERNEL);
	if (!pred.field_name)
		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)
@@ -1643,19 +1630,7 @@ static int replace_preds(struct ftrace_event_call *call,
			goto fail;
		}

		if (elt->op == OP_AND || elt->op == OP_OR) {
			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:
		pred = create_pred(ps, elt->op, operand1, operand2);
		if (!pred) {
			err = -ENOMEM;
			goto fail;