diff mbox series

[v3,3/9] perf mem: Support new memory event PERF_MEM_EVENTS__LOAD_STORE

Message ID 20201028063813.8562-4-leo.yan@linaro.org (mailing list archive)
State New, archived
Headers show
Series perf mem/c2c: Support AUX trace | expand

Commit Message

Leo Yan Oct. 28, 2020, 6:38 a.m. UTC
On the architectures with perf memory profiling, two types of hardware
events have been supported: load and store; if want to profile memory
for both load and store operations, the tool will use these two events
at the same time, the usage is:

  # perf mem record -t load,store -- uname

But this cannot be applied for AUX tracing event, the same PMU event can
be used to only trace memory load, or only memory store, or trace for
both memory load and store.

This patch introduces a new event PERF_MEM_EVENTS__LOAD_STORE, which is
used to support the event which can record both memory load and store
operations, thus a new type option "ldst" is added:

  # perf mem record -t ldst -- uname

Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
 tools/perf/builtin-mem.c     | 13 ++++++++++---
 tools/perf/util/mem-events.c | 13 ++++++++++++-
 tools/perf/util/mem-events.h |  1 +
 3 files changed, 23 insertions(+), 4 deletions(-)

Comments

Jiri Olsa Oct. 31, 2020, 8:23 p.m. UTC | #1
On Wed, Oct 28, 2020 at 02:38:07PM +0800, Leo Yan wrote:

SNIP

>  		struct stat st;
>  
> +		/*
> +		 * If the event entry isn't valid, skip initialization
> +		 * and "e->supported" will keep false.
> +		 */
> +		if (!e->tag)
> +			continue;
> +
>  		scnprintf(path, PATH_MAX, "%s/devices/%s",
>  			  mnt, e->sysfs_name);
>  
> @@ -123,7 +134,7 @@ void perf_mem_events__list(void)
>  		struct perf_mem_event *e = perf_mem_events__ptr(j);
>  
>  		fprintf(stderr, "%-13s%-*s%s\n",
> -			e->tag,
> +			e->tag ? e->tag : "",

nit, could be:          e->tag ?: "",

jirka

>  			verbose > 0 ? 25 : 0,
>  			verbose > 0 ? perf_mem_events__name(j) : "",
>  			e->supported ? ": available" : "");
> diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
> index 726a9c8103e4..5ef178278909 100644
> --- a/tools/perf/util/mem-events.h
> +++ b/tools/perf/util/mem-events.h
> @@ -28,6 +28,7 @@ struct mem_info {
>  enum {
>  	PERF_MEM_EVENTS__LOAD,
>  	PERF_MEM_EVENTS__STORE,
> +	PERF_MEM_EVENTS__LOAD_STORE,
>  	PERF_MEM_EVENTS__MAX,
>  };
>  
> -- 
> 2.17.1
>
Leo Yan Nov. 2, 2020, 9:38 a.m. UTC | #2
On Sat, Oct 31, 2020 at 09:23:07PM +0100, Jiri Olsa wrote:
> On Wed, Oct 28, 2020 at 02:38:07PM +0800, Leo Yan wrote:
> 
> SNIP
> 
> >  		struct stat st;
> >  
> > +		/*
> > +		 * If the event entry isn't valid, skip initialization
> > +		 * and "e->supported" will keep false.
> > +		 */
> > +		if (!e->tag)
> > +			continue;
> > +
> >  		scnprintf(path, PATH_MAX, "%s/devices/%s",
> >  			  mnt, e->sysfs_name);
> >  
> > @@ -123,7 +134,7 @@ void perf_mem_events__list(void)
> >  		struct perf_mem_event *e = perf_mem_events__ptr(j);
> >  
> >  		fprintf(stderr, "%-13s%-*s%s\n",
> > -			e->tag,
> > +			e->tag ? e->tag : "",
> 
> nit, could be:          e->tag ?: "",

Will do.

Thanks,
Leo

> >  			verbose > 0 ? 25 : 0,
> >  			verbose > 0 ? perf_mem_events__name(j) : "",
> >  			e->supported ? ": available" : "");
> > diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
> > index 726a9c8103e4..5ef178278909 100644
> > --- a/tools/perf/util/mem-events.h
> > +++ b/tools/perf/util/mem-events.h
> > @@ -28,6 +28,7 @@ struct mem_info {
> >  enum {
> >  	PERF_MEM_EVENTS__LOAD,
> >  	PERF_MEM_EVENTS__STORE,
> > +	PERF_MEM_EVENTS__LOAD_STORE,
> >  	PERF_MEM_EVENTS__MAX,
> >  };
> >  
> > -- 
> > 2.17.1
> > 
>
diff mbox series

Patch

diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c
index 9a7df8d01296..31144f586e77 100644
--- a/tools/perf/builtin-mem.c
+++ b/tools/perf/builtin-mem.c
@@ -19,8 +19,9 @@ 
 #include "util/symbol.h"
 #include <linux/err.h>
 
-#define MEM_OPERATION_LOAD	0x1
-#define MEM_OPERATION_STORE	0x2
+#define MEM_OPERATION_LOAD		0x1
+#define MEM_OPERATION_STORE		0x2
+#define MEM_OPERATION_LOAD_STORE	0x4
 
 struct perf_mem {
 	struct perf_tool	tool;
@@ -97,6 +98,11 @@  static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)
 		e->record = true;
 	}
 
+	if (mem->operation & MEM_OPERATION_LOAD_STORE) {
+		e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD_STORE);
+		e->record = true;
+	}
+
 	e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD);
 	if (e->record)
 		rec_argv[i++] = "-W";
