2020-09-01 16:07:28

by Rob Clark

[permalink] [raw]
Subject: [PATCH 0/3] drm/msm: More GPU tracepoints

From: Rob Clark <[email protected]>

Various extra tracepoints that I've been collecting.

Rob Clark (3):
drm/msm/gpu: Add GPU freq_change traces
drm/msm: Convert shrinker msgs to tracepoints
drm/msm/gpu: Add suspend/resume tracepoints

drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 3 +
drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++
drivers/gpu/drm/msm/msm_gem_shrinker.c | 5 +-
drivers/gpu/drm/msm/msm_gpu.c | 4 ++
drivers/gpu/drm/msm/msm_gpu_trace.h | 83 ++++++++++++++++++++++++++
5 files changed, 97 insertions(+), 2 deletions(-)

--
2.26.2


2020-09-01 16:08:05

by Rob Clark

[permalink] [raw]
Subject: [PATCH 1/3] drm/msm/gpu: Add GPU freq_change traces

From: Rob Clark <[email protected]>

Technically the GMU specific one is a bit redundant, but it was useful
to track down a bug.

Signed-off-by: Rob Clark <[email protected]>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 3 +++
drivers/gpu/drm/msm/msm_gpu.c | 2 ++
drivers/gpu/drm/msm/msm_gpu_trace.h | 31 +++++++++++++++++++++++++++
3 files changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 46a29e383bfd..ab1e9eb619e0 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -11,6 +11,7 @@
#include "a6xx_gpu.h"
#include "a6xx_gmu.xml.h"
#include "msm_gem.h"
+#include "msm_gpu_trace.h"
#include "msm_mmu.h"

static void a6xx_gmu_fault(struct a6xx_gmu *gmu)
@@ -124,6 +125,8 @@ void a6xx_gmu_set_freq(struct msm_gpu *gpu, struct dev_pm_opp *opp)
gmu->current_perf_index = perf_index;
gmu->freq = gmu->gpu_freqs[perf_index];

+ trace_msm_gmu_freq_change(gmu->freq, perf_index);
+
/*
* This can get called from devfreq while the hardware is idle. Don't
* bring up the power if it isn't already active
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index d5645472b25d..b02866527386 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -32,6 +32,8 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,
if (IS_ERR(opp))
return PTR_ERR(opp);

+ trace_msm_gpu_freq_change(dev_pm_opp_get_freq(opp));
+
if (gpu->funcs->gpu_set_freq)
gpu->funcs->gpu_set_freq(gpu, opp);
else
diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h b/drivers/gpu/drm/msm/msm_gpu_trace.h
index 122b84789238..07572ab179fa 100644
--- a/drivers/gpu/drm/msm/msm_gpu_trace.h
+++ b/drivers/gpu/drm/msm/msm_gpu_trace.h
@@ -83,6 +83,37 @@ TRACE_EVENT(msm_gpu_submit_retired,
__entry->start_ticks, __entry->end_ticks)
);

+
+TRACE_EVENT(msm_gpu_freq_change,
+ TP_PROTO(u32 freq),
+ TP_ARGS(freq),
+ TP_STRUCT__entry(
+ __field(u32, freq)
+ ),
+ TP_fast_assign(
+ /* trace freq in MHz to match intel_gpu_freq_change, to make life easier
+ * for userspace
+ */
+ __entry->freq = DIV_ROUND_UP(freq, 1000000);
+ ),
+ TP_printk("new_freq=%u", __entry->freq)
+);
+
+
+TRACE_EVENT(msm_gmu_freq_change,
+ TP_PROTO(u32 freq, u32 perf_index),
+ TP_ARGS(freq, perf_index),
+ TP_STRUCT__entry(
+ __field(u32, freq)
+ __field(u32, perf_index)
+ ),
+ TP_fast_assign(
+ __entry->freq = freq;
+ __entry->perf_index = perf_index;
+ ),
+ TP_printk("freq=%u, perf_index=%u", __entry->freq, __entry->perf_index)
+);
+
#endif

#undef TRACE_INCLUDE_PATH
--
2.26.2

2020-09-01 16:08:35

by Rob Clark

[permalink] [raw]
Subject: [PATCH 3/3] drm/msm/gpu: Add suspend/resume tracepoints

From: Rob Clark <[email protected]>

