From: Nicolas Dufresne Date: Thu, 6 Jul 2017 21:20:56 +0000 (-0400) Subject: kmssink: Don't leak GEM primed from DMABuf X-Git-Tag: accepted/tizen/unified/20220217.153506~2^2~10^2~9^2~12^2~2^2~111^2~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e1c02e097d671c454e5e3afdad3c96b1eedebaf5;p=platform%2Fupstream%2Fgstreamer.git kmssink: Don't leak GEM primed from DMABuf 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 --- diff --git a/sys/kms/gstkmsallocator.c b/sys/kms/gstkmsallocator.c index 687ebf9..648ac2f 100644 --- a/sys/kms/gstkmsallocator.c +++ b/sys/kms/gstkmsallocator.c @@ -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 */