Revert "winsys/amdgpu: Re-use amdgpu_screen_winsys when possible"

This reverts commit b60f5cbc15.

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
This commit is contained in:
Marek Olšák 2020-01-27 17:40:38 -05:00
parent ba06c7620f
commit 0c154d9e2d
2 changed files with 24 additions and 45 deletions

View File

@ -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. */

View File

@ -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