media: videobuf2: Use vb2_buffer instead of index
authorBenjamin Gaignard <benjamin.gaignard@collabora.com>
Thu, 9 Nov 2023 16:29:16 +0000 (17:29 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Thu, 23 Nov 2023 10:52:04 +0000 (11:52 +0100)
Directly use vb2_buffer pointer instead of index inside queue array.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/common/videobuf2/videobuf2-core.c
drivers/media/common/videobuf2/videobuf2-v4l2.c
drivers/media/dvb-core/dvb_vb2.c
include/media/videobuf2-core.h

index 009ae53dbe3b1a0c1f4a1caf2a5d6a6aea993140..df515134bb0c2973cc66e7f2601ca1f8fdb6e489 100644 (file)
@@ -659,9 +659,9 @@ static bool __buffers_in_use(struct vb2_queue *q)
        return false;
 }
 
-void vb2_core_querybuf(struct vb2_queue *q, unsigned int index, void *pb)
+void vb2_core_querybuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)
 {
-       call_void_bufop(q, fill_user_buffer, q->bufs[index], pb);
+       call_void_bufop(q, fill_user_buffer, vb, pb);
 }
 EXPORT_SYMBOL_GPL(vb2_core_querybuf);
 
@@ -1495,9 +1495,6 @@ static void vb2_req_unprepare(struct media_request_object *obj)
        WARN_ON(!vb->req_obj.req);
 }
 
-int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
-                 struct media_request *req);
-
 static void vb2_req_queue(struct media_request_object *obj)
 {
        struct vb2_buffer *vb = container_of(obj, struct vb2_buffer, req_obj);
@@ -1512,7 +1509,7 @@ static void vb2_req_queue(struct media_request_object *obj)
         * set. We just ignore that, and expect this will be caught the
         * next time vb2_req_prepare() is called.
         */
-       err = vb2_core_qbuf(vb->vb2_queue, vb->index, NULL, NULL);
+       err = vb2_core_qbuf(vb->vb2_queue, vb, NULL, NULL);
        WARN_ON_ONCE(err && err != -EIO);
        mutex_unlock(vb->vb2_queue->lock);
 }
@@ -1567,12 +1564,10 @@ unsigned int vb2_request_buffer_cnt(struct media_request *req)
 }
 EXPORT_SYMBOL_GPL(vb2_request_buffer_cnt);
 
-int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int index, void *pb)
+int vb2_core_prepare_buf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)
 {
-       struct vb2_buffer *vb;
        int ret;
 
-       vb = q->bufs[index];
        if (vb->state != VB2_BUF_STATE_DEQUEUED) {
                dprintk(q, 1, "invalid buffer state %s\n",
                        vb2_state_name(vb->state));
@@ -1659,10 +1654,9 @@ static int vb2_start_streaming(struct vb2_queue *q)
        return ret;
 }
 
-int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
+int vb2_core_qbuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb,
                  struct media_request *req)
 {
-       struct vb2_buffer *vb;
        enum vb2_buffer_state orig_state;
        int ret;
 
@@ -1671,8 +1665,6 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
                return -EIO;
        }
 
-       vb = q->bufs[index];
-
        if (!req && vb->state != VB2_BUF_STATE_IN_REQUEST &&
            q->requires_requests) {
                dprintk(q, 1, "qbuf requires a request\n");
@@ -2245,9 +2237,8 @@ static int __find_plane_by_offset(struct vb2_queue *q, unsigned long offset,
 }
 
 int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
-               unsigned int index, unsigned int plane, unsigned int flags)
+                   struct vb2_buffer *vb, unsigned int plane, unsigned int flags)
 {
-       struct vb2_buffer *vb = NULL;
        struct vb2_plane *vb_plane;
        int ret;
        struct dma_buf *dbuf;
@@ -2272,13 +2263,6 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
                return -EINVAL;
        }
 
