Mesa (master): gallium/hash_table: consolidate hash tables with FD keys
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 26 21:14:03 UTC 2020
Module: Mesa
Branch: master
Commit: 76dff2fabe065b71f0d336cb43853335dd3eb82a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=76dff2fabe065b71f0d336cb43853335dd3eb82a
Author: Marek Olšák <marek.olsak at amd.com>
Date: Wed Feb 5 14:27:21 2020 -0500
gallium/hash_table: consolidate hash tables with FD keys
Reviewed-by: Kristian H. Kristensen <hoegsberg at google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3722>
---
src/gallium/auxiliary/util/u_hash_table.c | 45 ++++++++++++++++++++++
src/gallium/auxiliary/util/u_hash_table.h | 7 ++++
.../winsys/etnaviv/drm/etnaviv_drm_winsys.c | 26 +------------
.../winsys/freedreno/drm/freedreno_drm_winsys.c | 24 +-----------
src/gallium/winsys/lima/drm/lima_drm_winsys.c | 26 +------------
.../winsys/nouveau/drm/nouveau_drm_winsys.c | 24 +-----------
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 24 +-----------
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 24 +-----------
8 files changed, 58 insertions(+), 142 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_hash_table.c b/src/gallium/auxiliary/util/u_hash_table.c
index 0a2863dcc0c..e58c7823be2 100644
--- a/src/gallium/auxiliary/util/u_hash_table.c
+++ b/src/gallium/auxiliary/util/u_hash_table.c
@@ -47,6 +47,10 @@
#include "util/u_hash_table.h"
#include "util/hash_table.h"
+#if DETECT_OS_UNIX
+#include <sys/stat.h>
+#endif
+
struct util_hash_table
{
@@ -116,6 +120,47 @@ util_hash_table_create_ptr_keys(void)
}
+static unsigned hash_fd(void *key)
+{
+#if DETECT_OS_UNIX
+ int fd = pointer_to_intptr(key);
+ struct stat stat;
+
+ fstat(fd, &stat);
+
+ return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
+#else
+ return 0;
+#endif
+}
+
+
+static int compare_fd(void *key1, void *key2)
+{
+#if DETECT_OS_UNIX
+ int fd1 = pointer_to_intptr(key1);
+ int fd2 = pointer_to_intptr(key2);
+ struct stat stat1, stat2;
+
+ fstat(fd1, &stat1);
+ fstat(fd2, &stat2);
+
+ return stat1.st_dev != stat2.st_dev ||
+ stat1.st_ino != stat2.st_ino ||
+ stat1.st_rdev != stat2.st_rdev;
+#else
+ return 0;
+#endif
+}
+
+
+struct util_hash_table *
+util_hash_table_create_fd_keys(void)
+{
+ return util_hash_table_create(hash_fd, compare_fd);
+}
+
+
static inline struct cso_hash_iter
util_hash_table_find_iter(struct util_hash_table *ht,
void *key,
diff --git a/src/gallium/auxiliary/util/u_hash_table.h b/src/gallium/auxiliary/util/u_hash_table.h
index cf0c58cd287..7db87c4367b 100644
--- a/src/gallium/auxiliary/util/u_hash_table.h
+++ b/src/gallium/auxiliary/util/u_hash_table.h
@@ -66,6 +66,13 @@ struct util_hash_table *
util_hash_table_create_ptr_keys(void);
+/**
+ * Create a hash table where the keys are device FDs.
+ */
+struct util_hash_table *
+util_hash_table_create_fd_keys(void);
+
+
enum pipe_error
util_hash_table_set(struct util_hash_table *ht,
void *key,
diff --git a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
index 8e3f7a06a9a..bfeeb429be5 100644
--- a/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
+++ b/src/gallium/winsys/etnaviv/drm/etnaviv_drm_winsys.c
@@ -91,30 +91,6 @@ etna_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
-
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
-
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
struct pipe_screen *
etna_drm_screen_create_renderonly(struct renderonly *ro)
{
@@ -122,7 +98,7 @@ etna_drm_screen_create_renderonly(struct renderonly *ro)
mtx_lock(&etna_screen_mutex);
if (!etna_tab) {
- etna_tab = util_hash_table_create(hash_fd, compare_fd);
+ etna_tab = util_hash_table_create_fd_keys();
if (!etna_tab)
goto unlock;
}
diff --git a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
index 719c52a80c7..d09208bcb26 100644
--- a/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
+++ b/src/gallium/winsys/freedreno/drm/freedreno_drm_winsys.c
@@ -62,28 +62,6 @@ fd_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
struct pipe_screen *
fd_drm_screen_create(int fd, struct renderonly *ro)
{
@@ -91,7 +69,7 @@ fd_drm_screen_create(int fd, struct renderonly *ro)
mtx_lock(&fd_screen_mutex);
if (!fd_tab) {
- fd_tab = util_hash_table_create(hash_fd, compare_fd);
+ fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}
diff --git a/src/gallium/winsys/lima/drm/lima_drm_winsys.c b/src/gallium/winsys/lima/drm/lima_drm_winsys.c
index 07690307c64..c9ef9406598 100644
--- a/src/gallium/winsys/lima/drm/lima_drm_winsys.c
+++ b/src/gallium/winsys/lima/drm/lima_drm_winsys.c
@@ -57,30 +57,6 @@ lima_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
-
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
-
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
struct pipe_screen *
lima_drm_screen_create(int fd)
{
@@ -88,7 +64,7 @@ lima_drm_screen_create(int fd)
mtx_lock(&lima_screen_mutex);
if (!fd_tab) {
- fd_tab = util_hash_table_create(hash_fd, compare_fd);
+ fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}
diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
index 3e790aa65d5..57f3702a3e0 100644
--- a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
+++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
@@ -36,28 +36,6 @@ bool nouveau_drm_screen_unref(struct nouveau_screen *screen)
return ret == 0;
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
PUBLIC struct pipe_screen *
nouveau_drm_screen_create(int fd)
{
@@ -69,7 +47,7 @@ nouveau_drm_screen_create(int fd)
mtx_lock(&nouveau_screen_mutex);
if (!fd_tab) {
- fd_tab = util_hash_table_create(hash_fd, compare_fd);
+ fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab) {
mtx_unlock(&nouveau_screen_mutex);
return NULL;
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
index 0ea43c1959b..c38d238bfcd 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
@@ -761,28 +761,6 @@ static bool radeon_read_registers(struct radeon_winsys *rws,
return true;
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
DEBUG_GET_ONCE_BOOL_OPTION(thread, "RADEON_THREAD", true)
static bool radeon_winsys_unref(struct radeon_winsys *ws)
@@ -828,7 +806,7 @@ radeon_drm_winsys_create(int fd, const struct pipe_screen_config *config,
mtx_lock(&fd_tab_mutex);
if (!fd_tab) {
- fd_tab = util_hash_table_create(hash_fd, compare_fd);
+ fd_tab = util_hash_table_create_fd_keys();
}
ws = util_hash_table_get(fd_tab, intptr_to_pointer(fd));
diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
index 53d8fdf3eda..959af78493b 100644
--- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
+++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
@@ -1028,28 +1028,6 @@ virgl_drm_screen_destroy(struct pipe_screen *pscreen)
}
}
-static unsigned hash_fd(void *key)
-{
- int fd = pointer_to_intptr(key);
- struct stat stat;
- fstat(fd, &stat);
-
- return stat.st_dev ^ stat.st_ino ^ stat.st_rdev;
-}
-
-static int compare_fd(void *key1, void *key2)
-{
- int fd1 = pointer_to_intptr(key1);
- int fd2 = pointer_to_intptr(key2);
- struct stat stat1, stat2;
- fstat(fd1, &stat1);
- fstat(fd2, &stat2);
-
- return stat1.st_dev != stat2.st_dev ||
- stat1.st_ino != stat2.st_ino ||
- stat1.st_rdev != stat2.st_rdev;
-}
-
struct pipe_screen *
virgl_drm_screen_create(int fd, const struct pipe_screen_config *config)
{
@@ -1057,7 +1035,7 @@ virgl_drm_screen_create(int fd, const struct pipe_screen_config *config)
mtx_lock(&virgl_screen_mutex);
if (!fd_tab) {
- fd_tab = util_hash_table_create(hash_fd, compare_fd);
+ fd_tab = util_hash_table_create_fd_keys();
if (!fd_tab)
goto unlock;
}
More information about the mesa-commit
mailing list