All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Gaignard <benjamin.gaignard@collabora.com>
To: mchehab@kernel.org, tfiga@chromium.org, m.szyprowski@samsung.com,
	ming.qian@nxp.com, ezequiel@vanguardiasur.com.ar,
	p.zabel@pengutronix.de, gregkh@linuxfoundation.org,
	hverkuil-cisco@xs4all.nl, nicolas.dufresne@collabora.com
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	linux-arm-msm@vger.kernel.org,
	linux-rockchip@lists.infradead.org,
	linux-staging@lists.linux.dev, kernel@collabora.com,
	Benjamin Gaignard <benjamin.gaignard@collabora.com>
Subject: [PATCH v9 48/53] media: core: Rework how create_buf index returned value is computed
Date: Mon,  2 Oct 2023 14:06:12 +0200	[thread overview]
Message-ID: <20231002120617.119602-49-benjamin.gaignard@collabora.com> (raw)
In-Reply-To: <20231002120617.119602-1-benjamin.gaignard@collabora.com>

When DELETE_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>
---
 .../media/common/videobuf2/videobuf2-core.c   | 21 ++++++++++++-------
 .../media/common/videobuf2/videobuf2-v4l2.c   | 20 +++++++++++-------
 include/media/videobuf2-core.h                |  5 ++++-
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 8da8a7dfff44..92de8af58bdc 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -440,15 +440,21 @@ static void vb2_queue_remove_buffer(struct vb2_buffer *vb)
  */
 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 plane_sizes[VB2_MAX_PLANES],
+			     unsigned int *first_index)
 {
 	unsigned int buffer, plane;
 	struct vb2_buffer *vb;
+	unsigned long index;
 	int ret;
 
 	/* Ensure that the number of already queue + num_buffers is below q->max_num_buffers */
 	num_buffers = min_t(unsigned int, num_buffers,
-			    q->max_num_buffers - q->num_buffers);
+			    q->max_num_buffers - vb2_get_num_buffers(q));
+
+	index = vb2_get_num_buffers(q);
+
+	*first_index = index;
 
 	for (buffer = 0; buffer < num_buffers; ++buffer) {
 		/* Allocate vb2 buffer structures */
@@ -468,7 +474,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
 			vb->planes[plane].min_length = plane_sizes[plane];
 		}
 
-		vb2_queue_add_buffer(q, vb, q->num_buffers + buffer);
+		vb2_queue_add_buffer(q, vb, index++);
 		call_void_bufop(q, init_buffer, vb);
 
 		/* Allocate video buffer memory for the MMAP type */
@@ -811,7 +817,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) {
@@ -897,7 +903,7 @@ 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) {
 		dprintk(q, 1, "memory allocation failed\n");
 		ret = -ENOMEM;
@@ -971,7 +977,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] = { };
@@ -1033,7 +1040,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;
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index a4ebef82d94e..6d9f1be41a19 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -808,11 +808,16 @@ 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;
+
+	ret = vb2_core_create_bufs(q, create->memory,
+				   create->flags,
+				   &create->count,
+				   requested_planes,
+				   requested_sizes,
+				   &create->index);
+	return ret;
 }
 EXPORT_SYMBOL_GPL(vb2_create_bufs);
 
@@ -1040,15 +1045,16 @@ int vb2_ioctl_create_bufs(struct file *file, void *priv,
 	int res = vb2_verify_memory_type(vdev->queue, p->memory,
 			p->format.type);
 
-	p->index = vdev->queue->num_buffers;
 	fill_buf_caps(vdev->queue, &p->capabilities);
 	validate_memory_flags(vdev->queue, p->memory, &p->flags);
 	/*
 	 * If count == 0, then just check if memory and type are valid.
 	 * Any -EBUSY result from vb2_verify_memory_type can be mapped to 0.
 	 */
-	if (p->count == 0)
+	if (p->count == 0) {
+		p->index = vb2_get_num_buffers(vdev->queue);
 		return res != -EBUSY ? res : 0;
+	}
 	if (res)
 		return res;
 	if (vb2_queue_is_busy(vdev->queue, file))
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index dffb9647d4d1..d433bf84e30c 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -803,6 +803,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..first+count]
  *
  * Videobuf2 core helper to implement VIDIOC_CREATE_BUFS() operation. It is
  * called internally by VB2 by an API-specific handler, like
