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

Commit e334016f authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo
Browse files

perf probe: Remove xzalloc() from util/probe-{event, finder}.c



Remove all xzalloc() calls from util/probe-{event,finder}.c since
it may cause 'sudden death' in utility functions and it makes
reusing it from other code difficult.

Cc: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20100412171749.3790.33303.stgit@localhost6.localdomain6>
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@redhat.com>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 146a1439
Loading
Loading
Loading
Loading
+51 −18
Original line number Original line Diff line number Diff line
@@ -556,7 +556,9 @@ static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg)
	fieldp = &arg->field;
	fieldp = &arg->field;


	do {
	do {
		*fieldp = xzalloc(sizeof(struct perf_probe_arg_field));
		*fieldp = zalloc(sizeof(struct perf_probe_arg_field));
		if (*fieldp == NULL)
			return -ENOMEM;
		if (*tmp == '.') {
		if (*tmp == '.') {
			str = tmp + 1;
			str = tmp + 1;
			(*fieldp)->ref = false;
			(*fieldp)->ref = false;
@@ -608,7 +610,11 @@ int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev)


	/* Copy arguments and ensure return probe has no C argument */
	/* Copy arguments and ensure return probe has no C argument */
	pev->nargs = argc - 1;
	pev->nargs = argc - 1;
	pev->args = xzalloc(sizeof(struct perf_probe_arg) * pev->nargs);
	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
	if (pev->args == NULL) {
		ret = -ENOMEM;
		goto out;
	}
	for (i = 0; i < pev->nargs && ret >= 0; i++) {
	for (i = 0; i < pev->nargs && ret >= 0; i++) {
		ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]);
		ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]);
		if (ret >= 0 &&
		if (ret >= 0 &&
@@ -680,7 +686,11 @@ int parse_kprobe_trace_command(const char *cmd, struct kprobe_trace_event *tev)
		tp->offset = 0;
		tp->offset = 0;


	tev->nargs = argc - 2;
	tev->nargs = argc - 2;
	tev->args = xzalloc(sizeof(struct kprobe_trace_arg) * tev->nargs);
	tev->args = zalloc(sizeof(struct kprobe_trace_arg) * tev->nargs);
	if (tev->args == NULL) {
		ret = -ENOMEM;
		goto out;
	}
	for (i = 0; i < tev->nargs; i++) {
	for (i = 0; i < tev->nargs; i++) {
		p = strchr(argv[i + 2], '=');
		p = strchr(argv[i + 2], '=');
		if (p)	/* We don't need which register is assigned. */
		if (p)	/* We don't need which register is assigned. */
@@ -745,7 +755,11 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
	char offs[32] = "", line[32] = "", file[32] = "";
	char offs[32] = "", line[32] = "", file[32] = "";
	int ret, len;
	int ret, len;


	buf = xzalloc(MAX_CMDLEN);
	buf = zalloc(MAX_CMDLEN);
	if (buf == NULL) {
		ret = -ENOMEM;
		goto error;
	}
	if (pp->offset) {
	if (pp->offset) {
		ret = e_snprintf(offs, 32, "+%lu", pp->offset);
		ret = e_snprintf(offs, 32, "+%lu", pp->offset);
		if (ret <= 0)
		if (ret <= 0)
@@ -781,6 +795,7 @@ static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
error:
error:
	pr_debug("Failed to synthesize perf probe point: %s",
	pr_debug("Failed to synthesize perf probe point: %s",
		 strerror(-ret));
		 strerror(-ret));
	if (buf)
		free(buf);
		free(buf);
	return NULL;
	return NULL;
}
}
@@ -890,7 +905,10 @@ char *synthesize_kprobe_trace_command(struct kprobe_trace_event *tev)
	char *buf;
	char *buf;
	int i, len, ret;
	int i, len, ret;


	buf = xzalloc(MAX_CMDLEN);
	buf = zalloc(MAX_CMDLEN);
	if (buf == NULL)
		return NULL;

	len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s+%lu",
	len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s+%lu",
			 tp->retprobe ? 'r' : 'p',
			 tp->retprobe ? 'r' : 'p',
			 tev->group, tev->event,
			 tev->group, tev->event,
@@ -929,7 +947,9 @@ int convert_to_perf_probe_event(struct kprobe_trace_event *tev,


	/* Convert trace_arg to probe_arg */
	/* Convert trace_arg to probe_arg */
	pev->nargs = tev->nargs;
	pev->nargs = tev->nargs;
	pev->args = xzalloc(sizeof(struct perf_probe_arg) * pev->nargs);
	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
	if (pev->args == NULL)
		return -ENOMEM;
	for (i = 0; i < tev->nargs && ret >= 0; i++)
	for (i = 0; i < tev->nargs && ret >= 0; i++)
		if (tev->args[i].name)
		if (tev->args[i].name)
			pev->args[i].name = xstrdup(tev->args[i].name);
			pev->args[i].name = xstrdup(tev->args[i].name);
@@ -1326,25 +1346,31 @@ static int convert_to_kprobe_trace_events(struct perf_probe_event *pev,
					  struct kprobe_trace_event **tevs)
					  struct kprobe_trace_event **tevs)
{
{
	struct symbol *sym;
	struct symbol *sym;
	int ntevs = 0, i;
	int ret = 0, i;
	struct kprobe_trace_event *tev;
	struct kprobe_trace_event *tev;


	/* Convert perf_probe_event with debuginfo */
	/* Convert perf_probe_event with debuginfo */
	ntevs = try_to_find_kprobe_trace_events(pev, tevs);
	ret = try_to_find_kprobe_trace_events(pev, tevs);
	if (ntevs != 0)
	if (ret != 0)
		return ntevs;
		return ret;


	/* Allocate trace event buffer */
	/* Allocate trace event buffer */
	ntevs = 1;
	tev = *tevs = zalloc(sizeof(struct kprobe_trace_event));
	tev = *tevs = xzalloc(sizeof(struct kprobe_trace_event));
	if (tev == NULL)
		return -ENOMEM;


	/* Copy parameters */
	/* Copy parameters */
	tev->point.symbol = xstrdup(pev->point.function);
	tev->point.symbol = xstrdup(pev->point.function);
	tev->point.offset = pev->point.offset;
	tev->point.offset = pev->point.offset;
	tev->nargs = pev->nargs;
	tev->nargs = pev->nargs;
	if (tev->nargs) {
	if (tev->nargs) {
		tev->args = xzalloc(sizeof(struct kprobe_trace_arg)
		tev->args = zalloc(sizeof(struct kprobe_trace_arg)
				   * tev->nargs);
				   * tev->nargs);
		if (tev->args == NULL) {
			free(tev);
			*tevs = NULL;
			return -ENOMEM;
		}
		for (i = 0; i < tev->nargs; i++) {
		for (i = 0; i < tev->nargs; i++) {
			if (pev->args[i].name)
			if (pev->args[i].name)
				tev->args[i].name = xstrdup(pev->args[i].name);
				tev->args[i].name = xstrdup(pev->args[i].name);
@@ -1360,9 +1386,14 @@ static int convert_to_kprobe_trace_events(struct perf_probe_event *pev,
	if (!sym) {
	if (!sym) {
		pr_warning("Kernel symbol \'%s\' not found.\n",
		pr_warning("Kernel symbol \'%s\' not found.\n",
			   tev->point.symbol);
			   tev->point.symbol);
		clear_kprobe_trace_event(tev);
		free(tev);
		*tevs = NULL;
		return -ENOENT;
		return -ENOENT;
	}
	} else
	return ntevs;
		ret = 1;

	return ret;
}
}


struct __event_package {
struct __event_package {
@@ -1377,7 +1408,9 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
	int i, j, ret;
	int i, j, ret;
	struct __event_package *pkgs;
	struct __event_package *pkgs;


	pkgs = xzalloc(sizeof(struct __event_package) * npevs);
	pkgs = zalloc(sizeof(struct __event_package) * npevs);
	if (pkgs == NULL)
		return -ENOMEM;


	/* Init vmlinux path */
	/* Init vmlinux path */
	ret = init_vmlinux();
	ret = init_vmlinux();
+18 −7
Original line number Original line Diff line number Diff line
@@ -111,7 +111,7 @@ static int strtailcmp(const char *s1, const char *s2)
/* Line number list operations */
/* Line number list operations */


/* Add a line to line number list */
/* Add a line to line number list */
static void line_list__add_line(struct list_head *head, unsigned int line)
static int line_list__add_line(struct list_head *head, unsigned int line)
{
{
	struct line_node *ln;
	struct line_node *ln;
	struct list_head *p;
	struct list_head *p;
@@ -122,16 +122,19 @@ static void line_list__add_line(struct list_head *head, unsigned int line)
			p = &ln->list;
			p = &ln->list;
			goto found;
			goto found;
		} else if (ln->line == line)	/* Already exist */
		} else if (ln->line == line)	/* Already exist */
			return ;
			return 1;
	}
	}
	/* List is empty, or the smallest entry */
	/* List is empty, or the smallest entry */
	p = head;
	p = head;
found:
found:
	pr_debug("line list: add a line %u\n", line);
	pr_debug("line list: add a line %u\n", line);
	ln = xzalloc(sizeof(struct line_node));
	ln = zalloc(sizeof(struct line_node));
	if (ln == NULL)
		return -ENOMEM;
	ln->line = line;
	ln->line = line;
	INIT_LIST_HEAD(&ln->list);
	INIT_LIST_HEAD(&ln->list);
	list_add(&ln->list, p);
	list_add(&ln->list, p);
	return 0;
}
}


/* Check if the line in line number list */
/* Check if the line in line number list */
@@ -423,7 +426,9 @@ static int convert_location(Dwarf_Op *op, struct probe_finder *pf)


	tvar->value = xstrdup(regs);
	tvar->value = xstrdup(regs);
	if (ref) {
	if (ref) {
		tvar->ref = xzalloc(sizeof(struct kprobe_trace_arg_ref));
		tvar->ref = zalloc(sizeof(struct kprobe_trace_arg_ref));
		if (tvar->ref == NULL)
			return -ENOMEM;
		tvar->ref->offset = (long)offs;
		tvar->ref->offset = (long)offs;
	}
	}
	return 0;
	return 0;
@@ -500,7 +505,9 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
			return -EINVAL;
			return -EINVAL;
		}
		}


		ref = xzalloc(sizeof(struct kprobe_trace_arg_ref));
		ref = zalloc(sizeof(struct kprobe_trace_arg_ref));
		if (ref == NULL)
			return -ENOMEM;
		if (*ref_ptr)
		if (*ref_ptr)
			(*ref_ptr)->next = ref;
			(*ref_ptr)->next = ref;
		else
		else
@@ -680,7 +687,9 @@ static int convert_probe_point(Dwarf_Die *sp_die, struct probe_finder *pf)


	/* Find each argument */
	/* Find each argument */
	tev->nargs = pf->pev->nargs;
	tev->nargs = pf->pev->nargs;
	tev->args = xzalloc(sizeof(struct kprobe_trace_arg) * tev->nargs);
	tev->args = zalloc(sizeof(struct kprobe_trace_arg) * tev->nargs);
	if (tev->args == NULL)
		return -ENOMEM;
	for (i = 0; i < pf->pev->nargs; i++) {
	for (i = 0; i < pf->pev->nargs; i++) {
		pf->pvar = &pf->pev->args[i];
		pf->pvar = &pf->pev->args[i];
		pf->tvar = &tev->args[i];
		pf->tvar = &tev->args[i];
@@ -938,7 +947,9 @@ int find_kprobe_trace_events(int fd, struct perf_probe_event *pev,
	Dwarf *dbg;
	Dwarf *dbg;
	int ret = 0;
	int ret = 0;


	pf.tevs = xzalloc(sizeof(struct kprobe_trace_event) * MAX_PROBES);
	pf.tevs = zalloc(sizeof(struct kprobe_trace_event) * MAX_PROBES);
	if (pf.tevs == NULL)
		return -ENOMEM;
	*tevs = pf.tevs;
	*tevs = pf.tevs;
	pf.ntevs = 0;
	pf.ntevs = 0;