pipe-loader: move dup(fd) within pipe_loader_drm_probe_fd
authorEmil Velikov <emil.velikov@collabora.com>
Wed, 29 Aug 2018 17:13:14 +0000 (18:13 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Wed, 3 Oct 2018 12:38:05 +0000 (13:38 +0100)
Currently pipe_loader_drm_probe_fd takes ownership of the fd given.
To match that, pipe_loader_release closes it.

Yet we have many instances which do not want the change of ownership,
and thus duplicate the fd before passing it to the pipe-loader.

Move the dup() within pipe-loader, explicitly document that and document
all the cases through the codebase.

A trivial git grep -2 pipe_loader_release makes things as obvious as it
gets ;-)

Cc: Leo Liu <leo.liu@amd.com>
Cc: Thomas Hellstrom <thellstrom@vmware.com>
Cc: Axel Davy <davyaxel0@gmail.com>
Cc: Patrick Rudolph <siro@das-labor.org>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Axel Davy <davyaxel0@gmail.com> (for nine)
src/gallium/auxiliary/pipe-loader/pipe_loader.h
src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
src/gallium/auxiliary/vl/vl_winsys_dri.c
src/gallium/auxiliary/vl/vl_winsys_drm.c
src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_screen.c
src/gallium/state_trackers/xa/xa_tracker.c
src/gallium/targets/d3dadapter9/drm.c

index b50114310b4a43e58658adf2e2633e4dda9e22f7..be7e25afb0276c3704868b2757c5459ebc0db7e4 100644 (file)
@@ -146,6 +146,9 @@ pipe_loader_sw_probe_dri(struct pipe_loader_device **devs,
  *
  * This function is platform-specific.
  *
+ * Function does not take ownership of the fd, but duplicates it locally.
+ * The local fd is closed during pipe_loader_release.
+ *
  * \sa pipe_loader_probe
  */
 bool
index 6d2ed6e76f8d5ac11c8823728191f6d5f3b42124..5a88a2ac2f007110a762dbf1561783e0f81e498a 100644 (file)
@@ -35,6 +35,7 @@
 #include <string.h>
 #include <xf86drm.h>
 #include <unistd.h>
+#include <fcntl.h>
 
 #include "loader.h"
 #include "target-helpers/drm_helper_public.h"
@@ -168,8 +169,8 @@ get_driver_descriptor(const char *driver_name, struct util_dl_library **plib)
    return NULL;
 }
 
-bool
-pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
+static bool
+pipe_loader_drm_probe_fd_nodup(struct pipe_loader_device **dev, int fd)
 {
    struct pipe_loader_drm_device *ddev = CALLOC_STRUCT(pipe_loader_drm_device);
    int vendor_id, chip_id;
@@ -212,6 +213,22 @@ pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
    return false;
 }
 
+bool
+pipe_loader_drm_probe_fd(struct pipe_loader_device **dev, int fd)
+{
+   bool ret;
+   int new_fd;
+
+   if (fd < 0 || (new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3)) < 0)
+     return false;
+
+   ret = pipe_loader_drm_probe_fd_nodup(dev, new_fd);
+   if (!ret)
+      close(new_fd);
+
+   return ret;
+}
+
 static int
 open_drm_render_node_minor(int minor)
 {
@@ -234,7 +251,7 @@ pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
       if (fd < 0)
          continue;
 
-      if (!pipe_loader_drm_probe_fd(&dev, fd)) {
+      if (!pipe_loader_drm_probe_fd_nodup(&dev, fd)) {
          close(fd);
          continue;
       }
index cb779010a9c73a7fc9fd782583c3ff3324549692..137885d9475e5a14aab19048f1c74345daf70239 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <fcntl.h>
 
 #include <X11/Xlib-xcb.h>
 #include <X11/extensions/dri2tokens.h>
@@ -471,6 +470,8 @@ vl_dri2_screen_create(Display *display, int screen)
    vl_compositor_reset_dirty_area(&scrn->dirty_areas[0]);
    vl_compositor_reset_dirty_area(&scrn->dirty_areas[1]);
 
+   /* The pipe loader duplicates the fd */
+   close(fd);
    free(authenticate);
    free(connect);
    free(dri2_query);
@@ -479,15 +480,12 @@ vl_dri2_screen_create(Display *display, int screen)
    return &scrn->base;
 
 release_pipe:
-   if (scrn->base.dev) {
+   if (scrn->base.dev)
       pipe_loader_release(&scrn->base.dev, 1);
-      fd = -1;
-   }
 free_authenticate:
    free(authenticate);
 close_fd:
-   if (fd != -1)
-      close(fd);
+   close(fd);
 free_connect:
    free(connect);
 free_query:
@@ -515,5 +513,6 @@ vl_dri2_screen_destroy(struct vl_screen *vscreen)
    vl_dri2_destroy_drawable(scrn);
    scrn->base.pscreen->destroy(scrn->base.pscreen);
    pipe_loader_release(&scrn->base.dev, 1);
+   /* There is no user provided fd */
    FREE(scrn);
 }
index df8809c501cb70de2883a7ccb5498a30e75b9cfb..94eb6d74ee71643a24a0d700fb6e68ad22e29df3 100644 (file)
@@ -26,7 +26,6 @@
  **************************************************************************/
 
 #include <assert.h>
-#include <fcntl.h>
 
 #include "pipe/p_screen.h"
 #include "pipe-loader/pipe_loader.h"
@@ -48,10 +47,7 @@ vl_drm_screen_create(int fd)
    if (!vscreen)
       return NULL;
 
-   if (fd < 0 || (new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3)) < 0)
-      goto free_screen;
-
-   if (pipe_loader_drm_probe_fd(&vscreen->dev, new_fd))
+   if (pipe_loader_drm_probe_fd(&vscreen->dev, fd))
       vscreen->pscreen = pipe_loader_create_screen(vscreen->dev);
 
    if (!vscreen->pscreen)
