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

Commit cfe0d8ba authored by Runzhen Wang's avatar Runzhen Wang Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Make Power7 events available for perf



Power7 supports over 530 different perf events but only a small subset
of these can be specified by name, for the remaining events, we must
specify them by their raw code:

        perf stat -e r2003c <application>

This patch makes all the POWER7 events available in sysfs.  So we can
instead specify these as:

        perf stat -e 'cpu/PM_CMPLU_STALL_DFU/' <application>

where PM_CMPLU_STALL_DFU is the r2003c in previous example.

Before this patch is applied, the size of power7-pmu.o is:

$ size arch/powerpc/perf/power7-pmu.o
   text	   data	    bss	    dec	    hex	filename
   3073	   2720	      0	   5793	   16a1	arch/powerpc/perf/power7-pmu.o

and after the patch is applied, it is:

$ size arch/powerpc/perf/power7-pmu.o
   text	   data	    bss	    dec	    hex	filename
  15950	  31112	      0	  47062	   b7d6	arch/powerpc/perf/power7-pmu.o

For the run time overhead, I use two scripts, one is "event_name.sh",
which contains 50 event names, it looks like:

 # ./perf record  -e 'cpu/PM_CMPLU_STALL_DFU/' -e .....  /bin/sleep 1

the other one is named "event_code.sh" which use corresponding  events
raw
code instead of events names, it looks like:

 # ./perf record -e r2003c -e ......  /bin/sleep 1

below is the result.

Using events name:

[root@localhost perf]# time ./event_name.sh
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.002 MB perf.data (~102 samples) ]

real	0m1.192s
user	0m0.028s
sys	0m0.106s

Using events raw code:

[root@localhost perf]# time ./event_code.sh
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.003 MB perf.data (~112 samples) ]

real	0m1.198s
user	0m0.028s
sys	0m0.105s

