All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Jiri Olsa <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: acme@redhat.com, namhyung@kernel.org, jolsa@kernel.org,
	mingo@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org,
	ak@linux.intel.com, tglx@linutronix.de, eranian@google.com,
	dsahern@gmail.com, a.p.zijlstra@chello.nl
Subject: [tip:perf/core] perf mem: Add -e record option
Date: Wed, 24 Feb 2016 21:43:01 -0800	[thread overview]
Message-ID: <tip-ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2@git.kernel.org> (raw)
In-Reply-To: <1455525293-8671-6-git-send-email-jolsa@kernel.org>

Commit-ID:  ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2
Gitweb:     http://git.kernel.org/tip/ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Mon, 15 Feb 2016 09:34:35 +0100
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 23 Feb 2016 12:15:59 -0300

perf mem: Add -e record option

Adding -e option for perf mem record command, to be able to specify
memory event directly.

Get list of available events:

  $ perf mem record -e list
  ldlat-loads
  ldlat-stores

Monitor ldlat-loads:
  $ perf mem record -e ldlat-loads true

Committer notes:

Further testing:

  # perf mem record -e ldlat-loads true
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.020 MB perf.data (10 samples) ]
  # perf evlist
  cpu/mem-loads,ldlat=30/P
  #

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1455525293-8671-6-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-mem.c     | 63 +++++++++++++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++---
 tools/perf/util/mem-events.h |  3 +++
 3 files changed, 106 insertions(+), 7 deletions(-)

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 36c56a4..b3f8a89 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -7,6 +7,7 @@
 #include "util/session.h"
 #include "util/data.h"
 #include "util/mem-events.h"
+#include "util/debug.h"
 
 #define MEM_OPERATION_LOAD	0x1
 #define MEM_OPERATION_STORE	0x2
@@ -22,11 +23,55 @@ struct perf_mem {
 	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
 };
 
+static int parse_record_events(const struct option *opt,
+			       const char *str, int unset __maybe_unused)
+{
+	struct perf_mem *mem = *(struct perf_mem **)opt->value;
+	int j;
+
+	if (strcmp(str, "list")) {
+		if (!perf_mem_events__parse(str)) {
+			mem->operation = 0;
+			return 0;
+		}
+		exit(-1);
+	}
+
+	for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+		struct perf_mem_event *e = &perf_mem_events[j];
+
+		fprintf(stderr, "%-20s%s",
+			e->tag, verbose ? "" : "\n");
+		if (verbose)
+			fprintf(stderr, " [%s]\n", e->name);
+	}
+	exit(0);
+}
+
+static const char * const __usage[] = {
+	"perf mem record [<options>] [<command>]",
+	"perf mem record [<options>] -- <command> [<options>]",
+	NULL
+};
+
+static const char * const *record_mem_usage = __usage;
+
 static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 {
 	int rec_argc, i = 0, j;
 	const char **rec_argv;
 	int ret;
+	struct option options[] = {
+	OPT_CALLBACK('e', "event", &mem, "event",
+		     "event selector. use 'perf mem record -e list' to list available events",
+		     parse_record_events),
+	OPT_INCR('v', "verbose", &verbose,
+		 "be more verbose (show counter open errors, etc)"),
+	OPT_END()
+	};
+
+	argc = parse_options(argc, argv, options, record_mem_usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
 
 	rec_argc = argc + 7; /* max number of arguments */
 	rec_argv = calloc(rec_argc + 1, sizeof(char *));
@@ -35,10 +80,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 
 	rec_argv[i++] = "record";
 
-	if (mem->operation & MEM_OPERATION_LOAD) {
+	if (mem->operation & MEM_OPERATION_LOAD)
 		perf_mem_events[PERF_MEM_EVENTS__LOAD].record = true;
+
+	if (perf_mem_events[PERF_MEM_EVENTS__LOAD].record)
 		rec_argv[i++] = "-W";
-	}
 
 	rec_argv[i++] = "-d";
 
@@ -50,9 +96,19 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		rec_argv[i++] = perf_mem_events[j].name;
 	};
 
-	for (j = 1; j < argc; j++, i++)
+	for (j = 0; j < argc; j++, i++)
 		rec_argv[i] = argv[j];
 
+	if (verbose > 0) {
+		pr_debug("calling: record ");
+
+		while (rec_argv[j]) {
+			pr_debug("%s ", rec_argv[j]);
+			j++;
+		}
+		pr_debug("\n");
+	}
+
 	ret = cmd_record(i, rec_argv, NULL);
 	free(rec_argv);
 	return ret;
@@ -299,7 +355,6 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
 		NULL
 	};
 
-
 	argc = parse_options_subcommand(argc, argv, mem_options, mem_subcommands,
 					mem_usage, PARSE_OPT_STOP_AT_NON_OPTION);
 
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index c6ba0a1..b1507c0 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -1,10 +1,51 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
 #include "mem-events.h"
