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