-       if (index >= q->num_buffers) {
-               dprintk(q, 1, "buffer index out of range\n");
-               return -EINVAL;
-       }
-
-       vb = q->bufs[index];
-
        if (plane >= vb->num_planes) {
                dprintk(q, 1, "buffer plane out of range\n");
                return -EINVAL;
@@ -2297,20 +2281,20 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
                              flags & O_ACCMODE);
        if (IS_ERR_OR_NULL(dbuf)) {
                dprintk(q, 1, "failed to export buffer %d, plane %d\n",
-                       index, plane);
+                       vb->index, plane);
                return -EINVAL;
        }
 
        ret = dma_buf_fd(dbuf, flags & ~O_ACCMODE);
        if (ret < 0) {
                dprintk(q, 3, "buffer %d, plane %d failed to export (%d)\n",
-                       index, plane, ret);
+                       vb->index, plane, ret);
                dma_buf_put(dbuf);
                return ret;
        }
 
        dprintk(q, 3, "buffer %d, plane %d exported as %d descriptor\n",
-               index, plane, ret);
+               vb->index, plane, ret);
        *fd = ret;
 
        return 0;
@@ -2715,7 +2699,7 @@ static int __vb2_init_fileio(struct vb2_queue *q, int read)
                 * Queue all buffers.
                 */
                for (i = 0; i < q->num_buffers; i++) {
-                       ret = vb2_core_qbuf(q, i, NULL, NULL);
+                       ret = vb2_core_qbuf(q, q->bufs[i], NULL, NULL);
                        if (ret)
                                goto err_reqbufs;
                        fileio->bufs[i].queued = 1;
@@ -2900,7 +2884,7 @@ static size_t __vb2_perform_fileio(struct vb2_queue *q, char __user *data, size_
 
                if (copy_timestamp)
                        b->timestamp = ktime_get_ns();
-               ret = vb2_core_qbuf(q, index, NULL, NULL);
+               ret = vb2_core_qbuf(q, b, NULL, NULL);
                dprintk(q, 5, "vb2_qbuf result: %d\n", ret);
                if (ret)
                        return ret;
@@ -3003,7 +2987,7 @@ static int vb2_thread(void *data)
                if (copy_timestamp)
                        vb->timestamp = ktime_get_ns();
                if (!threadio->stop)
-                       ret = vb2_core_qbuf(q, vb->index, NULL, NULL);
+                       ret = vb2_core_qbuf(q, vb, NULL, NULL);
                call_void_qop(q, wait_prepare, q);
                if (ret || threadio->stop)
                        break;
index c7a54d82a55e5b79bf11f8d87c16458b9f863c86..d19d82a75ac60e167854b15029d5c3b86706f813 100644 (file)
@@ -364,13 +364,12 @@ static void set_buffer_cache_hints(struct vb2_queue *q,
 }
 
 static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
-                                   struct v4l2_buffer *b, bool is_prepare,
-                                   struct media_request **p_req)
+                                   struct vb2_buffer *vb, struct v4l2_buffer *b,
+                                   bool is_prepare, struct media_request **p_req)
 {
        const char *opname = is_prepare ? "prepare_buf" : "qbuf";
        struct media_request *req;
        struct vb2_v4l2_buffer *vbuf;
-       struct vb2_buffer *vb;
        int ret;
 
        if (b->type != q->type) {
@@ -378,23 +377,11 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md
                return -EINVAL;
        }
 
-       if (b->index >= q->num_buffers) {
-               dprintk(q, 1, "%s: buffer index out of range\n", opname);
-               return -EINVAL;
-       }
-
-       if (q->bufs[b->index] == NULL) {
-               /* Should never happen */
-               dprintk(q, 1, "%s: buffer is NULL\n", opname);
-               return -EINVAL;
-       }
-
        if (b->memory != q->memory) {
                dprintk(q, 1, "%s: invalid memory type\n", opname);
                return -EINVAL;
        }
 
-       vb = q->bufs[b->index];
        vbuf = to_vb2_v4l2_buffer(vb);
        ret = __verify_planes_array(vb, b);
        if (ret)
@@ -667,7 +654,7 @@ int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b)
        vb = q->bufs[b->index];
        ret = __verify_planes_array(vb, b);
        if (!ret)
