Mesa (master): winsys/amdgpu: make RADEON_ALL_BOS a debug only feature
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Nov 19 13:00:27 UTC 2020
Module: Mesa
Branch: master
Commit: 111a1b2e1c073b34917d4720dca11fb1ba7e6b46
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=111a1b2e1c073b34917d4720dca11fb1ba7e6b46
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date: Fri Nov 13 12:19:14 2020 +0100
winsys/amdgpu: make RADEON_ALL_BOS a debug only feature
Improves performance in SPECviewperf13 snx.
e.g.: test10 fps evolution: 235 -> 270.
Extract from "pahole radeonsi_dri.so -C amdgpu_winsys_bo", before:
struct amdgpu_winsys_bo {
struct pb_buffer base; /* 0 32 */
union {
struct {
struct pb_cache_entry cache_entry; /* 32 56 */
/* XXX last struct has 4 bytes of padding */
/* --- cacheline 1 boundary (64 bytes) was 24 bytes ago --- */
amdgpu_va_handle va_handle; /* 88 8 */
int map_count; /* 96 4 */
_Bool use_reusable_pool; /* 100 1 */
/* XXX 3 bytes hole, try to pack */
struct list_head global_list_item; /* 104 16 */
uint32_t kms_handle; /* 120 4 */
} real;
[...]
} u; /* 32 96 */
[...]
/* size: 200, cachelines: 4, members: 15 */
};
After:
struct amdgpu_winsys_bo {
struct pb_buffer base; /* 0 32 */
union {
struct {
struct pb_cache_entry cache_entry; /* 32 56 */
/* XXX last struct has 4 bytes of padding */
/* --- cacheline 1 boundary (64 bytes) was 24 bytes ago --- */
amdgpu_va_handle va_handle; /* 88 8 */
int map_count; /* 96 4 */
_Bool use_reusable_pool; /* 100 1 */
/* XXX 3 bytes hole, try to pack */
uint32_t kms_handle; /* 104 4 */
} real; /* 32 80 */
} u; /* 32 80 */
/* --- cacheline 1 boundary (64 bytes) was 48 bytes ago --- */
[...]
/* size: 184, cachelines: 3, members: 15 */
};
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7532>
---
src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 4 ++++
src/gallium/winsys/amdgpu/drm/amdgpu_bo.h | 4 ++--
src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 5 ++++-
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 11 ++++++++++-
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h | 4 +++-
5 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
index fd95a5b0fdd..d17606eef73 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
@@ -176,12 +176,14 @@ void amdgpu_bo_destroy(struct pb_buffer *_buf)
}
assert(bo->is_user_ptr || bo->u.real.map_count == 0);
+#if DEBUG
if (ws->debug_all_bos) {
simple_mtx_lock(&ws->global_bo_list_lock);
list_del(&bo->u.real.global_list_item);
ws->num_buffers--;
simple_mtx_unlock(&ws->global_bo_list_lock);
}
+#endif
/* Close all KMS handles retrieved for other DRM file descriptions */
simple_mtx_lock(&ws->sws_list_lock);
@@ -431,6 +433,7 @@ static const struct pb_vtbl amdgpu_winsys_bo_vtbl = {
static void amdgpu_add_buffer_to_global_list(struct amdgpu_winsys_bo *bo)
{
+#if DEBUG
struct amdgpu_winsys *ws = bo->ws;
assert(bo->bo);
@@ -441,6 +444,7 @@ static void amdgpu_add_buffer_to_global_list(struct amdgpu_winsys_bo *bo)
ws->num_buffers++;
simple_mtx_unlock(&ws->global_bo_list_lock);
}
+#endif
}
static unsigned amdgpu_get_optimal_alignment(struct amdgpu_winsys *ws,
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
index ada15342705..2190794102c 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
@@ -64,9 +64,9 @@ struct amdgpu_winsys_bo {
amdgpu_va_handle va_handle;
int map_count;
bool use_reusable_pool;
-
+#if DEBUG
struct list_head global_list_item;
-
+#endif
uint32_t kms_handle;
} real;
struct {
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index e7e76cd315c..f344346e1ea 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -1430,6 +1430,7 @@ static void amdgpu_cs_submit_ib(void *job, int thread_index)
bool use_bo_list_create = ws->info.drm_minor < 27;
struct drm_amdgpu_bo_list_in bo_list_in;
+#if DEBUG
/* Prepare the buffer list. */
if (ws->debug_all_bos) {
/* The buffer list contains all buffers. This is a slow path that
@@ -1453,7 +1454,9 @@ static void amdgpu_cs_submit_ib(void *job, int thread_index)
fprintf(stderr, "amdgpu: buffer list creation failed (%d)\n", r);
goto cleanup;
}
- } else {
+ } else
+#endif
+ {
if (!amdgpu_add_sparse_backing_buffers(cs)) {
fprintf(stderr, "amdgpu: amdgpu_add_sparse_backing_buffers failed\n");
r = -ENOMEM;
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
index 35d7cb816e6..a339c517235 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
@@ -47,7 +47,9 @@
static struct hash_table *dev_tab = NULL;
static simple_mtx_t dev_tab_mutex = _SIMPLE_MTX_INITIALIZER_NP;
+#if DEBUG
DEBUG_GET_ONCE_BOOL_OPTION(all_bos, "RADEON_ALL_BOS", false)
+#endif
static void handle_env_var_force_family(struct amdgpu_winsys *ws)
{
@@ -108,7 +110,9 @@ static bool do_winsys_init(struct amdgpu_winsys *ws,
ws->check_vm = strstr(debug_get_option("R600_DEBUG", ""), "check_vm") != NULL ||
strstr(debug_get_option("AMD_DEBUG", ""), "check_vm") != NULL;
+#if DEBUG
ws->debug_all_bos = debug_get_option_all_bos();
+#endif
ws->reserve_vmid = strstr(debug_get_option("R600_DEBUG", ""), "reserve_vmid") != NULL ||
strstr(debug_get_option("AMD_DEBUG", ""), "reserve_vmid") != NULL;
ws->zero_all_vram_allocs = strstr(debug_get_option("R600_DEBUG", ""), "zerovram") != NULL ||
@@ -138,7 +142,9 @@ static void do_winsys_deinit(struct amdgpu_winsys *ws)
pb_cache_deinit(&ws->bo_cache);
_mesa_hash_table_destroy(ws->bo_export_table, NULL);
simple_mtx_destroy(&ws->sws_list_lock);
+#if DEBUG
simple_mtx_destroy(&ws->global_bo_list_lock);
+#endif
simple_mtx_destroy(&ws->bo_export_table_lock);
ac_addrlib_destroy(ws->addrlib);
@@ -468,12 +474,15 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
/* init reference */
pipe_reference_init(&aws->reference, 1);
-
+#if DEBUG
list_inithead(&aws->global_bo_list);
+#endif
aws->bo_export_table = util_hash_table_create_ptr_keys();
(void) simple_mtx_init(&aws->sws_list_lock, mtx_plain);
+#if DEBUG
(void) simple_mtx_init(&aws->global_bo_list_lock, mtx_plain);
+#endif
(void) simple_mtx_init(&aws->bo_fence_lock, mtx_plain);
(void) simple_mtx_init(&aws->bo_export_table_lock, mtx_plain);
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
index 981189f5e77..525e0399f3a 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
@@ -82,14 +82,16 @@ struct amdgpu_winsys {
struct ac_addrlib *addrlib;
bool check_vm;
- bool debug_all_bos;
bool reserve_vmid;
bool zero_all_vram_allocs;
+#if DEBUG
+ bool debug_all_bos;
/* List of all allocated buffers */
simple_mtx_t global_bo_list_lock;
struct list_head global_bo_list;
unsigned num_buffers;
+#endif
/* Single-linked list of all structs amdgpu_screen_winsys referencing this
* struct amdgpu_winsys
More information about the mesa-commit
mailing list