@@ -326,6 +332,7 @@  struct mem_mode {
 static const struct mem_mode mem_modes[]={
 	MEM_OPT("load", MEM_OPERATION_LOAD),
 	MEM_OPT("store", MEM_OPERATION_STORE),
+	MEM_OPT("ldst", MEM_OPERATION_LOAD_STORE),
 	MEM_END
 };
 
@@ -405,7 +412,7 @@  int cmd_mem(int argc, const char **argv)
 	};
 	const struct option mem_options[] = {
 	OPT_CALLBACK('t', "type", &mem.operation,
-		   "type", "memory operations(load,store) Default load,store",
+		   "type", "memory operations(load,store,ldst) Default load,store",
 		    parse_mem_ops),
 	OPT_BOOLEAN('D', "dump-raw-samples", &mem.dump_raw,
 		    "dump raw samples in ASCII"),
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index 7a5a0d699e27..2e82b4e78f29 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -20,6 +20,7 @@  unsigned int perf_mem_events__loads_ldlat = 30;
 static struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
 	E("ldlat-loads",	"cpu/mem-loads,ldlat=%u/P",	"cpu/events/mem-loads"),
 	E("ldlat-stores",	"cpu/mem-stores/P",		"cpu/events/mem-stores"),
+	E(NULL,			NULL,				NULL),
 };
 #undef E
 
@@ -75,6 +76,9 @@  int perf_mem_events__parse(const char *str)
 		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
 			struct perf_mem_event *e = perf_mem_events__ptr(j);
 
+			if (!e->tag)
+				continue;
+
 			if (strstr(e->tag, tok))
 				e->record = found = true;
 		}
@@ -105,6 +109,13 @@  int perf_mem_events__init(void)
 		struct perf_mem_event *e = perf_mem_events__ptr(j);
 		struct stat st;
 
+		/*
+		 * If the event entry isn't valid, skip initialization
+		 * and "e->supported" will keep false.
+		 */
+		if (!e->tag)
+			continue;
+
 		scnprintf(path, PATH_MAX, "%s/devices/%s",
 			  mnt, e->sysfs_name);
 
@@ -123,7 +134,7 @@  void perf_mem_events__list(void)
 		struct perf_mem_event *e = perf_mem_events__ptr(j);
 
 		fprintf(stderr, "%-13s%-*s%s\n",
-			e->tag,
+			e->tag ? e->tag : "",
 			verbose > 0 ? 25 : 0,
 			verbose > 0 ? perf_mem_events__name(j) : "",
 			e->supported ? ": available" : "");
diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h
index 726a9c8103e4..5ef178278909 100644
--- a/tools/perf/util/mem-events.h
+++ b/tools/perf/util/mem-events.h
@@ -28,6 +28,7 @@  struct mem_info {
 enum {
 	PERF_MEM_EVENTS__LOAD,
 	PERF_MEM_EVENTS__STORE,
+	PERF_MEM_EVENTS__LOAD_STORE,
 	PERF_MEM_EVENTS__MAX,
 };