@@ -68,10 +64,7 @@ vl_drm_screen_create(int fd)
 release_pipe:
    if (vscreen->dev)
       pipe_loader_release(&vscreen->dev, 1);
-   else
-      close(new_fd);
 
-free_screen:
    FREE(vscreen);
    return NULL;
 }
@@ -83,5 +76,6 @@ vl_drm_screen_destroy(struct vl_screen *vscreen)
 
    vscreen->pscreen->destroy(vscreen->pscreen);
    pipe_loader_release(&vscreen->dev, 1);
+   /* CHECK: The VAAPI loader/user preserves ownership of the original fd */
    FREE(vscreen);
 }
index 20540e3988143884c70757f1699c5693d1482e7e..b17c5e16edef038751d7820114c4a42bae78059a 100644 (file)
@@ -29,7 +29,6 @@
  */
 
 #include <xf86drm.h>
-#include <fcntl.h>
 #include "GL/mesa_glinterop.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
@@ -2103,7 +2102,6 @@ dri2_init_screen(__DRIscreen * sPriv)
    struct pipe_screen *pscreen = NULL;
    const struct drm_conf_ret *throttle_ret;
    const struct drm_conf_ret *dmabuf_ret;
-   int fd;
 
    screen = CALLOC_STRUCT(dri_screen);
    if (!screen)
@@ -2115,11 +2113,7 @@ dri2_init_screen(__DRIscreen * sPriv)
 
    sPriv->driverPrivate = (void *)screen;
 
-   if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0)
-      goto free_screen;
-
-
-   if (pipe_loader_drm_probe_fd(&screen->dev, fd)) {
+   if (pipe_loader_drm_probe_fd(&screen->dev, screen->fd)) {
       dri_init_options(screen);
 
       pscreen = pipe_loader_create_screen(screen->dev);
@@ -2180,10 +2174,7 @@ destroy_screen:
 release_pipe:
    if (screen->dev)
       pipe_loader_release(&screen->dev, 1);
-   else
-      close(fd);
 
-free_screen:
    FREE(screen);
    return NULL;
 }
@@ -2212,10 +2203,7 @@ dri_kms_init_screen(__DRIscreen * sPriv)
 
    sPriv->driverPrivate = (void *)screen;
 
-   if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0)
-      goto free_screen;
-
-   if (pipe_loader_sw_probe_kms(&screen->dev, fd)) {
+   if (pipe_loader_sw_probe_kms(&screen->dev, screen->fd)) {
       dri_init_options(screen);
       pscreen = pipe_loader_create_screen(screen->dev);
    }
@@ -2257,10 +2245,7 @@ destroy_screen:
 release_pipe:
    if (screen->dev)
       pipe_loader_release(&screen->dev, 1);
-   else
-      close(fd);
 
-free_screen:
    FREE(screen);
 #endif // GALLIUM_SOFTPIPE
    return NULL;
index 308e23685e80caf1d63332fd88e334ae97d1b2c3..82a0988a634fabc11569113471d3f64dcea47554 100644 (file)
@@ -488,6 +488,7 @@ dri_destroy_screen(__DRIscreen * sPriv)
 
    pipe_loader_release(&screen->dev, 1);
 
+   /* The caller in dri_util preserves the fd ownership */
    free(screen);
    sPriv->driverPrivate = NULL;
    sPriv->extensions = NULL;
index c046a3a7097c576eb13aec7ca66c8c7c1a23de96..d07cd146af93bca5b79164ca4feb1142ec3e97de 100644 (file)
@@ -27,7 +27,6 @@
  */
 
 #include <unistd.h>
-#include <fcntl.h>
 #include "xa_tracker.h"
 #include "xa_priv.h"
 #include "pipe/p_state.h"
@@ -153,15 +152,11 @@ xa_tracker_create(int drm_fd)
     struct xa_tracker *xa = calloc(1, sizeof(struct xa_tracker));
     enum xa_surface_type stype;
     unsigned int num_formats;
-    int fd;
 
     if (!xa)
        return NULL;
 
-    if (drm_fd < 0 || (fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 3)) < 0)
-       goto out_no_fd;
-
-    if (pipe_loader_drm_probe_fd(&xa->dev, fd))
+    if (pipe_loader_drm_probe_fd(&xa->dev, drm_fd))
        xa->screen = pipe_loader_create_screen(xa->dev);
 
     if (!xa->screen)
@@ -213,9 +208,7 @@ xa_tracker_create(int drm_fd)
  out_no_screen:
     if (xa->dev)
        pipe_loader_release(&xa->dev, 1);
-    else
-       close(fd);
- out_no_fd:
+
     free(xa);
     return NULL;
 }
@@ -227,6 +220,7 @@ xa_tracker_destroy(struct xa_tracker *xa)
     xa_context_destroy(xa->default_ctx);
     xa->screen->destroy(xa->screen);
     pipe_loader_release(&xa->dev, 1);
+    /* CHECK: The XA API user preserves ownership of the original fd */
     free(xa);
 }
 
index a2a36dbbda99dc2ddc46370004e0f323ee6499bf..85b3e10633e208bbe8f271a86fdf6278d6c18092 100644 (file)
@@ -107,7 +107,7 @@ drm_destroy( struct d3dadapter9_context *ctx )
     if (drm->dev)
         pipe_loader_release(&drm->dev, 1);
 
-    /* The pipe loader takes ownership of the fd */
+    close(drm->fd);
     FREE(ctx);
 }