+#include "debug.h"
 
-#define E(n) { .name = n }
+#define E(t, n) { .tag = t, .name = n }
 
 struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
-	E("cpu/mem-loads,ldlat=30/P"),
-	E("cpu/mem-stores/P"),
+	E("ldlat-loads",	"cpu/mem-loads,ldlat=30/P"),
+	E("ldlat-stores",	"cpu/mem-stores/P"),
 };
 
 #undef E
+
+int perf_mem_events__parse(const char *str)
+{
+	char *tok, *saveptr = NULL;
+	bool found = false;
+	char *buf;
+	int j;
+
+	/* We need buffer that we know we can write to. */
+	buf = malloc(strlen(str) + 1);
+	if (!buf)
+		return -ENOMEM;
+
+	strcpy(buf, str);
+
+	tok = strtok_r((char *)buf, ",", &saveptr);
+
+	while (tok) {
+		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
+			struct perf_mem_event *e = &perf_mem_events[j];
+
+			if (strstr(e->tag, tok))
+				e->record = found = true;
+		}
+
+		tok = strtok_r(NULL, ",", &saveptr);
+	}
+
+	free(buf);
+
+	if (found)
+		return 0;
+
+	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
+	return -1;
+}
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index c97b214..2995bae 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -5,6 +5,7 @@
 
 struct perf_mem_event {
 	bool		record;
+	const char	*tag;
 	const char	*name;
 };
 
@@ -16,4 +17,6 @@ enum {
 
 extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];
 
+int perf_mem_events__parse(const char *str);
+
 #endif /* __PERF_MEM_EVENTS_H */

  reply	other threads:[~2016-02-25  6:29 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-15  8:34 [PATCH 00/23] perf tools: Several memory events updates Jiri Olsa
2016-02-15  8:34 ` [PATCH 01/23] perf record: Add --all-user/--all-kernel options Jiri Olsa
2016-02-16 16:56   ` Arnaldo Carvalho de Melo
2016-02-17  3:10     ` Andi Kleen
2016-02-17 14:26       ` Arnaldo Carvalho de Melo
2016-02-17 15:31         ` Andi Kleen
2016-02-17 14:39     ` Jiri Olsa
2016-02-17 14:55       ` Arnaldo Carvalho de Melo
2016-02-20 11:34   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 02/23] perf tools: Make cl_address global Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 03/23] perf tools: Introduce cl_offset function Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 04/23] perf tools: Add monitored events array Jiri Olsa
2016-02-23 15:10   ` Arnaldo Carvalho de Melo
2016-02-23 15:18     ` Jiri Olsa
2016-02-25  5:42   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 05/23] perf mem: Add -e record option Jiri Olsa
2016-02-25  5:43   ` tip-bot for Jiri Olsa [this message]
2016-02-15  8:34 ` [PATCH 06/23] perf mem: Check for memory events support Jiri Olsa
2016-02-23 15:18   ` Arnaldo Carvalho de Melo
2016-02-23 15:24     ` Arnaldo Carvalho de Melo
2016-02-23 15:42       ` Jiri Olsa
2016-02-23 15:29     ` Jiri Olsa
2016-02-23 15:34       ` Arnaldo Carvalho de Melo
2016-02-15  8:34 ` [PATCH 07/23] perf mem: Introduce perf_mem_events__name function Jiri Olsa
2016-02-15  8:34 ` [PATCH 08/23] perf mem: Add -l/--ldlat option Jiri Olsa
2016-02-15  8:34 ` [PATCH 09/23] perf mem: Add -u/-k options Jiri Olsa
2016-02-15  8:34 ` [PATCH 10/23] perf x86 intel: Add DATALA events into sysfs Jiri Olsa
2016-02-15  8:34 ` [PATCH 11/23] perf mem: Add Intel DATALA memory events Jiri Olsa
2016-02-15  8:34 ` [PATCH 12/23] perf tools: Use ARRAY_SIZE in mem sort display functions Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 13/23] perf tools: Introduce perf_mem__tlb_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 14/23] perf tools: Introduce perf_mem__lvl_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 15/23] perf tools: Introduce perf_mem__snp_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 16/23] perf tools: Introduce perf_mem__lck_scnprintf function Jiri Olsa
2016-02-15  8:34 ` [PATCH 17/23] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Jiri Olsa
2016-02-15  8:34 ` [PATCH 18/23] perf tools: Change perf_mem__lvl_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 19/23] perf tools: Change perf_mem__snp_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 20/23] perf tools: Change perf_mem__lck_scnprintf " Jiri Olsa
2016-02-15  8:34 ` [PATCH 21/23] perf script: Add data_src and weight column definitions Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 22/23] perf script: Display addr/data_src/weight columns for raw events Jiri Olsa
2016-02-25  5:43   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-02-15  8:34 ` [PATCH 23/23] perf script: Display data_src values Jiri Olsa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.