summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/nouveau/drm
diff options
context:
space:
mode:
authorMario Kleiner <[email protected]>2015-06-05 15:36:52 +0200
committerIlia Mirkin <[email protected]>2015-06-28 01:11:38 -0400
commita98600b0ebdfc8481c168aae6c5670071e22fc29 (patch)
tree3debd48739241ab0258e0f0ae99b292810a4ec29 /src/gallium/winsys/nouveau/drm
parent2a210b797eacd27a556af9c5e0edca940f9486c5 (diff)
nouveau: Use dup fd as key in drm-winsys hash table to fix ZaphodHeads.
The dup'ed fd owned by the nouveau_screen for a device node must also be used as key for the winsys hash table, instead of using the original fd passed in for a screen, to make multi-x-screen ZaphodHeads configurations work on nouveau. The original fd's lifetime differs from that of the nouveau_screen stored in the hash. The hash key is the fd, and in order to compare hash entries we fstat them, so the fd must be around for as long as the screen is. This is an extension of the fix in commit a59f2bb1 (nouveau: dup fd before passing it to device). Cc: "10.3 10.4 10.5 10.6" <[email protected]> Signed-off-by: Mario Kleiner <[email protected]> Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/winsys/nouveau/drm')
-rw-r--r--src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
index 063524655b6..5a4c256539d 100644
--- a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
+++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
@@ -120,7 +120,11 @@ nouveau_drm_screen_create(int fd)
if (!screen)
goto err;
- util_hash_table_set(fd_tab, intptr_to_pointer(fd), screen);
+ /* Use dupfd in hash table, to avoid errors if the original fd gets
+ * closed by its owner. The hash key needs to live at least as long as
+ * the screen.
+ */
+ util_hash_table_set(fd_tab, intptr_to_pointer(dupfd), screen);
screen->refcount = 1;
pipe_mutex_unlock(nouveau_screen_mutex);
return &screen->base;