mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-04 04:06:26 +00:00
media: core: Rework how create_buf index returned value is computed
When REMOVE_BUFS will be introduced holes could created in bufs array. To be able to reuse these unused indices reworking how create->index is set is mandatory. Let __vb2_queue_alloc() decide which first index is correct and forward this to the caller. Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com> Acked-by: Mauro Carvalho Chehab <mchehab@kernel.org> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
parent
f5131d5ce4
commit
6e423b75d0
@ -442,12 +442,15 @@ static void vb2_queue_remove_buffer(struct vb2_buffer *vb)
|
||||
* __vb2_queue_alloc() - allocate vb2 buffer structures and (for MMAP type)
|
||||
* video buffer memory for all buffers/planes on the queue and initializes the
|
||||
* queue
|
||||
* @first_index: index of the first created buffer, all newly allocated buffers
|
||||
* have indices in the range [first_index..first_index+count-1]
|
||||
*
|
||||
* Returns the number of buffers successfully allocated.
|
||||
*/
|
||||
static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
|
||||
unsigned int num_buffers, unsigned int num_planes,
|
||||
const unsigned plane_sizes[VB2_MAX_PLANES])
|
||||
const unsigned int plane_sizes[VB2_MAX_PLANES],
|
||||
unsigned int *first_index)
|
||||
{
|
||||
unsigned int q_num_buffers = vb2_get_num_buffers(q);
|
||||
unsigned int buffer, plane;
|
||||
@ -461,6 +464,8 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
|
||||
num_buffers = min_t(unsigned int, num_buffers,
|
||||
q->max_num_buffers - q_num_buffers);
|
||||
|
||||
*first_index = q_num_buffers;
|
||||
|
||||
for (buffer = 0; buffer < num_buffers; ++buffer) {
|
||||
/* Allocate vb2 buffer structures */
|
||||
vb = kzalloc(q->buf_struct_size, GFP_KERNEL);
|
||||
@ -820,7 +825,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
unsigned int q_num_bufs = vb2_get_num_buffers(q);
|
||||
unsigned plane_sizes[VB2_MAX_PLANES] = { };
|
||||
bool non_coherent_mem = flags & V4L2_MEMORY_FLAG_NON_COHERENT;
|
||||
unsigned int i;
|
||||
unsigned int i, first_index;
|
||||
int ret = 0;
|
||||
|
||||
if (q->streaming) {
|
||||
@ -907,8 +912,10 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
|
||||
/* Finally, allocate buffers and video memory */
|
||||
allocated_buffers =
|
||||
__vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes);
|
||||
__vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes, &first_index);
|
||||
if (allocated_buffers == 0) {
|
||||
/* There shouldn't be any buffers allocated, so first_index == 0 */
|
||||
WARN_ON(first_index);
|
||||
dprintk(q, 1, "memory allocation failed\n");
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
@ -982,7 +989,8 @@ EXPORT_SYMBOL_GPL(vb2_core_reqbufs);
|
||||
int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
unsigned int flags, unsigned int *count,
|
||||
unsigned int requested_planes,
|
||||
const unsigned int requested_sizes[])
|
||||
const unsigned int requested_sizes[],
|
||||
unsigned int *first_index)
|
||||
{
|
||||
unsigned int num_planes = 0, num_buffers, allocated_buffers;
|
||||
unsigned plane_sizes[VB2_MAX_PLANES] = { };
|
||||
@ -1044,7 +1052,7 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
|
||||
/* Finally, allocate buffers and video memory */
|
||||
allocated_buffers = __vb2_queue_alloc(q, memory, num_buffers,
|
||||
num_planes, plane_sizes);
|
||||
num_planes, plane_sizes, first_index);
|
||||
if (allocated_buffers == 0) {
|
||||
dprintk(q, 1, "memory allocation failed\n");
|
||||
ret = -ENOMEM;
|
||||
|
@ -795,11 +795,15 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)
|
||||
for (i = 0; i < requested_planes; i++)
|
||||
if (requested_sizes[i] == 0)
|
||||
return -EINVAL;
|
||||
return ret ? ret : vb2_core_create_bufs(q, create->memory,
|
||||
create->flags,
|
||||
&create->count,
|
||||
requested_planes,
|
||||
requested_sizes);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return vb2_core_create_bufs(q, create->memory,
|
||||
create->flags,
|
||||
&create->count,
|
||||
requested_planes,
|
||||
requested_sizes,
|
||||
&create->index);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vb2_create_bufs);
|
||||
|
||||
|
@ -826,6 +826,8 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
* @count: requested buffer count.
|
||||
* @requested_planes: number of planes requested.
|
||||
* @requested_sizes: array with the size of the planes.
|
||||
* @first_index: index of the first created buffer, all allocated buffers have
|
||||
* indices in the range [first_index..first_index+count-1]
|
||||
*
|
||||
* Videobuf2 core helper to implement VIDIOC_CREATE_BUFS() operation. It is
|
||||
* called internally by VB2 by an API-specific handler, like
|
||||
@ -842,7 +844,8 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
|
||||
unsigned int flags, unsigned int *count,
|
||||
unsigned int requested_planes,
|
||||
const unsigned int requested_sizes[]);
|
||||
const unsigned int requested_sizes[],
|
||||
unsigned int *first_index);
|
||||
|
||||
/**
|
||||
* vb2_core_prepare_buf() - Pass ownership of a buffer from userspace
|
||||
|
Loading…
Reference in New Issue
Block a user