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

Commit 56f3bae7 authored by Jim Cromie's avatar Jim Cromie Committed by Arnaldo Carvalho de Melo
Browse files

perf stat: Add --log-fd <N> option to redirect stderr elsewhere

This perf stat option emulates valgrind's --log-fd option, allowing the
user to send perf results elsewhere, and leaving stderr for use by the
program under test.  This complements --output file option, and is
mutually exclusive with it.

   3>results  perf stat --log-fd 3          -- $cmd
   3>>results perf stat --log-fd 3 --append -- $cmd

The perl distro's make test.valgrind target uses valgrind's --log-fd
option, I've adapted it to invoke perf also, and tested this patch
there.

Link: http://lkml.kernel.org/r/1315437244-3788-2-git-send-email-jim.cromie@gmail.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarJim Cromie <jim.cromie@gmail.com>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent dcc101d1
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -95,12 +95,21 @@ corresponding events, i.e., they always refer to events defined earlier on the c
line.

-o file::
-output file::
--output file::
Print the output into the designated file.

--append::
Append to the output file designated with the -o option. Ignored if -o is not specified.

--log-fd::

Log output to fd, instead of stderr.  Complementary to --output, and mutually exclusive
with it.  --append may be used here.  Examples:
     3>results  perf stat --log-fd 3          -- $cmd
     3>>results perf stat --log-fd 3 --append -- $cmd



EXAMPLES
--------

+14 −0
Original line number Diff line number Diff line
@@ -196,6 +196,7 @@ static bool csv_output = false;
static bool			group				= false;
static const char		*output_name			= NULL;
static FILE			*output				= NULL;
static int			output_fd;

static volatile int done = 0;

@@ -1080,6 +1081,8 @@ static const struct option options[] = {
	OPT_STRING('o', "output", &output_name, "file",
		    "output file name"),
	OPT_BOOLEAN(0, "append", &append_file, "append to the output file"),
	OPT_INTEGER(0, "log-fd", &output_fd,
		    "log output to fd, instead of stderr"),
	OPT_END()
};

@@ -1166,6 +1169,10 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
	if (output_name && strcmp(output_name, "-"))
		output = NULL;

	if (output_name && output_fd) {
		fprintf(stderr, "cannot use both --output and --log-fd\n");
		usage_with_options(stat_usage, options);
	}
	if (!output) {
		struct timespec tm;
		mode = append_file ? "a" : "w";
@@ -1177,6 +1184,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
		}
		clock_gettime(CLOCK_REALTIME, &tm);
		fprintf(output, "# started on %s\n", ctime(&tm.tv_sec));
	} else if (output_fd != 2) {
		mode = append_file ? "a" : "w";
		output = fdopen(output_fd, mode);
		if (!output) {
			perror("Failed opening logfd");
			return -errno;
		}
	}

	if (csv_sep)