• John Sheu's avatar
    media: vb2: Allow reqbufs(0) with "in use" MMAP buffers · d644cca5
    John Sheu authored
    Videobuf2 presently does not allow VIDIOC_REQBUFS to destroy outstanding
    buffers if the queue is of type V4L2_MEMORY_MMAP, and if the buffers are
    considered "in use".  This is different behavior than for other memory
    types and prevents us from deallocating buffers in following two cases:
    
    1) There are outstanding mmap()ed views on the buffer. However even if
       we put the buffer in reqbufs(0), there will be remaining references,
       due to vma .open/close() adjusting vb2 buffer refcount appropriately.
       This means that the buffer will be in fact freed only when the last
       mmap()ed view is unmapped.
    
    2) Buffer has been exported as a DMABUF. Refcount of the vb2 buffer
       is managed properly by VB2 DMABUF ops, i.e. incremented on DMABUF
       get and decremented on DMABUF release. This means that the buffer
       will be alive until all importers release it.
    
    Considering both cases above, there does not seem to be any need to
    prevent reqbufs(0) operation, because buffer lifetime is already
    properly managed by both mmap() and DMABUF code paths. Let's remove it
    and allow userspace freeing the queue (and potentially allocating a new
    one) even though old buffers might be still in processing.
    
    To let userspace know that the kernel now supports orphaning buffers
    that are still in use, add a new V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS
    to be set by reqbufs and create_bufs.
    
    [p.zabel@pengutronix.de: added V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS,
     updated documentation, and added back debug message]
    Signed-off-by: default avatarJohn Sheu <sheu@chromium.org>
    Reviewed-by: default avatarPawel Osciak <posciak@chromium.org>
    Signed-off-by: default avatarTomasz Figa <tfiga@chromium.org>
    Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
    Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    [hverkuil-cisco@xs4all.nl: added V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS ref]
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    d644cca5
videobuf2-core.c 71 KB