Signed-off-by: Rob Clark <[email protected]>
---
I'm not sure if there is a better way to do no-arg tracepoints? The
trace framework seems to go out of it's way to make this difficult.
Or maybe there is a more obvious thing that I'm not seeing.

drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++++
drivers/gpu/drm/msm/msm_gpu.c | 2 ++
drivers/gpu/drm/msm/msm_gpu_trace.h | 26 ++++++++++++++++++++++++++
3 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
index c5a3e4d4c007..2de280e45077 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
@@ -923,6 +923,8 @@ static int a6xx_pm_resume(struct msm_gpu *gpu)

gpu->needs_hw_init = true;

+ trace_msm_gpu_resume(0);
+
ret = a6xx_gmu_resume(a6xx_gpu);
if (ret)
return ret;
@@ -937,6 +939,8 @@ static int a6xx_pm_suspend(struct msm_gpu *gpu)
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);

+ trace_msm_gpu_suspend(0);
+
devfreq_suspend_device(gpu->devfreq.devfreq);

return a6xx_gmu_stop(a6xx_gpu);
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index b02866527386..5ceb2a966a87 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -202,6 +202,7 @@ int msm_gpu_pm_resume(struct msm_gpu *gpu)
int ret;

DBG("%s", gpu->name);
+ trace_msm_gpu_resume(0);

ret = enable_pwrrail(gpu);
if (ret)
@@ -227,6 +228,7 @@ int msm_gpu_pm_suspend(struct msm_gpu *gpu)
int ret;

DBG("%s", gpu->name);
+ trace_msm_gpu_suspend(0);

devfreq_suspend_device(gpu->devfreq.devfreq);

diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h b/drivers/gpu/drm/msm/msm_gpu_trace.h
index 1079fe551279..03e0c2536b94 100644
--- a/drivers/gpu/drm/msm/msm_gpu_trace.h
+++ b/drivers/gpu/drm/msm/msm_gpu_trace.h
@@ -140,6 +140,32 @@ TRACE_EVENT(msm_gem_purge_vmaps,
TP_printk("Purging %u vmaps", __entry->unmapped)
);

+
+TRACE_EVENT(msm_gpu_suspend,
+ TP_PROTO(int dummy),
+ TP_ARGS(dummy),
+ TP_STRUCT__entry(
+ __field(u32, dummy)
+ ),
+ TP_fast_assign(
+ __entry->dummy = dummy;
+ ),
+ TP_printk("%u", __entry->dummy)
+);
+
+
+TRACE_EVENT(msm_gpu_resume,
+ TP_PROTO(int dummy),
+ TP_ARGS(dummy),
+ TP_STRUCT__entry(
+ __field(u32, dummy)
+ ),
+ TP_fast_assign(
+ __entry->dummy = dummy;
+ ),
+ TP_printk("%u", __entry->dummy)
+);
+
#endif

#undef TRACE_INCLUDE_PATH
--
2.26.2

2020-09-02 14:47:03

by Rob Clark

[permalink] [raw]
Subject: Re: [PATCH 0/3] drm/msm: More GPU tracepoints

The cat is somewhat out of the bag already.. so I took the approach of
making the more useful of the traces for visualization (freq_change
trace) identical to the i915 one in units and format, so userspace
just has to add another event name to a list, and not have to add more
parsing code.

But the bigger problem is that it doesn't seem possible to #include
multiple foo_trace.h's in a single C file, so I'm not seeing how it is
possible to have both generic and driver specific traces.

BR,
-R

On Tue, Sep 1, 2020 at 11:52 PM Tomeu Vizoso <[email protected]> wrote:
>
> Hi Rob,
>
> Do you think we could make all these generic? Visualization tools will need to do some processing so these can be neatly presented and it could be far more convenient if people wouldn't need to add code for each GPU driver.
>
> Maybe we could put all these tracepoints in DRM core as they seem useful to all drivers?
>
> Thanks,
>
> Tomeu
>
> On Tue, 1 Sep 2020 at 17:41, Rob Clark <[email protected]> wrote:
>>
>> From: Rob Clark <[email protected]>
>>
>> Various extra tracepoints that I've been collecting.
>>
>> Rob Clark (3):
>> drm/msm/gpu: Add GPU freq_change traces
>> drm/msm: Convert shrinker msgs to tracepoints
>> drm/msm/gpu: Add suspend/resume tracepoints
>>
>> drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 3 +
>> drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++
>> drivers/gpu/drm/msm/msm_gem_shrinker.c | 5 +-
>> drivers/gpu/drm/msm/msm_gpu.c | 4 ++
>> drivers/gpu/drm/msm/msm_gpu_trace.h | 83 ++++++++++++++++++++++++++
>> 5 files changed, 97 insertions(+), 2 deletions(-)
>>
>> --
>> 2.26.2
>>
>> _______________________________________________
>> dri-devel mailing list
>> [email protected]
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel

