Mesa (master): freedreno: Add perf_debug logging for bo stalls
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 24 00:34:26 UTC 2021
Module: Mesa
Branch: master
Commit: dabec19b05e6efda3839a4bb752ee15b716bcab3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dabec19b05e6efda3839a4bb752ee15b716bcab3
Author: Rob Clark <robdclark at chromium.org>
Date: Tue Feb 23 15:44:39 2021 -0800
freedreno: Add perf_debug logging for bo stalls
Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9223>
---
.../drivers/freedreno/freedreno_query_acc.c | 4 ++--
src/gallium/drivers/freedreno/freedreno_query_hw.c | 4 ++--
src/gallium/drivers/freedreno/freedreno_resource.c | 23 ++++++++++++++++++++--
src/gallium/drivers/freedreno/freedreno_resource.h | 3 +++
4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/freedreno/freedreno_query_acc.c b/src/gallium/drivers/freedreno/freedreno_query_acc.c
index 9fad076f01f..e7c5db9aa67 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_acc.c
+++ b/src/gallium/drivers/freedreno/freedreno_query_acc.c
@@ -171,7 +171,7 @@ fd_acc_get_query_result(struct fd_context *ctx, struct fd_query *q,
return false;
}
- ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe,
+ ret = fd_resource_wait(ctx, rsc,
DRM_FREEDRENO_PREP_READ | DRM_FREEDRENO_PREP_NOSYNC);
if (ret)
return false;
@@ -186,7 +186,7 @@ fd_acc_get_query_result(struct fd_context *ctx, struct fd_query *q,
}
/* get the result: */
- fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_READ);
+ fd_resource_wait(ctx, rsc, DRM_FREEDRENO_PREP_READ);
void *ptr = fd_bo_map(rsc->bo);
p->result(aq, ptr, result);
diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.c b/src/gallium/drivers/freedreno/freedreno_query_hw.c
index 8677b029a59..445c86d4552 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_hw.c
+++ b/src/gallium/drivers/freedreno/freedreno_query_hw.c
@@ -230,7 +230,7 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
if (!rsc->bo)
return false;
- ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe,
+ ret = fd_resource_wait(ctx, rsc,
DRM_FREEDRENO_PREP_READ | DRM_FREEDRENO_PREP_NOSYNC);
if (ret)
return false;
@@ -260,7 +260,7 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
if (!rsc->bo)
continue;
- fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_READ);
+ fd_resource_wait(ctx, rsc, DRM_FREEDRENO_PREP_READ);
void *ptr = fd_bo_map(rsc->bo);
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 66c400f2e87..d8d471f84bc 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -177,6 +177,25 @@ fd_resource_set_bo(struct fd_resource *rsc, struct fd_bo *bo)
rsc->seqno = p_atomic_inc_return(&screen->rsc_seqno);
}
+int
+__fd_resource_wait(struct fd_context *ctx, struct fd_resource *rsc,
+ unsigned op, const char *func)
+{
+ if (op & DRM_FREEDRENO_PREP_NOSYNC)
+ return fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
+
+ int64_t elapsed = -os_time_get_nano();
+ int ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
+
+ elapsed += os_time_get_nano();
+ if (elapsed > 10000) /* 0.01ms */ {
+ perf_debug_ctx(ctx, "%s: a busy \"%"PRSC_FMT"\" BO stalled and took %.03f ms.\n",
+ func, PRSC_ARGS(&rsc->base), 1000000 * (double)elapsed);
+ }
+
+ return ret;
+}
+
static void
realloc_bo(struct fd_resource *rsc, uint32_t size)
{
@@ -695,7 +714,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
if (usage & PIPE_MAP_READ) {
fd_blit_to_staging(ctx, trans);
- fd_bo_cpu_prep(staging_rsc->bo, ctx->pipe,
+ fd_resource_wait(ctx, staging_rsc,
DRM_FREEDRENO_PREP_READ);
}
@@ -809,7 +828,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
* completed.
*/
if (busy) {
- ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
+ ret = fd_resource_wait(ctx, rsc, op);
if (ret)
goto fail;
}
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
index a90e8eb66fd..71dc24da13d 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -165,6 +165,9 @@ fd_resource_busy(struct fd_resource *rsc, unsigned op)
return fd_bo_cpu_prep(rsc->bo, NULL, op | DRM_FREEDRENO_PREP_NOSYNC) != 0;
}
+int __fd_resource_wait(struct fd_context *ctx, struct fd_resource *rsc, unsigned op, const char *func);
+#define fd_resource_wait(ctx, rsc, op) __fd_resource_wait(ctx, rsc, op, __func__)
+
static inline void
fd_resource_lock(struct fd_resource *rsc)
{
More information about the mesa-commit
mailing list