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