Re: [PATCH v3 6/9] media: videobuf2: Allow exporting of a struct dmabuf
From: Jai Luthra
Date: Thu Sep 10 2026 - 10:42:14 EST
Quoting Paul Elder (2026-08-31 12:25:05)
> Quoting Jai Luthra (2026-07-17 20:04:21)
> > From: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx>
> >
> > videobuf2 only allowed exporting a dmabuf as a file descriptor,
> > but there are instances where having the struct dma_buf is
> > useful within the kernel.
> >
> > Split the current implementation into two, one step which
> > exports a struct dma_buf, and the second which converts that
> > into an fd.
> >
> > Signed-off-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx>
> > Signed-off-by: Jai Luthra <jai.luthra@xxxxxxxxxxxxxxxx>
> > ---
> > drivers/media/common/videobuf2/videobuf2-core.c | 21 ++++++++++++++++++---
> > include/media/videobuf2-core.h | 15 +++++++++++++++
> > 2 files changed, 33 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
> > index b0a6084f1757..0e62f3d97194 100644
> > --- a/drivers/media/common/videobuf2/videobuf2-core.c
> > +++ b/drivers/media/common/videobuf2/videobuf2-core.c
> > @@ -2419,11 +2419,11 @@ static int __find_plane_by_offset(struct vb2_queue *q, unsigned long offset,
> > return 0;
> > }
> >
> > -int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
> > - struct vb2_buffer *vb, unsigned int plane, unsigned int flags)
> > +int vb2_core_expbuf_dmabuf(struct vb2_queue *q, unsigned int type,
> > + struct vb2_buffer *vb, unsigned int plane,
> > + unsigned int flags, struct dma_buf **dmabuf)
> > {
> > struct vb2_plane *vb_plane;
> > - int ret;
> > struct dma_buf *dbuf;
> >
> > if (q->memory != VB2_MEMORY_MMAP) {
> > @@ -2468,6 +2468,21 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
> > return -EINVAL;
> > }
> >
> > + *dmabuf = dbuf;
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(vb2_core_expbuf_dmabuf);
> > +
> > +int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type,
> > + struct vb2_buffer *vb, unsigned int plane, unsigned int flags)
> > +{
> > + struct dma_buf *dbuf;
> > + int ret;
> > +
> > + ret = vb2_core_expbuf_dmabuf(q, type, vb, plane, flags, &dbuf);
> > + if (ret)
> > + return ret;
> > +
> > ret = dma_buf_fd(dbuf, flags & ~O_ACCMODE);
> > if (ret < 0) {
> > dprintk(q, 3, "buffer %d, plane %d failed to export (%d)\n",
> > diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> > index 4b4f4c15c53a..15aeaaeaf8ad 100644
> > --- a/include/media/videobuf2-core.h
> > +++ b/include/media/videobuf2-core.h
> > @@ -954,6 +954,21 @@ int vb2_core_streamon(struct vb2_queue *q, unsigned int type);
> > */
> > int vb2_core_streamoff(struct vb2_queue *q, unsigned int type);
> >
> > +/**
> > + * vb2_core_expbuf_dmabuf() - Export a buffer as a dma_buf structure
> > + * @q: videobuf2 queue
> > + * @type: buffer type
> > + * @index: id number of the buffer
> > + * @plane: index of the plane to be exported, 0 for single plane queues
> > + * @flags: flags for newly created file, currently only O_CLOEXEC is
> > + * supported, refer to manual of open syscall for more details
> > + * @dmabuf: Returns the dmabuf pointer
> > + *
>
> For completeness of the documentation, imo you're missing documentation for the
> actual return value.
>
> * Return: returns zero on success; an error code otherwise.
>
Good catch! Will fix in v4.
>
> Other than that, looks good to me.
>
> Reviewed-by: Paul Elder <paul.elder@xxxxxxxxxxxxxxxx>
>
Thanks,
Jai
>
> > + */
> > +int vb2_core_expbuf_dmabuf(struct vb2_queue *q, unsigned int type,
> > + struct vb2_buffer *vb, unsigned int plane,
> > + unsigned int flags, struct dma_buf **dmabuf);
> > +
> > /**
> > * vb2_core_expbuf() - Export a buffer as a file descriptor.
> > * @q: pointer to &struct vb2_queue with videobuf2 queue.
> >
> > --
> > 2.54.0
> >
> >