diff options
author | Marek Olšák <[email protected]> | 2020-01-27 17:40:38 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2020-01-27 17:48:42 -0500 |
commit | 0c154d9e2db48c5b97ac6f428d3fe9ed5774da30 (patch) | |
tree | 03be854008d48965b20ee9158dca67336da85fb1 /src/gallium/winsys | |
parent | ba06c7620f3eac333b58542bf01e1586d6346a61 (diff) |
Revert "winsys/amdgpu: Re-use amdgpu_screen_winsys when possible"
This reverts commit b60f5cbc15a99ddd9251bce40eae7d84c3a1c373.
This fixes dmesg errors and X freezes:
[ 29.543096] amdgpu 0000:0c:00.0: No GEM object associated to handle 0x00000009, can't create framebuffer
[ 29.543103] amdgpu 0000:0c:00.0: No GEM object associated to handle 0x00000009, can't create framebuffer
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 68 | ||||
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h | 1 |
2 files changed, 24 insertions, 45 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 8fadf584e3f..000abd00a14 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -30,7 +30,6 @@ #include "amdgpu_cs.h" #include "amdgpu_public.h" -#include "util/os_file.h" #include "util/u_cpu_detect.h" #include "util/u_hash_table.h" #include "util/hash_table.h" @@ -173,8 +172,26 @@ 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); + } + + if (sws->kms_handles) { + assert(!destroy); + _mesa_hash_table_destroy(sws->kms_handles, NULL); + } close(sws->fd); FREE(rws); @@ -280,34 +297,11 @@ static int compare_pointers(void *key1, void *key2) static bool amdgpu_winsys_unref(struct radeon_winsys *rws) { - struct amdgpu_screen_winsys *sws = amdgpu_screen_winsys(rws); - struct amdgpu_winsys *aws = sws->aws; - bool ret; - - simple_mtx_lock(&aws->sws_list_lock); - - ret = pipe_reference(&sws->reference, NULL); - if (ret) { - struct amdgpu_screen_winsys **sws_iter; - struct amdgpu_winsys *aws = sws->aws; - - /* Remove this amdgpu_screen_winsys from amdgpu_winsys' list, so that - * amdgpu_winsys_create can't re-use it anymore - */ - for (sws_iter = &aws->sws_list; *sws_iter; sws_iter = &(*sws_iter)->next) { - if (*sws_iter == sws) { - *sws_iter = sws->next; - break; - } - } - } - - simple_mtx_unlock(&aws->sws_list_lock); - - if (ret && sws->kms_handles) - _mesa_hash_table_destroy(sws->kms_handles, NULL); - - return ret; + /* radeon_winsys corresponds to amdgpu_screen_winsys, which is never + * referenced multiple times, so amdgpu_winsys_destroy always needs to be + * called. It handles reference counting for amdgpu_winsys. + */ + return true; } static void amdgpu_pin_threads_to_L3_cache(struct radeon_winsys *rws, @@ -344,7 +338,6 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, if (!ws) return NULL; - pipe_reference_init(&ws->reference, 1); ws->fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); /* Look up the winsys from the dev table. */ @@ -363,24 +356,12 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, /* Lookup a winsys if we have already created one for this device. */ aws = util_hash_table_get(dev_tab, dev); if (aws) { - struct amdgpu_screen_winsys *sws_iter; - /* Release the device handle, because we don't need it anymore. * This function is returning an existing winsys instance, which * has its own device handle. */ amdgpu_device_deinitialize(dev); - for (sws_iter = aws->sws_list; sws_iter; sws_iter = sws_iter->next) { - if (os_same_file_description(sws_iter->fd, aws->fd)) { - close(ws->fd); - FREE(ws); - ws = sws_iter; - pipe_reference(NULL, &ws->reference); - goto unlock; - } - } - ws->kms_handles = _mesa_hash_table_create(NULL, kms_handle_hash, kms_handle_equals); if (!ws->kms_handles) @@ -497,7 +478,6 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, aws->sws_list = ws; simple_mtx_unlock(&aws->sws_list_lock); -unlock: /* 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. */ diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h index a22be6086dc..c2edf4f46dc 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h @@ -107,7 +107,6 @@ struct amdgpu_screen_winsys { struct radeon_winsys base; struct amdgpu_winsys *aws; int fd; - struct pipe_reference reference; struct amdgpu_screen_winsys *next; /* Maps a BO to its KMS handle valid for this DRM file descriptor |