@@ -819,7 +821,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
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Benjamin Gaignard <benjamin.gaignard@collabora.com>
To: mchehab@kernel.org, tfiga@chromium.org, m.szyprowski@samsung.com,
	ming.qian@nxp.com, ezequiel@vanguardiasur.com.ar,
	p.zabel@pengutronix.de, gregkh@linuxfoundation.org,
	hverkuil-cisco@xs4all.nl, nicolas.dufresne@collabora.com
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	linux-arm-msm@vger.kernel.org,
	linux-rockchip@lists.infradead.org,
	linux-staging@lists.linux.dev, kernel@collabora.com,
	Benjamin Gaignard <benjamin.gaignard@collabora.com>
Subject: [PATCH v9 48/53] media: core: Rework how create_buf index returned value is computed
Date: Mon,  2 Oct 2023 14:06:12 +0200	[thread overview]
Message-ID: <20231002120617.119602-49-benjamin.gaignard@collabora.com> (raw)
In-Reply-To: <20231002120617.119602-1-benjamin.gaignard@collabora.com>

When DELETE_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>
---
 .../media/common/videobuf2/videobuf2-core.c   | 21 ++++++++++++-------
 .../media/common/videobuf2/videobuf2-v4l2.c   | 20 +++++++++++-------
 include/media/videobuf2-core.h                |  5 ++++-
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 8da8a7dfff44..92de8af58bdc 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -440,15 +440,21 @@ static void vb2_queue_remove_buffer(struct vb2_buffer *vb)
  */
 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 plane_sizes[VB2_MAX_PLANES],
+			     unsigned int *first_index)
 {
 	unsigned int buffer, plane;
 	struct vb2_buffer *vb;
+	unsigned long index;
 	int ret;
 
 	/* Ensure that the number of already queue + num_buffers is below q->max_num_buffers */
 	num_buffers = min_t(unsigned int, num_buffers,
-			    q->max_num_buffers - q->num_buffers);
+			    q->max_num_buffers - vb2_get_num_buffers(q));
+
+	index = vb2_get_num_buffers(q);
+
+	*first_index = index;
 
 	for (buffer = 0; buffer < num_buffers; ++buffer) {
 		/* Allocate vb2 buffer structures */
@@ -468,7 +474,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
 			vb->planes[plane].min_length = plane_sizes[plane];
 		}
 
-		vb2_queue_add_buffer(q, vb, q->num_buffers + buffer);
+		vb2_queue_add_buffer(q, vb, index++);
 		call_void_bufop(q, init_buffer, vb);
 
 		/* Allocate video buffer memory for the MMAP type */
@@ -811,7 +817,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) {
@@ -897,7 +903,7 @@ 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) {
 		dprintk(q, 1, "memory allocation failed\n");
 		ret = -ENOMEM;
@@ -971,7 +977,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] = { };
@@ -1033,7 +1040,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;
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index a4ebef82d94e..6d9f1be41a19 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -808,11 +808,16 @@ 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;
+
+	ret = vb2_core_create_bufs(q, create->memory,
+				   create->flags,
+				   &create->count,
+				   requested_planes,
+				   requested_sizes,
+				   &create->index);
+	return ret;
 }
 EXPORT_SYMBOL_GPL(vb2_create_bufs);
 
@@ -1040,15 +1045,16 @@ int vb2_ioctl_create_bufs(struct file *file, void *priv,
 	int res = vb2_verify_memory_type(vdev->queue, p->memory,
 			p->format.type);
 
-	p->index = vdev->queue->num_buffers;
 	fill_buf_caps(vdev->queue, &p->capabilities);
 	validate_memory_flags(vdev->queue, p->memory, &p->flags);
 	/*
 	 * If count == 0, then just check if memory and type are valid.
 	 * Any -EBUSY result from vb2_verify_memory_type can be mapped to 0.
 	 */
-	if (p->count == 0)
+	if (p->count == 0) {
+		p->index = vb2_get_num_buffers(vdev->queue);
 		return res != -EBUSY ? res : 0;
+	}
 	if (res)
 		return res;
 	if (vb2_queue_is_busy(vdev->queue, file))
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index dffb9647d4d1..d433bf84e30c 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -803,6 +803,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..first+count]
  *
  * Videobuf2 core helper to implement VIDIOC_CREATE_BUFS() operation. It is
  * called internally by VB2 by an API-specific handler, like
@@ -819,7 +821,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
-- 
2.39.2


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