-               vb2_core_querybuf(q, b->index, b);
+               vb2_core_querybuf(q, vb, b);
        return ret;
 }
 EXPORT_SYMBOL(vb2_querybuf);
@@ -723,6 +710,7 @@ EXPORT_SYMBOL_GPL(vb2_reqbufs);
 int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
                    struct v4l2_buffer *b)
 {
+       struct vb2_buffer *vb;
        int ret;
 
        if (vb2_fileio_is_active(q)) {
@@ -733,9 +721,15 @@ int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev,
        if (b->flags & V4L2_BUF_FLAG_REQUEST_FD)
                return -EINVAL;
 
-       ret = vb2_queue_or_prepare_buf(q, mdev, b, true, NULL);
+       if (b->index >= q->num_buffers) {
+               dprintk(q, 1, "buffer index out of range\n");
+               return -EINVAL;
+       }
+       vb = q->bufs[b->index];
 
-       return ret ? ret : vb2_core_prepare_buf(q, b->index, b);
+       ret = vb2_queue_or_prepare_buf(q, mdev, vb, b, true, NULL);
+
+       return ret ? ret : vb2_core_prepare_buf(q, vb, b);
 }
 EXPORT_SYMBOL_GPL(vb2_prepare_buf);
 
@@ -803,6 +797,7 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev,
             struct v4l2_buffer *b)
 {
        struct media_request *req = NULL;
+       struct vb2_buffer *vb;
        int ret;
 
        if (vb2_fileio_is_active(q)) {
@@ -810,10 +805,16 @@ int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev,
                return -EBUSY;
        }
 
-       ret = vb2_queue_or_prepare_buf(q, mdev, b, false, &req);
+       if (b->index >= q->num_buffers) {
+               dprintk(q, 1, "buffer index out of range\n");
+               return -EINVAL;
+       }
+       vb = q->bufs[b->index];
+
+       ret = vb2_queue_or_prepare_buf(q, mdev, vb, b, false, &req);
        if (ret)
                return ret;
-       ret = vb2_core_qbuf(q, b->index, b, req);
+       ret = vb2_core_qbuf(q, vb, b, req);
        if (req)
                media_request_put(req);
        return ret;
@@ -873,7 +874,15 @@ EXPORT_SYMBOL_GPL(vb2_streamoff);
 
 int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)
 {
-       return vb2_core_expbuf(q, &eb->fd, eb->type, eb->index,
+       struct vb2_buffer *vb;
+
+       if (eb->index >= q->num_buffers) {
+               dprintk(q, 1, "buffer index out of range\n");
+               return -EINVAL;
+       }
+       vb = q->bufs[eb->index];
+
+       return vb2_core_expbuf(q, &eb->fd, eb->type, vb,
                                eb->plane, eb->flags);
 }
 EXPORT_SYMBOL_GPL(vb2_expbuf);
index 909df82fed3329f38fb73af0c3a3ac5c702566f2..b322ef179f05a2ab823dc566c374ead26d2bc001 100644 (file)
@@ -360,7 +360,7 @@ int dvb_vb2_querybuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)
                dprintk(1, "[%s] buffer index out of range\n", ctx->name);
                return -EINVAL;
        }
-       vb2_core_querybuf(&ctx->vb_q, b->index, b);
+       vb2_core_querybuf(&ctx->vb_q, q->bufs[b->index], b);
        dprintk(3, "[%s] index=%d\n", ctx->name, b->index);
        return 0;
 }
@@ -370,7 +370,7 @@ int dvb_vb2_expbuf(struct dvb_vb2_ctx *ctx, struct dmx_exportbuffer *exp)
        struct vb2_queue *q = &ctx->vb_q;
        int ret;
 