2020-09-02 20:42:21

by Jordan Crouse

[permalink] [raw]
Subject: Re: [PATCH 1/3] drm/msm/gpu: Add GPU freq_change traces

On Tue, Sep 01, 2020 at 08:41:54AM -0700, Rob Clark wrote:
> From: Rob Clark <[email protected]>
>
> Technically the GMU specific one is a bit redundant, but it was useful
> to track down a bug.

Reviewed-by: Jordan Crouse <[email protected]>

> Signed-off-by: Rob Clark <[email protected]>
> ---
> drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 3 +++
> drivers/gpu/drm/msm/msm_gpu.c | 2 ++
> drivers/gpu/drm/msm/msm_gpu_trace.h | 31 +++++++++++++++++++++++++++
> 3 files changed, 36 insertions(+)
>
> diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> index 46a29e383bfd..ab1e9eb619e0 100644
> --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
> @@ -11,6 +11,7 @@
> #include "a6xx_gpu.h"
> #include "a6xx_gmu.xml.h"
> #include "msm_gem.h"
> +#include "msm_gpu_trace.h"
> #include "msm_mmu.h"
>
> static void a6xx_gmu_fault(struct a6xx_gmu *gmu)
> @@ -124,6 +125,8 @@ void a6xx_gmu_set_freq(struct msm_gpu *gpu, struct dev_pm_opp *opp)
> gmu->current_perf_index = perf_index;
> gmu->freq = gmu->gpu_freqs[perf_index];
>
> + trace_msm_gmu_freq_change(gmu->freq, perf_index);
> +
> /*
> * This can get called from devfreq while the hardware is idle. Don't
> * bring up the power if it isn't already active
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index d5645472b25d..b02866527386 100644
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -32,6 +32,8 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,
> if (IS_ERR(opp))
> return PTR_ERR(opp);
>
> + trace_msm_gpu_freq_change(dev_pm_opp_get_freq(opp));
> +
> if (gpu->funcs->gpu_set_freq)
> gpu->funcs->gpu_set_freq(gpu, opp);
> else
> diff --git a/drivers/gpu/drm/msm/msm_gpu_trace.h b/drivers/gpu/drm/msm/msm_gpu_trace.h
> index 122b84789238..07572ab179fa 100644
> --- a/drivers/gpu/drm/msm/msm_gpu_trace.h
> +++ b/drivers/gpu/drm/msm/msm_gpu_trace.h
> @@ -83,6 +83,37 @@ TRACE_EVENT(msm_gpu_submit_retired,
> __entry->start_ticks, __entry->end_ticks)
> );
>
> +
> +TRACE_EVENT(msm_gpu_freq_change,
> + TP_PROTO(u32 freq),
> + TP_ARGS(freq),
> + TP_STRUCT__entry(
> + __field(u32, freq)
> + ),
> + TP_fast_assign(
> + /* trace freq in MHz to match intel_gpu_freq_change, to make life easier
> + * for userspace
> + */
> + __entry->freq = DIV_ROUND_UP(freq, 1000000);
> + ),
> + TP_printk("new_freq=%u", __entry->freq)
> +);
> +
> +
> +TRACE_EVENT(msm_gmu_freq_change,
> + TP_PROTO(u32 freq, u32 perf_index),
> + TP_ARGS(freq, perf_index),
> + TP_STRUCT__entry(
> + __field(u32, freq)
> + __field(u32, perf_index)
> + ),
> + TP_fast_assign(
> + __entry->freq = freq;
> + __entry->perf_index = perf_index;
> + ),
> + TP_printk("freq=%u, perf_index=%u", __entry->freq, __entry->perf_index)
> +);
> +
> #endif
>
> #undef TRACE_INCLUDE_PATH
> --
> 2.26.2
>

--
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project