WARNING: multiple messages have this Message-ID (diff)
From: Benjamin Gaignard <benjamin.gaignard@collabora.com>
To: mchehab@kernel.org, tfiga@chromium.org, m.szyprowski@samsung.com,
	ming.qian@nxp.com, ezequiel@vanguardiasur.com.ar,
	p.zabel@pengutronix.de, gregkh@linuxfoundation.org,
	hverkuil-cisco@xs4all.nl, nicolas.dufresne@collabora.com
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	linux-arm-msm@vger.kernel.org,
	linux-rockchip@lists.infradead.org,
	linux-staging@lists.linux.dev, kernel@collabora.com,
	Benjamin Gaignard <benjamin.gaignard@collabora.com>
Subject: [PATCH v9 48/53] media: core: Rework how create_buf index returned value is computed
Date: Mon,  2 Oct 2023 14:06:12 +0200	[thread overview]
Message-ID: <20231002120617.119602-49-benjamin.gaignard@collabora.com> (raw)
In-Reply-To: <20231002120617.119602-1-benjamin.gaignard@collabora.com>

When DELETE_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>
---
 .../media/common/videobuf2/videobuf2-core.c   | 21 ++++++++++++-------
 .../media/common/videobuf2/videobuf2-v4l2.c   | 20 +++++++++++-------
 include/media/videobuf2-core.h                |  5 ++++-
 3 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 8da8a7dfff44..92de8af58bdc 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -440,15 +440,21 @@ static void vb2_queue_remove_buffer(struct vb2_buffer *vb)
  */
 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 plane_sizes[VB2_MAX_PLANES],
+			     unsigned int *first_index)
 {
 	unsigned int buffer, plane;
 	struct vb2_buffer *vb;
+	unsigned long index;
 	int ret;
 
 	/* Ensure that the number of already queue + num_buffers is below q->max_num_buffers */
 	num_buffers = min_t(unsigned int, num_buffers,
-			    q->max_num_buffers - q->num_buffers);
+			    q->max_num_buffers - vb2_get_num_buffers(q));
+
+	index = vb2_get_num_buffers(q);
+
+	*first_index = index;
 
 	for (buffer = 0; buffer < num_buffers; ++buffer) {
 		/* Allocate vb2 buffer structures */
@@ -468,7 +474,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
 			vb->planes[plane].min_length = plane_sizes[plane];
 		}
 
-		vb2_queue_add_buffer(q, vb, q->num_buffers + buffer);
+		vb2_queue_add_buffer(q, vb, index++);
 		call_void_bufop(q, init_buffer, vb);
 
 		/* Allocate video buffer memory for the MMAP type */
@@ -811,7 +817,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) {
@@ -897,7 +903,7 @@ 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) {
 		dprintk(q, 1, "memory allocation failed\n");
 		ret = -ENOMEM;
@@ -971,7 +977,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] = { };
@@ -1033,7 +1040,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;
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index a4ebef82d94e..6d9f1be41a19 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -808,11 +808,16 @@ 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;
+
+	ret = vb2_core_create_bufs(q, create->memory,
+				   create->flags,
+				   &create->count,
+				   requested_planes,
+				   requested_sizes,
+				   &create->index);
+	return ret;
 }
 EXPORT_SYMBOL_GPL(vb2_create_bufs);
 
@@ -1040,15 +1045,16 @@ int vb2_ioctl_create_bufs(struct file *file, void *priv,
 	int res = vb2_verify_memory_type(vdev->queue, p->memory,
 			p->format.type);
 
-	p->index = vdev->queue->num_buffers;
 	fill_buf_caps(vdev->queue, &p->capabilities);
 	validate_memory_flags(vdev->queue, p->memory, &p->flags);
 	/*
 	 * If count == 0, then just check if memory and type are valid.
 	 * Any -EBUSY result from vb2_verify_memory_type can be mapped to 0.
 	 */
-	if (p->count == 0)
+	if (p->count == 0) {
+		p->index = vb2_get_num_buffers(vdev->queue);
 		return res != -EBUSY ? res : 0;
+	}
 	if (res)
 		return res;
 	if (vb2_queue_is_busy(vdev->queue, file))
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index dffb9647d4d1..d433bf84e30c 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -803,6 +803,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..first+count]
  *
  * Videobuf2 core helper to implement VIDIOC_CREATE_BUFS() operation. It is
  * called internally by VB2 by an API-specific handler, like
@@ -819,7 +821,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
-- 
2.39.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2023-10-02 12:06 UTC|newest]

