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@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12203>
This commit is contained in:
Icecream95 2021-08-08 13:20:06 +12:00 committed by Marge Bot
parent dfd30035b9
commit 11ab86d581
1 changed files with 25 additions and 26 deletions

View File

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