diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c index d7aec6a4..38fd186d 100644 --- a/amdgpu/amdgpu_device.c +++ b/amdgpu/amdgpu_device.c @@ -43,10 +43,9 @@ #include "util_math.h" #define PTR_TO_UINT(x) ((unsigned)((intptr_t)(x))) -#define UINT_TO_PTR(x) ((void *)((intptr_t)(x))) static pthread_mutex_t fd_mutex = PTHREAD_MUTEX_INITIALIZER; -static struct util_hash_table *fd_tab; +static amdgpu_device_handle fd_list; static unsigned handle_hash(void *key) { @@ -58,28 +57,8 @@ static int handle_compare(void *key1, void *key2) return PTR_TO_UINT(key1) != PTR_TO_UINT(key2); } -static unsigned fd_hash(void *key) +static int fd_compare(int fd1, int fd2) { - int fd = PTR_TO_UINT(key); - char *name = drmGetPrimaryDeviceNameFromFd(fd); - unsigned result = 0; - char *c; - - if (name == NULL) - return 0; - - for (c = name; *c; ++c) - result += *c; - - free(name); - - return result; -} - -static int fd_compare(void *key1, void *key2) -{ - int fd1 = PTR_TO_UINT(key1); - int fd2 = PTR_TO_UINT(key2); char *name1 = drmGetPrimaryDeviceNameFromFd(fd1); char *name2 = drmGetPrimaryDeviceNameFromFd(fd2); int result; @@ -127,16 +106,17 @@ static int amdgpu_get_auth(int fd, int *auth) static void amdgpu_device_free_internal(amdgpu_device_handle dev) { + amdgpu_device_handle *node = &fd_list; + pthread_mutex_lock(&fd_mutex); - util_hash_table_remove(fd_tab, UINT_TO_PTR(dev->fd)); - if (util_hash_table_count(fd_tab) == 0) { - util_hash_table_destroy(fd_tab); - fd_tab = NULL; - } + while (*node != dev && (*node)->next) + node = &(*node)->next; + *node = (*node)->next; + pthread_mutex_unlock(&fd_mutex); + close(dev->fd); if ((dev->flink_fd >= 0) && (dev->fd != dev->flink_fd)) close(dev->flink_fd); - pthread_mutex_unlock(&fd_mutex); amdgpu_vamgr_deinit(&dev->vamgr_32); amdgpu_vamgr_deinit(&dev->vamgr); @@ -187,8 +167,6 @@ int amdgpu_device_initialize(int fd, *device_handle = NULL; pthread_mutex_lock(&fd_mutex); - if (!fd_tab) - fd_tab = util_hash_table_create(fd_hash, fd_compare); r = amdgpu_get_auth(fd, &flag_auth); if (r) { fprintf(stderr, "%s: amdgpu_get_auth (1) failed (%i)\n", @@ -196,7 +174,11 @@ int amdgpu_device_initialize(int fd, pthread_mutex_unlock(&fd_mutex); return r; } - dev = util_hash_table_get(fd_tab, UINT_TO_PTR(fd)); + + for (dev = fd_list; dev; dev = dev->next) + if (fd_compare(dev->fd, fd) == 0) + break; + if (dev) { r = amdgpu_get_auth(dev->fd, &flag_authexist); if (r) { @@ -297,7 +279,8 @@ int amdgpu_device_initialize(int fd, *major_version = dev->major_version; *minor_version = dev->minor_version; *device_handle = dev; - util_hash_table_set(fd_tab, UINT_TO_PTR(dev->fd), dev); + dev->next = fd_list; + fd_list = dev; pthread_mutex_unlock(&fd_mutex); return 0; diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h index 99b8ce0b..83012cab 100644 --- a/amdgpu/amdgpu_internal.h +++ b/amdgpu/amdgpu_internal.h @@ -65,6 +65,7 @@ struct amdgpu_va { struct amdgpu_device { atomic_t refcount; + struct amdgpu_device *next; int fd; int flink_fd; unsigned major_version;