Signed-off-by: default avatarRunzhen Wang <runzhen@linux.vnet.ibm.com>
Acked-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Cc: icycoder@gmail.com
Cc: linuxppc-dev@lists.ozlabs.org
Cc: Michael Ellerman <michael@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Runzhen Wang <runzhew@clemson.edu>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/r/1372407297-6996-3-git-send-email-runzhen@linux.vnet.ibm.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d4ae0a6f
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -136,11 +136,11 @@ extern ssize_t power_events_sysfs_show(struct device *dev,
#define	EVENT_PTR(_id, _suffix)		&EVENT_VAR(_id, _suffix).attr.attr
#define	EVENT_PTR(_id, _suffix)		&EVENT_VAR(_id, _suffix).attr.attr


#define	EVENT_ATTR(_name, _id, _suffix)					\
#define	EVENT_ATTR(_name, _id, _suffix)					\
	PMU_EVENT_ATTR(_name, EVENT_VAR(_id, _suffix), PME_PM_##_id,	\
	PMU_EVENT_ATTR(_name, EVENT_VAR(_id, _suffix), PME_##_id,	\
			power_events_sysfs_show)
			power_events_sysfs_show)


#define	GENERIC_EVENT_ATTR(_name, _id)	EVENT_ATTR(_name, _id, _g)
#define	GENERIC_EVENT_ATTR(_name, _id)	EVENT_ATTR(_name, _id, _g)
#define	GENERIC_EVENT_PTR(_id)		EVENT_PTR(_id, _g)
#define	GENERIC_EVENT_PTR(_id)		EVENT_PTR(_id, _g)


#define	POWER_EVENT_ATTR(_name, _id)	EVENT_ATTR(PM_##_name, _id, _p)
#define	POWER_EVENT_ATTR(_name, _id)	EVENT_ATTR(_name, _id, _p)
#define	POWER_EVENT_PTR(_id)		EVENT_PTR(_id, _p)
#define	POWER_EVENT_PTR(_id)		EVENT_PTR(_id, _p)
+548 −0

File added.

Preview size limit exceeded, changes collapsed.

+32 −116
Original line number Original line Diff line number Diff line
@@ -53,37 +53,13 @@
/*
/*
 * Power7 event codes.
 * Power7 event codes.
 */
 */
#define	PME_PM_CYC			0x1e
#define EVENT(_name, _code) \
#define	PME_PM_GCT_NOSLOT_CYC		0x100f8
	PME_##_name = _code,
#define	PME_PM_CMPLU_STALL		0x4000a

#define	PME_PM_INST_CMPL		0x2
enum {
#define	PME_PM_LD_REF_L1		0xc880
#include "power7-events-list.h"
#define	PME_PM_LD_MISS_L1		0x400f0
};
#define	PME_PM_BRU_FIN			0x10068
#undef EVENT
#define	PME_PM_BR_MPRED			0x400f6

#define PME_PM_CMPLU_STALL_FXU			0x20014
#define PME_PM_CMPLU_STALL_DIV			0x40014
#define PME_PM_CMPLU_STALL_SCALAR		0x40012
#define PME_PM_CMPLU_STALL_SCALAR_LONG		0x20018
#define PME_PM_CMPLU_STALL_VECTOR		0x2001c
#define PME_PM_CMPLU_STALL_VECTOR_LONG		0x4004a
#define PME_PM_CMPLU_STALL_LSU			0x20012
#define PME_PM_CMPLU_STALL_REJECT		0x40016
#define PME_PM_CMPLU_STALL_ERAT_MISS		0x40018
#define PME_PM_CMPLU_STALL_DCACHE_MISS		0x20016
#define PME_PM_CMPLU_STALL_STORE		0x2004a
#define PME_PM_CMPLU_STALL_THRD			0x1001c
#define PME_PM_CMPLU_STALL_IFU			0x4004c
#define PME_PM_CMPLU_STALL_BRU			0x4004e
#define PME_PM_GCT_NOSLOT_IC_MISS		0x2001a
#define PME_PM_GCT_NOSLOT_BR_MPRED		0x4001a
#define PME_PM_GCT_NOSLOT_BR_MPRED_IC_MISS	0x4001c
#define PME_PM_GRP_CMPL				0x30004
#define PME_PM_1PLUS_PPC_CMPL			0x100f2
#define PME_PM_CMPLU_STALL_DFU			0x2003c
#define PME_PM_RUN_CYC				0x200f4
#define PME_PM_RUN_INST_CMPL			0x400fa


/*
/*
 * Layout of constraint bits:
 * Layout of constraint bits:
@@ -398,96 +374,36 @@ static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
};
};




GENERIC_EVENT_ATTR(cpu-cycles,			CYC);
GENERIC_EVENT_ATTR(cpu-cycles,			PM_CYC);
GENERIC_EVENT_ATTR(stalled-cycles-frontend,	GCT_NOSLOT_CYC);
GENERIC_EVENT_ATTR(stalled-cycles-frontend,	PM_GCT_NOSLOT_CYC);
GENERIC_EVENT_ATTR(stalled-cycles-backend,	CMPLU_STALL);
GENERIC_EVENT_ATTR(stalled-cycles-backend,	PM_CMPLU_STALL);
GENERIC_EVENT_ATTR(instructions,		INST_CMPL);
GENERIC_EVENT_ATTR(instructions,		PM_INST_CMPL);
GENERIC_EVENT_ATTR(cache-references,		LD_REF_L1);
GENERIC_EVENT_ATTR(cache-references,		PM_LD_REF_L1);
GENERIC_EVENT_ATTR(cache-misses,		LD_MISS_L1);
GENERIC_EVENT_ATTR(cache-misses,		PM_LD_MISS_L1);
GENERIC_EVENT_ATTR(branch-instructions,		BRU_FIN);
GENERIC_EVENT_ATTR(branch-instructions,		PM_BRU_FIN);
GENERIC_EVENT_ATTR(branch-misses,		BR_MPRED);
GENERIC_EVENT_ATTR(branch-misses,		PM_BR_MPRED);


POWER_EVENT_ATTR(CYC,				CYC);
#define EVENT(_name, _code)     POWER_EVENT_ATTR(_name, _name);
POWER_EVENT_ATTR(GCT_NOSLOT_CYC,		GCT_NOSLOT_CYC);
#include "power7-events-list.h"
POWER_EVENT_ATTR(CMPLU_STALL,			CMPLU_STALL);
#undef EVENT
POWER_EVENT_ATTR(INST_CMPL,			INST_CMPL);

POWER_EVENT_ATTR(LD_REF_L1,			LD_REF_L1);
#define EVENT(_name, _code)     POWER_EVENT_PTR(_name),
POWER_EVENT_ATTR(LD_MISS_L1,			LD_MISS_L1);
POWER_EVENT_ATTR(BRU_FIN,			BRU_FIN)
POWER_EVENT_ATTR(BR_MPRED,			BR_MPRED);

POWER_EVENT_ATTR(CMPLU_STALL_FXU,		CMPLU_STALL_FXU);
POWER_EVENT_ATTR(CMPLU_STALL_DIV,		CMPLU_STALL_DIV);
POWER_EVENT_ATTR(CMPLU_STALL_SCALAR,		CMPLU_STALL_SCALAR);
POWER_EVENT_ATTR(CMPLU_STALL_SCALAR_LONG,	CMPLU_STALL_SCALAR_LONG);
POWER_EVENT_ATTR(CMPLU_STALL_VECTOR,		CMPLU_STALL_VECTOR);
POWER_EVENT_ATTR(CMPLU_STALL_VECTOR_LONG,	CMPLU_STALL_VECTOR_LONG);
POWER_EVENT_ATTR(CMPLU_STALL_LSU,		CMPLU_STALL_LSU);
POWER_EVENT_ATTR(CMPLU_STALL_REJECT,		CMPLU_STALL_REJECT);

POWER_EVENT_ATTR(CMPLU_STALL_ERAT_MISS,		CMPLU_STALL_ERAT_MISS);
POWER_EVENT_ATTR(CMPLU_STALL_DCACHE_MISS,	CMPLU_STALL_DCACHE_MISS);
POWER_EVENT_ATTR(CMPLU_STALL_STORE,		CMPLU_STALL_STORE);
POWER_EVENT_ATTR(CMPLU_STALL_THRD,		CMPLU_STALL_THRD);
POWER_EVENT_ATTR(CMPLU_STALL_IFU,		CMPLU_STALL_IFU);
POWER_EVENT_ATTR(CMPLU_STALL_BRU,		CMPLU_STALL_BRU);
POWER_EVENT_ATTR(GCT_NOSLOT_IC_MISS,		GCT_NOSLOT_IC_MISS);

POWER_EVENT_ATTR(GCT_NOSLOT_BR_MPRED,		GCT_NOSLOT_BR_MPRED);
POWER_EVENT_ATTR(GCT_NOSLOT_BR_MPRED_IC_MISS,	GCT_NOSLOT_BR_MPRED_IC_MISS);
POWER_EVENT_ATTR(GRP_CMPL,			GRP_CMPL);
POWER_EVENT_ATTR(1PLUS_PPC_CMPL,		1PLUS_PPC_CMPL);
POWER_EVENT_ATTR(CMPLU_STALL_DFU,		CMPLU_STALL_DFU);
POWER_EVENT_ATTR(RUN_CYC,			RUN_CYC);
POWER_EVENT_ATTR(RUN_INST_CMPL,			RUN_INST_CMPL);


static struct attribute *power7_events_attr[] = {
static struct attribute *power7_events_attr[] = {
	GENERIC_EVENT_PTR(CYC),
	GENERIC_EVENT_PTR(PM_CYC),
	GENERIC_EVENT_PTR(GCT_NOSLOT_CYC),
	GENERIC_EVENT_PTR(PM_GCT_NOSLOT_CYC),
	GENERIC_EVENT_PTR(CMPLU_STALL),
	GENERIC_EVENT_PTR(PM_CMPLU_STALL),
	GENERIC_EVENT_PTR(INST_CMPL),
	GENERIC_EVENT_PTR(PM_INST_CMPL),
	GENERIC_EVENT_PTR(LD_REF_L1),
	GENERIC_EVENT_PTR(PM_LD_REF_L1),
	GENERIC_EVENT_PTR(LD_MISS_L1),
	GENERIC_EVENT_PTR(PM_LD_MISS_L1),
	GENERIC_EVENT_PTR(BRU_FIN),
	GENERIC_EVENT_PTR(PM_BRU_FIN),
	GENERIC_EVENT_PTR(BR_MPRED),
	GENERIC_EVENT_PTR(PM_BR_MPRED),


	POWER_EVENT_PTR(CYC),
	#include "power7-events-list.h"
	POWER_EVENT_PTR(GCT_NOSLOT_CYC),
	#undef EVENT
	POWER_EVENT_PTR(CMPLU_STALL),
	POWER_EVENT_PTR(INST_CMPL),
	POWER_EVENT_PTR(LD_REF_L1),
	POWER_EVENT_PTR(LD_MISS_L1),
	POWER_EVENT_PTR(BRU_FIN),
	POWER_EVENT_PTR(BR_MPRED),

	POWER_EVENT_PTR(CMPLU_STALL_FXU),
	POWER_EVENT_PTR(CMPLU_STALL_DIV),
	POWER_EVENT_PTR(CMPLU_STALL_SCALAR),
	POWER_EVENT_PTR(CMPLU_STALL_SCALAR_LONG),
	POWER_EVENT_PTR(CMPLU_STALL_VECTOR),
	POWER_EVENT_PTR(CMPLU_STALL_VECTOR_LONG),
	POWER_EVENT_PTR(CMPLU_STALL_LSU),
	POWER_EVENT_PTR(CMPLU_STALL_REJECT),

	POWER_EVENT_PTR(CMPLU_STALL_ERAT_MISS),
	POWER_EVENT_PTR(CMPLU_STALL_DCACHE_MISS),
	POWER_EVENT_PTR(CMPLU_STALL_STORE),
	POWER_EVENT_PTR(CMPLU_STALL_THRD),
	POWER_EVENT_PTR(CMPLU_STALL_IFU),
	POWER_EVENT_PTR(CMPLU_STALL_BRU),
	POWER_EVENT_PTR(GCT_NOSLOT_IC_MISS),
	POWER_EVENT_PTR(GCT_NOSLOT_BR_MPRED),

	POWER_EVENT_PTR(GCT_NOSLOT_BR_MPRED_IC_MISS),
	POWER_EVENT_PTR(GRP_CMPL),
	POWER_EVENT_PTR(1PLUS_PPC_CMPL),
	POWER_EVENT_PTR(CMPLU_STALL_DFU),
	POWER_EVENT_PTR(RUN_CYC),
	POWER_EVENT_PTR(RUN_INST_CMPL),
	NULL
	NULL
};
};



static struct attribute_group power7_pmu_events_group = {
static struct attribute_group power7_pmu_events_group = {
	.name = "events",
	.name = "events",
	.attrs = power7_events_attr,
	.attrs = power7_events_attr,