Thread overview: 171+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-02 12:05 [PATCH v9 00/53] Add DELETE_BUF ioctl Benjamin Gaignard
2023-10-02 12:05 ` Benjamin Gaignard
2023-10-02 12:05 ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 01/53] media: videobuf2: Rework offset 'cookie' encoding pattern Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 13:46   ` Hans Verkuil
2023-10-02 13:46     ` Hans Verkuil
2023-10-02 13:46     ` Hans Verkuil
2023-10-02 13:57   ` Hans Verkuil
2023-10-02 13:57     ` Hans Verkuil
2023-10-02 13:57     ` Hans Verkuil
2023-10-02 12:05 ` [PATCH v9 02/53] media: videobuf2: Stop spamming kernel log with all queue counter Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 03/53] media: videobuf2: Use vb2_buffer instead of index Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 04/53] media: amphion: Use vb2_get_buffer() instead of directly access to buffers array Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 05/53] media: mediatek: jpeg: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 06/53] media: mediatek: vdec: Remove useless loop Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 07/53] media: sti: hva: Use vb2_get_buffer() instead of directly access to buffers array Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 08/53] media: visl: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 09/53] media: atomisp: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 10/53] media: dvb-core: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 11/53] media: videobuf2: Access vb2_queue bufs array through helper functions Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 12/53] media: videobuf2: Be more flexible on the number of queue stored buffers Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 13/53] media: Report the maximum possible number of buffers for the queue Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 14/53] media: test-drivers: vivid: Increase max supported buffers for capture queues Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 15/53] media: test-drivers: vicodec: Increase max supported capture queue buffers Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 16/53] media: verisilicon: Refactor postprocessor to store more buffers Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 17/53] media: verisilicon: Store chroma and motion vectors offset Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 18/53] media: verisilicon: g2: Use common helpers to compute chroma and mv offsets Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 19/53] media: verisilicon: vp9: Allow to change resolution while streaming Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 20/53] media: Remove duplicated index vs q->num_buffers check Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 21/53] media: core: Add helper to get queue number of buffers Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 22/53] media: dvb-core: Do not initialize twice queue num_buffer field Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 23/53] media: dvb-frontends: rtl2832_srd: Use queue min_buffers_needed field Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 24/53] media: video-i2c: Set min_buffers_needed to 2 Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 25/53] media: pci: cx18: Set correct value to min_buffers_needed field Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 26/53] media: pci: dt3155: Remove useless check Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 27/53] media: pci: netup_unidvb: Remove useless number of buffers check Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 28/53] media: pci: tw68: Stop direct calls to queue num_buffers field Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 29/53] media: pci: tw686x: Set min_buffers_needed to 3 Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 30/53] media: amphion: Stop direct calls to queue num_buffers field Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 31/53] media: coda: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 32/53] media: mediatek: vcodec: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 33/53] media: nxp: " Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 34/53] media: renesas: Set min_buffers_needed to 16 Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05 ` [PATCH v9 35/53] media: ti: Use queue min_buffers_needed field to set the min number of buffers Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:05   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 36/53] media: verisilicon: Stop direct calls to queue num_buffers field Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 37/53] media: test-drivers: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 38/53] media: usb: airspy: Set min_buffers_needed to 8 Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 39/53] media: usb: cx231xx: Set min_buffers_needed to CX231XX_MIN_BUF Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 40/53] media: usb: hackrf: Set min_buffers_needed to 8 Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 41/53] media: usb: usbtv: Set min_buffers_needed to 2 Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 42/53] media: atomisp: Stop direct calls to queue num_buffers field Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 43/53] media: imx: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 44/53] media: meson: vdec: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 45/53] touchscreen: sur40: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 46/53] sample: v4l: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 47/53] media: cedrus: " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` Benjamin Gaignard [this message]
2023-10-02 12:06   ` [PATCH v9 48/53] media: core: Rework how create_buf index returned value is computed Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 49/53] media: core: Add bitmap manage bufs array entries Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 50/53] media: core: Free range of buffers Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 51/53] media: v4l2: Add DELETE_BUFS ioctl Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 52/53] media: v4l2: Add mem2mem helpers for " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06 ` [PATCH v9 53/53] media: test-drivers: Use helper " Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 12:06   ` Benjamin Gaignard
2023-10-02 14:46 ` [PATCH v9 00/53] Add DELETE_BUF ioctl Hans Verkuil
2023-10-02 14:46   ` Hans Verkuil
2023-10-02 14:46   ` Hans Verkuil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231002120617.119602-49-benjamin.gaignard@collabora.com \
    --to=benjamin.gaignard@collabora.com \
    --cc=ezequiel@vanguardiasur.com.ar \
    --cc=gregkh@linuxfoundation.org \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=kernel@collabora.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-staging@lists.linux.dev \
    --cc=m.szyprowski@samsung.com \
    --cc=mchehab@kernel.org \
    --cc=ming.qian@nxp.com \
    --cc=nicolas.dufresne@collabora.com \
    --cc=p.zabel@pengutronix.de \
    --cc=tfiga@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.