mirror of https://lore.kernel.org/lkml/
 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 v13 51/56] media: core: Rework how create_buf index returned value is computed
Date: Thu, 19 Oct 2023 14:52:17 +0200	[thread overview]
Message-ID: <20231019125222.21370-52-benjamin.gaignard@collabora.com> (raw)
In-Reply-To: <20231019125222.21370-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   | 22 ++++++++++++-------
 .../media/common/videobuf2/videobuf2-v4l2.c   | 20 +++++++++++------
 include/media/videobuf2-core.h                |  5 ++++-
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
index 72ef7179d80a..2c8cf479a962 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -442,16 +442,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 q_num_buffers = vb2_get_num_buffers(q);
 	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 */
@@ -471,7 +476,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 */
@@ -812,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) {
@@ -898,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;
@@ -972,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] = { };
@@ -1034,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 bdfc3a253c65..56daf3b5b2ba 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -805,11 +805,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);
 
@@ -1037,15 +1042,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 e77a397195f2..6986ff4b77cd 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


  parent reply	other threads:[~2023-10-19 12:56 UTC|newest]

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

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=20231019125222.21370-52-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®