Pawel, Marek, Before taking this to my tree I wanted to get an ACK from one of the videobuf2 maintainers. Could you spare a moment to look through this patch? Best wishes, -- Kamil Debski Samsung R&D Institute Poland > -----Original Message----- > From: John Sheu [mailto:sheu@xxxxxxxxxx] > Sent: Tuesday, March 11, 2014 11:52 PM > To: linux-media@xxxxxxxxxxxxxxx > Cc: m.chehab@xxxxxxxxxxx; k.debski@xxxxxxxxxxx; posciak@xxxxxxxxxx; > arun.m@xxxxxxxxxxx; kgene.kim@xxxxxxxxxxx; John Sheu > Subject: [PATCH 4/4] v4l2-mem2mem: allow reqbufs(0) with "in use" MMAP > buffers > > v4l2-mem2mem 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 for deallocating buffers in a > few > cases: > > * In the case that there are outstanding mmap()ed views on the buffer, > refcounting on the videobuf2 buffer backing the vm_area will track > lifetime appropriately, > * In the case that the buffer has been exported as a DMABUF, > refcounting > on the videobuf2 bufer backing the DMABUF will track lifetime > appropriately. > > Remove the specific check for type V4L2_MEMOMRY_MMAP when freeing all > buffers through VIDIOC_REQBUFS. > > Signed-off-by: John Sheu <sheu@xxxxxxxxxx> > --- > drivers/media/v4l2-core/videobuf2-core.c | 26 +----------------------- > -- > 1 file changed, 1 insertion(+), 25 deletions(-) > > diff --git a/drivers/media/v4l2-core/videobuf2-core.c > b/drivers/media/v4l2-core/videobuf2-core.c > index 8e6695c9..5b6f9da6 100644 > --- a/drivers/media/v4l2-core/videobuf2-core.c > +++ b/drivers/media/v4l2-core/videobuf2-core.c > @@ -414,8 +414,7 @@ static int __verify_length(struct vb2_buffer *vb, > const struct v4l2_buffer *b) } > > /** > - * __buffer_in_use() - return true if the buffer is in use and > - * the queue cannot be freed (by the means of REQBUFS(0)) call > + * __buffer_in_use() - return true if the buffer is in use. > */ > static bool __buffer_in_use(struct vb2_queue *q, struct vb2_buffer > *vb) { @@ -435,20 +434,6 @@ static bool __buffer_in_use(struct > vb2_queue *q, struct vb2_buffer *vb) } > > /** > - * __buffers_in_use() - return true if any buffers on the queue are in > use and > - * the queue cannot be freed (by the means of REQBUFS(0)) call > - */ > -static bool __buffers_in_use(struct vb2_queue *q) -{ > - unsigned int buffer; > - for (buffer = 0; buffer < q->num_buffers; ++buffer) { > - if (__buffer_in_use(q, q->bufs[buffer])) > - return true; > - } > - return false; > -} > - > -/** > * __fill_v4l2_buffer() - fill in a struct v4l2_buffer with > information to be > * returned to userspace > */ > @@ -681,15 +666,6 @@ static int __reqbufs(struct vb2_queue *q, struct > v4l2_requestbuffers *req) > } > > if (req->count == 0 || q->num_buffers != 0 || q->memory != req- > >memory) { > - /* > - * We already have buffers allocated, so first check if > they > - * are not in use and can be freed. > - */ > - if (q->memory == V4L2_MEMORY_MMAP && __buffers_in_use(q)) { > - dprintk(1, "reqbufs: memory in use, cannot free\n"); > - return -EBUSY; > - } > - > ret = __vb2_queue_free(q, q->num_buffers); > if (ret) > return ret; > -- > 1.9.0.279.gdc9e3eb -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html