winsys/amdgpu: Keep a list of amdgpu_screen_winsyses in amdgpu_winsys
authorMichel Dänzer <mdaenzer@redhat.com>
Mon, 30 Sep 2019 16:36:06 +0000 (18:36 +0200)
committerMichel Dänzer <michel@daenzer.net>
Thu, 23 Jan 2020 16:23:32 +0000 (17:23 +0100)
v2:
* Add dedicated mutex for the list.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3202>

src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h

index 2a341413033a2ecc07f76088c630d22422149388..dfdd6fb16312b296a75abf06ce387d1c386d5952 100644 (file)
@@ -138,6 +138,7 @@ static void do_winsys_deinit(struct amdgpu_winsys *ws)
    }
    pb_cache_deinit(&ws->bo_cache);
    util_hash_table_destroy(ws->bo_export_table);
+   simple_mtx_destroy(&ws->sws_list_lock);
    simple_mtx_destroy(&ws->global_bo_list_lock);
    simple_mtx_destroy(&ws->bo_export_table_lock);
 
@@ -171,8 +172,21 @@ static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
 
    simple_mtx_unlock(&dev_tab_mutex);
 
-   if (destroy)
+   if (destroy) {
       do_winsys_deinit(ws);
+   } else {
+      struct amdgpu_screen_winsys **sws_iter;
+
+      /* Remove this amdgpu_screen_winsys from amdgpu_winsys' list */
+      simple_mtx_lock(&ws->sws_list_lock);
+      for (sws_iter = &ws->sws_list; *sws_iter; sws_iter = &(*sws_iter)->next) {
+         if (*sws_iter == sws) {
+            *sws_iter = sws->next;
+            break;
+         }
+      }
+      simple_mtx_unlock(&ws->sws_list_lock);
+   }
 
    close(sws->fd);
    FREE(rws);
@@ -385,6 +399,7 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
       list_inithead(&aws->global_bo_list);
       aws->bo_export_table = util_hash_table_create(hash_pointer, compare_pointers);
 
+      (void) simple_mtx_init(&aws->sws_list_lock, mtx_plain);
       (void) simple_mtx_init(&aws->global_bo_list_lock, mtx_plain);
       (void) simple_mtx_init(&aws->bo_fence_lock, mtx_plain);
       (void) simple_mtx_init(&aws->bo_export_table_lock, mtx_plain);
@@ -435,6 +450,11 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
       return NULL;
    }
 
+   simple_mtx_lock(&aws->sws_list_lock);
+   ws->next = aws->sws_list;
+   aws->sws_list = ws;
+   simple_mtx_unlock(&aws->sws_list_lock);
+
    /* We must unlock the mutex once the winsys is fully initialized, so that
     * other threads attempting to create the winsys from the same fd will
     * get a fully initialized winsys and not just half-way initialized. */
index 1ff160728296945937e3ddc1e036c05d4d744a7c..43e1df09ad58f46f9e55cc2913624221c08abbcb 100644 (file)
@@ -87,6 +87,12 @@ struct amdgpu_winsys {
    struct list_head global_bo_list;
    unsigned num_buffers;
 
+   /* Single-linked list of all structs amdgpu_screen_winsys referencing this
+    * struct amdgpu_winsys
+    */
+   simple_mtx_t sws_list_lock;
+   struct amdgpu_screen_winsys *sws_list;
+
    /* For returning the same amdgpu_winsys_bo instance for exported
     * and re-imported buffers. */
    struct util_hash_table *bo_export_table;
@@ -97,6 +103,7 @@ struct amdgpu_screen_winsys {
    struct radeon_winsys base;
    struct amdgpu_winsys *aws;
    int fd;
+   struct amdgpu_screen_winsys *next;
 };
 
 static inline struct amdgpu_screen_winsys *