[media] uvcvideo: Move mutex lock/unlock inside uvc_free_buffers
Callers outside uvc_queue.c should not be forced to lock/unlock the queue mutex manually. Move the mutex operations inside uvc_free_buffers(). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
23d9f3ef23
commit
8e815e1763
@@ -89,6 +89,39 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
|
|||||||
queue->type = type;
|
queue->type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Free the video buffers.
|
||||||
|
*
|
||||||
|
* This function must be called with the queue lock held.
|
||||||
|
*/
|
||||||
|
static int __uvc_free_buffers(struct uvc_video_queue *queue)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < queue->count; ++i) {
|
||||||
|
if (queue->buffer[i].vma_use_count != 0)
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queue->count) {
|
||||||
|
vfree(queue->mem);
|
||||||
|
queue->count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int uvc_free_buffers(struct uvc_video_queue *queue)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&queue->mutex);
|
||||||
|
ret = __uvc_free_buffers(queue);
|
||||||
|
mutex_unlock(&queue->mutex);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate the video buffers.
|
* Allocate the video buffers.
|
||||||
*
|
*
|
||||||
@@ -110,7 +143,7 @@ int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers,
|
|||||||
|
|
||||||
mutex_lock(&queue->mutex);
|
mutex_lock(&queue->mutex);
|
||||||
|
|
||||||
if ((ret = uvc_free_buffers(queue)) < 0)
|
if ((ret = __uvc_free_buffers(queue)) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* Bail out if no buffers should be allocated. */
|
/* Bail out if no buffers should be allocated. */
|
||||||
@@ -151,28 +184,6 @@ done:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Free the video buffers.
|
|
||||||
*
|
|
||||||
* This function must be called with the queue lock held.
|
|
||||||
*/
|
|
||||||
int uvc_free_buffers(struct uvc_video_queue *queue)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < queue->count; ++i) {
|
|
||||||
if (queue->buffer[i].vma_use_count != 0)
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (queue->count) {
|
|
||||||
vfree(queue->mem);
|
|
||||||
queue->count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if buffers have been allocated.
|
* Check if buffers have been allocated.
|
||||||
*/
|
*/
|
||||||
|
@@ -494,11 +494,9 @@ static int uvc_v4l2_release(struct file *file)
|
|||||||
if (uvc_has_privileges(handle)) {
|
if (uvc_has_privileges(handle)) {
|
||||||
uvc_video_enable(stream, 0);
|
uvc_video_enable(stream, 0);
|
||||||
|
|
||||||
mutex_lock(&stream->queue.mutex);
|
|
||||||
if (uvc_free_buffers(&stream->queue) < 0)
|
if (uvc_free_buffers(&stream->queue) < 0)
|
||||||
uvc_printk(KERN_ERR, "uvc_v4l2_release: Unable to "
|
uvc_printk(KERN_ERR, "uvc_v4l2_release: Unable to "
|
||||||
"free buffers.\n");
|
"free buffers.\n");
|
||||||
mutex_unlock(&stream->queue.mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the file handle. */
|
/* Release the file handle. */
|
||||||
|
Reference in New Issue
Block a user