From: "Christian König" <christian.koenig@amd.com>
To: wangtao <tao.wangtao@honor.com>,
sumit.semwal@linaro.org, kraxel@redhat.com,
vivek.kasireddy@intel.com, viro@zeniv.linux.org.uk,
brauner@kernel.org, hughd@google.com, akpm@linux-foundation.org,
amir73il@gmail.com
Cc: benjamin.gaignard@collabora.com, Brian.Starkey@arm.com,
jstultz@google.com, tjmercier@google.com, jack@suse.cz,
baolin.wang@linux.alibaba.com, linux-media@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, bintian.wang@honor.com,
yipengxiang@honor.com, liulu.liu@honor.com, feng.han@honor.com
Subject: Re: [PATCH v4 2/4] dmabuf: Implement copy_file_range callback for dmabuf direct I/O prep
Date: Tue, 3 Jun 2025 12:42:26 +0200 [thread overview]
Message-ID: <ec85db1b-d536-4954-bad9-d5b1f3388492@amd.com> (raw)
In-Reply-To: <20250603095245.17478-3-tao.wangtao@honor.com>
On 6/3/25 11:52, wangtao wrote:
> First determine if dmabuf reads from or writes to the file.
> Then call exporter's rw_file callback function.
>
> Signed-off-by: wangtao <tao.wangtao@honor.com>
> ---
> drivers/dma-buf/dma-buf.c | 32 ++++++++++++++++++++++++++++++++
> include/linux/dma-buf.h | 16 ++++++++++++++++
> 2 files changed, 48 insertions(+)
>
> diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
> index 5baa83b85515..fc9bf54c921a 100644
> --- a/drivers/dma-buf/dma-buf.c
> +++ b/drivers/dma-buf/dma-buf.c
> @@ -523,7 +523,38 @@ static void dma_buf_show_fdinfo(struct seq_file *m, struct file *file)
> spin_unlock(&dmabuf->name_lock);
> }
>
> +static ssize_t dma_buf_rw_file(struct dma_buf *dmabuf, loff_t my_pos,
> + struct file *file, loff_t pos, size_t count, bool is_write)
> +{
> + if (!dmabuf->ops->rw_file)
> + return -EINVAL;
> +
> + if (my_pos >= dmabuf->size)
> + count = 0;
> + else
> + count = min_t(size_t, count, dmabuf->size - my_pos);
> + if (!count)
> + return 0;
> +
> + return dmabuf->ops->rw_file(dmabuf, my_pos, file, pos, count, is_write);
> +}
> +
> +static ssize_t dma_buf_copy_file_range(struct file *file_in, loff_t pos_in,
> + struct file *file_out, loff_t pos_out,
> + size_t count, unsigned int flags)
> +{
> + if (is_dma_buf_file(file_in) && file_out->f_op->write_iter)
> + return dma_buf_rw_file(file_in->private_data, pos_in,
> + file_out, pos_out, count, true);
> + else if (is_dma_buf_file(file_out) && file_in->f_op->read_iter)
> + return dma_buf_rw_file(file_out->private_data, pos_out,
> + file_in, pos_in, count, false);
> + else
> + return -EINVAL;
> +}
> +
> static const struct file_operations dma_buf_fops = {
> + .fop_flags = FOP_MEMORY_FILE,
> .release = dma_buf_file_release,
> .mmap = dma_buf_mmap_internal,
> .llseek = dma_buf_llseek,
> @@ -531,6 +562,7 @@ static const struct file_operations dma_buf_fops = {
> .unlocked_ioctl = dma_buf_ioctl,
> .compat_ioctl = compat_ptr_ioctl,
> .show_fdinfo = dma_buf_show_fdinfo,
> + .copy_file_range = dma_buf_copy_file_range,
> };
>
> /*
> diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h
> index 36216d28d8bd..d3636e985399 100644
> --- a/include/linux/dma-buf.h
> +++ b/include/linux/dma-buf.h
> @@ -22,6 +22,7 @@
> #include <linux/fs.h>
> #include <linux/dma-fence.h>
> #include <linux/wait.h>
> +#include <uapi/linux/dma-buf.h>
>
> struct device;
> struct dma_buf;
> @@ -285,6 +286,21 @@ struct dma_buf_ops {
>
> int (*vmap)(struct dma_buf *dmabuf, struct iosys_map *map);
> void (*vunmap)(struct dma_buf *dmabuf, struct iosys_map *map);
> +
> + /**
> + * @rw_file:
> + *
> + * If an Exporter needs to support Direct I/O file operations, it can
> + * implement this optional callback. The exporter must verify that no
> + * other objects hold the sg_table, ensure exclusive access to the
> + * dmabuf's sg_table, and only then proceed with the I/O operation.
Explain why and not what. E.g. something like "Allows direct I/O between this DMA-buf and the file".
Completely drop mentioning the sg_table, that is irrelevant. Exclusive access depends on how the exporter implements the whole thing.
Regards,
Christian.
> + *
> + * Returns:
> + *
> + * 0 on success or a negative error code on failure.
> + */
> + ssize_t (*rw_file)(struct dma_buf *dmabuf, loff_t my_pos,
> + struct file *file, loff_t pos, size_t count, bool is_write);
> };
>
> /**
next prev parent reply other threads:[~2025-06-03 10:42 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-03 9:52 [PATCH v4 0/4] Implement dmabuf direct I/O via copy_file_range wangtao
2025-06-03 9:52 ` [PATCH v4 1/4] fs: allow cross-FS copy_file_range for memory file with direct I/O wangtao
2025-06-03 10:56 ` Amir Goldstein
2025-06-03 12:38 ` wangtao
2025-06-03 12:43 ` Amir Goldstein
2025-06-03 9:52 ` [PATCH v4 2/4] dmabuf: Implement copy_file_range callback for dmabuf direct I/O prep wangtao
2025-06-03 10:42 ` Christian König [this message]
2025-06-03 12:26 ` wangtao
2025-06-03 13:04 ` Christoph Hellwig
2025-06-03 9:52 ` [PATCH v4 3/4] udmabuf: Implement udmabuf direct I/O wangtao
2025-06-03 9:52 ` [PATCH v4 4/4] dmabuf:system_heap Implement system_heap dmabuf " wangtao
2025-06-03 13:00 ` [PATCH v4 0/4] Implement dmabuf direct I/O via copy_file_range Christoph Hellwig
2025-06-03 13:14 ` Christian König
2025-06-03 13:19 ` Christoph Hellwig
2025-06-03 14:18 ` Christian König
2025-06-03 14:28 ` Christoph Hellwig
2025-06-03 15:55 ` Christian König
2025-06-03 16:01 ` Christoph Hellwig
2025-06-06 9:59 ` wangtao
2025-06-06 9:52 ` wangtao
2025-06-06 11:20 ` Christian König
2025-06-09 4:35 ` Christoph Hellwig
2025-06-09 9:32 ` wangtao
2025-06-10 10:52 ` Christian König
2025-06-10 13:37 ` Christoph Hellwig
2025-06-13 9:43 ` wangtao
2025-06-16 5:24 ` Christoph Hellwig
2025-06-10 13:34 ` Christoph Hellwig
2025-06-13 9:33 ` wangtao
2025-06-16 5:25 ` Christoph Hellwig
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=ec85db1b-d536-4954-bad9-d5b1f3388492@amd.com \
--to=christian.koenig@amd.com \
--cc=Brian.Starkey@arm.com \
--cc=akpm@linux-foundation.org \
--cc=amir73il@gmail.com \
--cc=baolin.wang@linux.alibaba.com \
--cc=benjamin.gaignard@collabora.com \
--cc=bintian.wang@honor.com \
--cc=brauner@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=feng.han@honor.com \
--cc=hughd@google.com \
--cc=jack@suse.cz \
--cc=jstultz@google.com \
--cc=kraxel@redhat.com \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=liulu.liu@honor.com \
--cc=sumit.semwal@linaro.org \
--cc=tao.wangtao@honor.com \
--cc=tjmercier@google.com \
--cc=viro@zeniv.linux.org.uk \
--cc=vivek.kasireddy@intel.com \
--cc=yipengxiang@honor.com \
/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.