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

Commit 768dd3f3 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf header: Use argv style storage for cmdline feature data



We will reuse argv style data in following change to display counters
header showing monitored command line.

Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1437481927-29538-12-git-send-email-jolsa@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 0e5ffb31
Loading
Loading
Loading
Loading
+20 −15
Original line number Diff line number Diff line
@@ -923,17 +923,13 @@ static void print_cmdline(struct perf_header *ph, int fd __maybe_unused,
			  FILE *fp)
{
	int nr, i;
	char *str;

	nr = ph->env.nr_cmdline;
	str = ph->env.cmdline;

	fprintf(fp, "# cmdline : ");

	for (i = 0; i < nr; i++) {
		fprintf(fp, "%s ", str);
		str += strlen(str) + 1;
	}
	for (i = 0; i < nr; i++)
		fprintf(fp, "%s ", ph->env.cmdline_argv[i]);
	fputc('\n', fp);
}

@@ -1541,14 +1537,13 @@ process_event_desc(struct perf_file_section *section __maybe_unused,
	return 0;
}

static int process_cmdline(struct perf_file_section *section __maybe_unused,
static int process_cmdline(struct perf_file_section *section,
			   struct perf_header *ph, int fd,
			   void *data __maybe_unused)
{
	ssize_t ret;
	char *str;
	u32 nr, i;
	struct strbuf sb;
	char *str, *cmdline = NULL, **argv = NULL;
	u32 nr, i, len = 0;

	ret = readn(fd, &nr, sizeof(nr));
	if (ret != sizeof(nr))
@@ -1558,22 +1553,32 @@ static int process_cmdline(struct perf_file_section *section __maybe_unused,
		nr = bswap_32(nr);

	ph->env.nr_cmdline = nr;
	strbuf_init(&sb, 128);

	cmdline = zalloc(section->size + nr + 1);
	if (!cmdline)
		return -1;

	argv = zalloc(sizeof(char *) * (nr + 1));
	if (!argv)
		goto error;

	for (i = 0; i < nr; i++) {
		str = do_read_string(fd, ph);
		if (!str)
			goto error;

		/* include a NULL character at the end */
		strbuf_add(&sb, str, strlen(str) + 1);
		argv[i] = cmdline + len;
		memcpy(argv[i], str, strlen(str) + 1);
		len += strlen(str) + 1;
		free(str);
	}
	ph->env.cmdline = strbuf_detach(&sb, NULL);
	ph->env.cmdline = cmdline;
	ph->env.cmdline_argv = (const char **) argv;
	return 0;

error:
	strbuf_release(&sb);
	free(argv);
	free(cmdline);
	return -1;
}

+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ struct perf_session_env {
	int			nr_pmu_mappings;
	int			nr_groups;
	char			*cmdline;
	const char		**cmdline_argv;
	char			*sibling_cores;
	char			*sibling_threads;
	char			*numa_nodes;
+1 −0
Original line number Diff line number Diff line
@@ -180,6 +180,7 @@ static void perf_session_env__delete(struct perf_session_env *env)
	zfree(&env->cpuid);

	zfree(&env->cmdline);
	zfree(&env->cmdline_argv);
	zfree(&env->sibling_cores);
	zfree(&env->sibling_threads);
	zfree(&env->numa_nodes);