From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757166AbdKQHTP convert rfc822-to-8bit (ORCPT ); Fri, 17 Nov 2017 02:19:15 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:33974 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757086AbdKQHTF (ORCPT ); Fri, 17 Nov 2017 02:19:05 -0500 X-Google-Smtp-Source: AGs4zMYSGNep+7l2NXraM8/aXW5v1jffvBpYzSaKzD76F9iC4E9p0A3t+P97cRNjdY64O68M5O58RA== From: Alexandre Courbot To: Gustavo Padovan Cc: , Hans Verkuil , Mauro Carvalho Chehab , Shuah Khan , Pawel Osciak , Sakari Ailus , Brian Starkey , Thierry Escande , , Gustavo Padovan Subject: Re: [RFC v5 09/11] [media] vb2: add infrastructure to support =?iso-8859-1?Q?out-fences?= Date: Fri, 17 Nov 2017 16:19:00 +0900 MIME-Version: 1.0 Message-ID: <17276dda-817b-4977-bb6e-77a818fe5f3e@chromium.org> In-Reply-To: <20171115171057.17340-10-gustavo@padovan.org> References: <20171115171057.17340-1-gustavo@padovan.org> <20171115171057.17340-10-gustavo@padovan.org> User-Agent: Trojita/v0.7-289-g2a9cdc9f; Qt/5.7.1; xcb; Linux; Debian GNU/Linux rodete (upgraded from: Ubuntu 14.04.5 LTS) Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thursday, November 16, 2017 2:10:55 AM JST, Gustavo Padovan wrote: > From: Gustavo Padovan > > Add vb2_setup_out_fence() and the needed members to struct vb2_buffer. > > v3: > - Do not hold yet another ref to the out_fence (Brian Starkey) > > v2: - change it to reflect fd_install at DQEVENT > - add fence context for out-fences > > Signed-off-by: Gustavo Padovan > --- > drivers/media/v4l2-core/videobuf2-core.c | 28 ++++++++++++++++++++++++++++ > include/media/videobuf2-core.h | 20 ++++++++++++++++++++ > 2 files changed, 48 insertions(+) > > diff --git a/drivers/media/v4l2-core/videobuf2-core.c > b/drivers/media/v4l2-core/videobuf2-core.c > index 26de4c80717d..8b4f0e9bcb36 100644 > --- a/drivers/media/v4l2-core/videobuf2-core.c > +++ b/drivers/media/v4l2-core/videobuf2-core.c > @@ -24,8 +24,10 @@ > #include > #include > #include > +#include > > #include > +#include > #include > > #include > @@ -1320,6 +1322,32 @@ int vb2_core_prepare_buf(struct > vb2_queue *q, unsigned int index, void *pb) > } > EXPORT_SYMBOL_GPL(vb2_core_prepare_buf); > > +int vb2_setup_out_fence(struct vb2_queue *q, unsigned int index) > +{ > + struct vb2_buffer *vb; > + > + vb = q->bufs[index]; > + > + vb->out_fence_fd = get_unused_fd_flags(O_CLOEXEC); out_fence_fd is allocated in this patch but not used anywhere for the moment. For consistency, maybe move its allocation to the next patch, or move the call to fd_install() here if that is possible? In both cases, the call to get_unused_fd() can be moved right before fd_install() so you don't need to call put_unused_fd() in the error paths below. ... same thing for sync_file too. Maybe this patch can just be merged into the next one? The current patch just creates an incomplete version of vb2_setup_out_fence() for which no user exist yet. > + > + vb->out_fence = vb2_fence_alloc(q->out_fence_context); > + if (!vb->out_fence) { > + put_unused_fd(vb->out_fence_fd); > + return -ENOMEM; > + } > + > + vb->sync_file = sync_file_create(vb->out_fence); > + if (!vb->sync_file) { > + put_unused_fd(vb->out_fence_fd); > + dma_fence_put(vb->out_fence); > + vb->out_fence = NULL; > + return -ENOMEM; > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(vb2_setup_out_fence); > + > /** > * vb2_start_streaming() - Attempt to start streaming. > * @q: videobuf2 queue > diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h > index 5f48c7be7770..a9b0697bd782 100644 > --- a/include/media/videobuf2-core.h > +++ b/include/media/videobuf2-core.h > @@ -259,6 +259,10 @@ struct vb2_buffer { > * using the buffer (queueing to the driver) > * fence_cb: fence callback information > * fence_cb_lock: protect callback signal/remove > + * out_fence_fd: the out_fence_fd to be shared with userspace. > + * out_fence: the out-fence associated with the buffer once > + * it is queued to the driver. > + * sync_file: the sync file to wrap the out fence > */ > enum vb2_buffer_state state; > > @@ -269,6 +273,10 @@ struct vb2_buffer { > struct dma_fence_cb fence_cb; > spinlock_t fence_cb_lock; > > + int out_fence_fd; > + struct dma_fence *out_fence; > + struct sync_file *sync_file; > + > #ifdef CONFIG_VIDEO_ADV_DEBUG > /* > * Counters for how often these buffer-related ops are > @@ -514,6 +522,7 @@ struct vb2_buf_ops { > * @last_buffer_dequeued: used in poll() and DQBUF to > immediately return if the > * last decoded buffer was already dequeued. Set for capture queues > * when a buffer with the V4L2_BUF_FLAG_LAST is dequeued. > + * @out_fence_context: the fence context for the out fences > * @last_fence: last in-fence received. Used to keep ordering. > * @fileio: file io emulator internal data, used only if emulator is active > * @threadio: thread io internal data, used only if thread is active > @@ -569,6 +578,7 @@ struct vb2_queue { > unsigned int copy_timestamp:1; > unsigned int last_buffer_dequeued:1; > > + u64 out_fence_context; > struct dma_fence *last_fence; > > struct vb2_fileio_data *fileio; > @@ -740,6 +750,16 @@ int vb2_core_create_bufs(struct vb2_queue > *q, enum vb2_memory memory, > int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int > index, void *pb); > > /** > + * vb2_setup_out_fence() - setup new out-fence > + * @q: The vb2_queue where to setup it > + * @index: index of the buffer > + * > + * Setup the file descriptor, the fence and the sync_file for the next > + * buffer to be queued and add everything to the tail of the > q->out_fence_list. > + */ > +int vb2_setup_out_fence(struct vb2_queue *q, unsigned int index); > + > +/** > * vb2_core_qbuf() - Queue a buffer from userspace > * > * @q: videobuf2 queue