From 3d7a2ee97e3f1eaffe5f3f9e38c26506feac245b Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 28 Jun 2019 11:30:49 +0100 Subject: [PATCH 689/782] Revert "media: vb2: Allow reqbufs(0) with "in use" MMAP buffers" This reverts commit a2c73e18c1f657de6d654f51effa0a94863abbd8. An alternative version was accepted upstream. Revert this patch to apply that one. Signed-off-by: Dave Stevenson --- .../media/common/videobuf2/videobuf2-core.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -554,6 +554,20 @@ bool vb2_buffer_in_use(struct vb2_queue } EXPORT_SYMBOL(vb2_buffer_in_use); +/* + * __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 (vb2_buffer_in_use(q, q->bufs[buffer])) + return true; + } + return false; +} + void vb2_core_querybuf(struct vb2_queue *q, unsigned int index, void *pb) { call_void_bufop(q, fill_user_buffer, q->bufs[index], pb); @@ -665,7 +679,16 @@ int vb2_core_reqbufs(struct vb2_queue *q if (*count == 0 || q->num_buffers != 0 || (q->memory != VB2_MEMORY_UNKNOWN && q->memory != memory)) { + /* + * We already have buffers allocated, so first check if they + * are not in use and can be freed. + */ mutex_lock(&q->mmap_lock); + if (q->memory == VB2_MEMORY_MMAP && __buffers_in_use(q)) { + mutex_unlock(&q->mmap_lock); + dprintk(1, "memory in use, cannot free\n"); + return -EBUSY; + } /* * Call queue_cancel to clean up any buffers in the PREPARED or