RE: [RFC PATCH v2 09/13] perf vendor events: Add JSON metrics for imx8mm DDR Perf

From: Joakim Zhang
Date: Mon Apr 20 2020 - 07:25:12 EST



> -----Original Message-----
> From: John Garry <john.garry@xxxxxxxxxx>
> Sent: 2020年4月20日 18:51
> To: Joakim Zhang <qiangqing.zhang@xxxxxxx>; peterz@xxxxxxxxxxxxx;
> mingo@xxxxxxxxxx; acme@xxxxxxxxxx; mark.rutland@xxxxxxx;
> alexander.shishkin@xxxxxxxxxxxxxxx; jolsa@xxxxxxxxxx;
> namhyung@xxxxxxxxxx; will@xxxxxxxxxx
> Cc: irogers@xxxxxxxxxx; ak@xxxxxxxxxxxxxxx; Linuxarm
> <linuxarm@xxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; Zhangshaokun
> <zhangshaokun@xxxxxxxxxxxxx>; robin.murphy@xxxxxxx;
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
> Subject: Re: [RFC PATCH v2 09/13] perf vendor events: Add JSON metrics for
> imx8mm DDR Perf
>
> On 20/04/2020 05:17, Joakim Zhang wrote:
> > However, it seems that there are small defects from metric.
> >
> > Firstly, could you help change "ScaleUnit": "9.765625e-4MB" into
> "ScaleUnit": "9.765625e-4KB", this is a mistake.
>
> ok
>
> >
> > Then, you can see that test is okay from 8MM. However, metric would add
> twice once time from 8QM which has two ddr perf(ddr0/ddr1), it looks
> incorrect.
> >
> > 8MM:
> > root@imx8mmevk:~# ./perf stat -v -a -I 1000 -M imx8mm_ddr_write.all
> > Using CPUID 0x00000000410fd030 metric expr imx8_ddr.write_cycles * 4 *
> > 4 for imx8mm_ddr_write.all found event imx8_ddr.write_cycles adding
> > {imx8_ddr.write_cycles}:W imx8_ddr.write_cycles ->
> > imx8_ddr0/event=0x2b/
> > imx8_ddr.write_cycles: 13153 1000495125 1000495125
> > # time counts unit events
> > 1.000476625 13153 imx8_ddr.write_cycles
> # 205.5 MB imx8mm_ddr_write.all
> > imx8_ddr.write_cycles: 3582 1000681375 1000681375
> > 2.001167750 3582 imx8_ddr.write_cycles
> # 56.0 MB imx8mm_ddr_write.all
> >
> >
> > 8QM:
> > root@imx8qmmek:~# ./perf stat -v -a -I 1000 -M imx8qm_ddr_read.all
>
> Note: for this example, I don't know why you didn't use imx8mm_ddr_write.all,
> as for your 8MM test, so we can compare the same.

Yes, I use the imx8mm_ddr_write.all, I just re-name the metric, change nothing else.

> > Using CPUID 0x00000000410fd030
> > metric expr imx8_ddr.read_cycles * 4 * 4 for imx8qm_ddr_read.all found
> > event imx8_ddr.read_cycles metric expr imx8_ddr.read_cycles * 4 * 4
> > for imx8qm_ddr_read.all found event imx8_ddr.read_cycles adding
> > {imx8_ddr.read_cycles}:W,{imx8_ddr.read_cycles}:W
> > imx8_ddr.read_cycles -> imx8_ddr0/event=0x2a/ imx8_ddr.read_cycles ->
> > imx8_ddr1/event=0x2a/ imx8_ddr.read_cycles -> imx8_ddr0/event=0x2a/
> > imx8_ddr.read_cycles -> imx8_ddr1/event=0x2a/
> > imx8_ddr.read_cycles: 22748 1000378750 1000378750
> > imx8_ddr.read_cycles: 24640 1000376625 1000376625
> > imx8_ddr.read_cycles: 22800 1000375125 1000375125
> > imx8_ddr.read_cycles: 24616 1000372625 1000372625
> > # time counts unit events
> > 1.000377250 47388 imx8_ddr.read_cycles
> # 740.4 MB imx8qm_ddr_read.all
> > 1.000377250 47416 imx8_ddr.read_cycles
> > imx8_ddr.read_cycles: 32672 1000454375 1000454375
> > imx8_ddr.read_cycles: 37888 1000457250 1000457250
> > imx8_ddr.read_cycles: 32736 1000460250 1000460250
> > imx8_ddr.read_cycles: 38012 1000463000 1000463000
> > 2.000812375 70560 imx8_ddr.read_cycles
> # 1102.5 MB imx8qm_ddr_read.all
> > 2.000812375 70748 imx8_ddr.read_cycles
> >
>
> I that is just how the aliases work. But how about trying:
>
> ./perf stat -v -a -I 1000 -M imx8_ddr0/imx8qm_ddr_read.all/
>
>
> for just ddr0
>
> I know that the following worked for non-metrics for aliases on a specific HW
> PMU, so I guess should also work for metrics:
>
> ./perf stat -e smmuv3_pmcg_200148020/smmuv3_pmcg.l1_tlb/

Yes, this can work for non-metrics, I tried before, it seems unsupported for metric.

You may misunderstand me, now I doesn't ask for a specific HW PMU(ddr0 or ddr1), the issue is that it would add and calculate twice when more than one HW PMU.

I also did below change which is implemented at my local side, but it can't work on your branch.
--- a/tools/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json
+++ b/tools/perf/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json
@@ -2,7 +2,7 @@
{
"BriefDescription": "bytes all masters read from ddr based on read-cycles event",
"MetricName": "imx8mm_ddr_read.all",
- "MetricExpr": "imx8_ddr.read_cycles * 4 * 4",
+ "MetricExpr": "imx8_ddr0\\/read\\-cycles\\/ * 4 * 4",
"ScaleUnit": "9.765625e-4MB",
"Unit": "imx8_ddr",
"Compat": "i.mx8mm"
@@ -10,9 +10,9 @@
{
"BriefDescription": "bytes all masters write to ddr based on write-cycles event",
"MetricName": "imx8mm_ddr_write.all",
- "MetricExpr": "imx8_ddr.write_cycles * 4 * 4",
+ "MetricExpr": "imx8_ddr0\\/read\\-cycles\\/ * 4 * 4",
"ScaleUnit": "9.765625e-4MB",
"Unit": "imx8_ddr",
"Compat": "i.mx8mm"
}
-]
\ No newline at end of file
+]

root@imx8qmmek:~# ./perf stat -v -a -I 1000 -M imx8mm_ddr_read.all
Using CPUID 0x00000000410fd080
metric expr imx8_ddr0\/read\-cycles\/ * 4 * 4 for imx8mm_ddr_read.all
found event imx8_ddr0
found event read-cycles
metric expr imx8_ddr0\/read\-cycles\/ * 4 * 4 for imx8mm_ddr_read.all
found event imx8_ddr0
found event read-cycles
adding {imx8_ddr0,read-cycles}:W,{imx8_ddr0,read-cycles}:W
event syntax error: '{imx8_ddr0,read-cycles}:W,{imx8_ddr0,read-cycles}:W'
\___ parser error

Usage: perf stat [<options>] [<command>]

-M, --metrics <metric/metric group list>
monitor specified metrics or metric groups (separated by ,)

Now the metricgroup can't parse above metric expression, it shouldn't be.

Best Regards,
Joakim Zhang
> Thanks,
> John