Mesa (main): drm-shim: Return fake render nodes in /dev/dri first
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Apr 12 10:32:44 UTC 2022
Module: Mesa
Branch: main
Commit: 11ab86d58121ce21f3d93d7264c80e3f9953369c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=11ab86d58121ce21f3d93d7264c80e3f9953369c
Author: Icecream95 <ixn at disroot.org>
Date: Sun Aug 8 13:20:06 2021 +1200
drm-shim: Return fake render nodes in /dev/dri first
loader_open_render_node returns the first device in /dev/dri that it
can use. To make sure the drm-shim device always gets chosen, return
the fake entries in readdir before returning the real ones.
Reviewed-by: Emma Anholt <emma at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12203>
---
src/drm-shim/drm_shim.c | 51 ++++++++++++++++++++++++-------------------------
1 file changed, 25 insertions(+), 26 deletions(-)
diff --git a/src/drm-shim/drm_shim.c b/src/drm-shim/drm_shim.c
index 2ba164c1017..8b587f81fea 100644
--- a/src/drm-shim/drm_shim.c
+++ b/src/drm-shim/drm_shim.c
@@ -519,8 +519,8 @@ opendir(const char *name)
return dir;
}
-/* If we've reached the end of the real directory list and we're
- * looking at /dev/dri, add our render node to the list.
+/* If we're looking at /dev/dri, add our render node to the list
+ * before the real entries in the directory.
*/
PUBLIC struct dirent *
readdir(DIR *dir)
@@ -529,26 +529,25 @@ readdir(DIR *dir)
struct dirent *ent = NULL;
- if (dir != fake_dev_dri)
- ent = real_readdir(dir);
static struct dirent render_node_dirent = { 0 };
- if (!ent) {
- mtx_lock(&shim_lock);
- if (_mesa_set_search(opendir_set, dir)) {
- strcpy(render_node_dirent.d_name,
- render_node_dirent_name);
- ent = &render_node_dirent;
- _mesa_set_remove_key(opendir_set, dir);
- }
- mtx_unlock(&shim_lock);
+ mtx_lock(&shim_lock);
+ if (_mesa_set_search(opendir_set, dir)) {
+ strcpy(render_node_dirent.d_name,
+ render_node_dirent_name);
+ ent = &render_node_dirent;
+ _mesa_set_remove_key(opendir_set, dir);
}
+ mtx_unlock(&shim_lock);
+
+ if (!ent && dir != fake_dev_dri)
+ ent = real_readdir(dir);
return ent;
}
-/* If we've reached the end of the real directory list and we're
- * looking at /dev/dri, add our render node to the list.
+/* If we're looking at /dev/dri, add our render node to the list
+ * before the real entries in the directory.
*/
PUBLIC struct dirent64 *
readdir64(DIR *dir)
@@ -556,20 +555,20 @@ readdir64(DIR *dir)
init_shim();
struct dirent64 *ent = NULL;
- if (dir != fake_dev_dri)
- ent = real_readdir64(dir);
+
static struct dirent64 render_node_dirent = { 0 };
- if (!ent) {
- mtx_lock(&shim_lock);
- if (_mesa_set_search(opendir_set, dir)) {
- strcpy(render_node_dirent.d_name,
- render_node_dirent_name);
- ent = &render_node_dirent;
- _mesa_set_remove_key(opendir_set, dir);
- }
- mtx_unlock(&shim_lock);
+ mtx_lock(&shim_lock);
+ if (_mesa_set_search(opendir_set, dir)) {
+ strcpy(render_node_dirent.d_name,
+ render_node_dirent_name);
+ ent = &render_node_dirent;
+ _mesa_set_remove_key(opendir_set, dir);
}
+ mtx_unlock(&shim_lock);
+
+ if (!ent && dir != fake_dev_dri)
+ ent = real_readdir64(dir);
return ent;
}
More information about the mesa-commit
mailing list