Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e815e17 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 23d9f3ef
Loading
Loading
Loading
Loading
+34 −23
Original line number Diff line number Diff line
@@ -89,6 +89,39 @@ void uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_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.
 *
@@ -110,7 +143,7 @@ int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers,

	mutex_lock(&queue->mutex);

	if ((ret = uvc_free_buffers(queue)) < 0)
	if ((ret = __uvc_free_buffers(queue)) < 0)
		goto done;

	/* Bail out if no buffers should be allocated. */
@@ -151,28 +184,6 @@ done:
	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.
 */
+0 −2
Original line number Diff line number Diff line
@@ -494,11 +494,9 @@ static int uvc_v4l2_release(struct file *file)
	if (uvc_has_privileges(handle)) {
		uvc_video_enable(stream, 0);

		mutex_lock(&stream->queue.mutex);
		if (uvc_free_buffers(&stream->queue) < 0)
			uvc_printk(KERN_ERR, "uvc_v4l2_release: Unable to "
					"free buffers.\n");
		mutex_unlock(&stream->queue.mutex);
	}

	/* Release the file handle. */