-       ret = vb2_core_expbuf(&ctx->vb_q, &exp->fd, q->type, exp->index,
+       ret = vb2_core_expbuf(&ctx->vb_q, &exp->fd, q->type, q->bufs[exp->index],
                              0, exp->flags);
        if (ret) {
                dprintk(1, "[%s] index=%d errno=%d\n", ctx->name,
@@ -391,7 +391,7 @@ int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)
                dprintk(1, "[%s] buffer index out of range\n", ctx->name);
                return -EINVAL;
        }
-       ret = vb2_core_qbuf(&ctx->vb_q, b->index, b, NULL);
+       ret = vb2_core_qbuf(&ctx->vb_q, q->bufs[b->index], b, NULL);
        if (ret) {
                dprintk(1, "[%s] index=%d errno=%d\n", ctx->name,
                        b->index, ret);
index 4b6a9d2ea3727750596dc9f0f60168f85889719d..cd3ff1cd759de9fc974208801fe2f7623816d723 100644 (file)
@@ -747,7 +747,7 @@ int vb2_wait_for_all_buffers(struct vb2_queue *q);
 /**
  * vb2_core_querybuf() - query video buffer information.
  * @q:         pointer to &struct vb2_queue with videobuf2 queue.
- * @index:     id number of the buffer.
+ * @vb:                pointer to struct &vb2_buffer.
  * @pb:                buffer struct passed from userspace.
  *
  * Videobuf2 core helper to implement VIDIOC_QUERYBUF() operation. It is called
@@ -759,7 +759,7 @@ int vb2_wait_for_all_buffers(struct vb2_queue *q);
  *
  * Return: returns zero on success; an error code otherwise.
  */
-void vb2_core_querybuf(struct vb2_queue *q, unsigned int index, void *pb);
+void vb2_core_querybuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb);
 
 /**
  * vb2_core_reqbufs() - Initiate streaming.
@@ -823,7 +823,7 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
  * vb2_core_prepare_buf() - Pass ownership of a buffer from userspace
  *                     to the kernel.
  * @q:         pointer to &struct vb2_queue with videobuf2 queue.
- * @index:     id number of the buffer.
+ * @vb:                pointer to struct &vb2_buffer.
  * @pb:                buffer structure passed from userspace to
  *             &v4l2_ioctl_ops->vidioc_prepare_buf handler in driver.
  *
@@ -839,13 +839,13 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
  *
  * Return: returns zero on success; an error code otherwise.
  */
-int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int index, void *pb);
+int vb2_core_prepare_buf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb);
 
 /**
  * vb2_core_qbuf() - Queue a buffer from userspace
  *
  * @q:         pointer to &struct vb2_queue with videobuf2 queue.
- * @index:     id number of the buffer
+ * @vb:                pointer to struct &vb2_buffer.
  * @pb:                buffer structure passed from userspace to
  *             v4l2_ioctl_ops->vidioc_qbuf handler in driver
  * @req:       pointer to &struct media_request, may be NULL.
@@ -867,7 +867,7 @@ int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int index, void *pb);
  *
  * Return: returns zero on success; an error code otherwise.
  */
-int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
+int vb2_core_qbuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb,
                  struct media_request *req);
 
 /**
@@ -931,7 +931,7 @@ int vb2_core_streamoff(struct vb2_queue *q, unsigned int type);
  * @fd:                pointer to the file descriptor associated with DMABUF
  *             (set by driver).
  * @type:      buffer type.
- * @index:     id number of the buffer.
+ * @vb:                pointer to struct &vb2_buffer.
  * @plane:     index of the plane to be exported, 0 for single plane queues
  * @flags:     file flags for newly created file, as defined at
  *             include/uapi/asm-generic/fcntl.h.
@@ -945,7 +945,7 @@ int vb2_core_streamoff(struct vb2_queue *q, unsigned int type);
  * Return: returns zero on success; an error code otherwise.
  */
 int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
-               unsigned int index, unsigned int plane, unsigned int flags);
+                   struct vb2_buffer *vb, unsigned int plane, unsigned int flags);
 
 /**
  * vb2_core_queue_init() - initialize a videobuf2 queue