kmssink: Don't leak GEM primed from DMABuf
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 6 Jul 2017 21:20:56 +0000 (17:20 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Fri, 7 Jul 2017 19:49:24 +0000 (15:49 -0400)
This otherwise breaks DMABuf reclaiming. This is not visible from
userspace, but inside the kernel, the DRM driver will hold a ref to the
DMABuf object. With a V4L2 driver allocating those DMABuf, it then
prevent changing the resolution and re-allocation new buffers.

https://bugzilla.gnome.org/show_bug.cgi?id=782774

sys/kms/gstkmsallocator.c

index 687ebf9..648ac2f 100644 (file)
@@ -478,6 +478,18 @@ gst_kms_allocator_dmabuf_import (GstAllocator * allocator, gint * prime_fds,
   if (!gst_kms_allocator_add_fb (alloc, tmp, offsets, vinfo))
     goto failed;
 
+  for (i = 0; i < n_planes; i++) {
+    struct drm_gem_close arg = { tmp->gem_handle[i], };
+    gint err;
+
+    err = drmIoctl (alloc->priv->fd, DRM_IOCTL_GEM_CLOSE, &arg);
+    if (err)
+      GST_WARNING_OBJECT (allocator,
+          "Failed to close GEM handle: %s %d", strerror (errno), errno);
+
+    tmp->gem_handle[i] = 0;
+  }
+
   return tmp;
 
   /* ERRORS */