From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB3D0C5AD49 for ; Tue, 3 Jun 2025 10:56:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 728226B040B; Tue, 3 Jun 2025 06:56:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6D8FE6B040C; Tue, 3 Jun 2025 06:56:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5C7646B040D; Tue, 3 Jun 2025 06:56:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 36EB26B040B for ; Tue, 3 Jun 2025 06:56:57 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id A8842804E7 for ; Tue, 3 Jun 2025 10:56:56 +0000 (UTC) X-FDA: 83513786832.27.C9BA793 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) by imf04.hostedemail.com (Postfix) with ESMTP id A52F040002 for ; Tue, 3 Jun 2025 10:56:54 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=a+A1wWwC; spf=pass (imf04.hostedemail.com: domain of amir73il@gmail.com designates 209.85.218.44 as permitted sender) smtp.mailfrom=amir73il@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748948214; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=/7blXBO4JKraFXyZYVYjtLes0xIhtY9NoXA5LD7gBEk=; b=iRaqiDfkwtC3ZUv6x6VMIbz7FnbRXkGc8I/OsOUvej/VMZKKzd3kU0vew/3HjiEFFkqrNh 6FWNV69mv3Ea0X5P8PPf65RZjPJoh3nDroBYPUtyx5THtJ3y7sOAQoP6hRmsnl7mRh4PWq UWcVTA7u9MLz84rkLbjb3KexRRHGsKw= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=a+A1wWwC; spf=pass (imf04.hostedemail.com: domain of amir73il@gmail.com designates 209.85.218.44 as permitted sender) smtp.mailfrom=amir73il@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748948214; a=rsa-sha256; cv=none; b=Sc+L7YJDJ6wfj6PhEXzWG0gx/JijIkhsyDVbAEdsT2GjQtvF2Go/ejH/ZUyqC6V6zpd+ik ftbAEy5NxWy5UlwqpWcPcbBDMmjAHAiWo9BRiqapXMC5Ft6l3pfG7ySypwW8fFpfoh4me4 DIHah+CxOfaRg09T1CXCMDKLwN8eqZg= Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-ad574992fcaso865168766b.1 for ; Tue, 03 Jun 2025 03:56:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1748948213; x=1749553013; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=/7blXBO4JKraFXyZYVYjtLes0xIhtY9NoXA5LD7gBEk=; b=a+A1wWwCDe7EVMxiLse87MS4ZwbDpRwpZfcLBwh+5P4A3ysHpmi2WhAMtMisoi2RP0 wOihzrZThxlSUxa6dWvg2Q1Oq8gy3tNAEjMhMyizKtypOngLH69M1XZXEeLC16DZk/yh tqUDoaw7GL5enlQoBgjN51xcANBWNWumbcLiDXhq74XfqVV4cXneVj1D567iep0h9baQ Ys6R1+/TDApYKY/ZdVBG+55qNx/HJvZ3pxnLlv/ozYW+stcDu+ZVrsUSRUqrXAPa8pJX T+dY4xiM3VwkQb+NqZJogMaS5EgJAZD171ILafOZrjW3AtuU1Vx8NL+Fu5ppXhg4vt59 vbrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748948213; x=1749553013; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/7blXBO4JKraFXyZYVYjtLes0xIhtY9NoXA5LD7gBEk=; b=d3kSqwPZ52cfD+hzySAS763HB6mH5P8sHkchtCmX0zLGiFZfCiWBfDSTpbLmYm+YXy bD3D/oeLgH8UbsAetAjV3vuIerSgk64MX2CZx5nA4LesTCTIWejAfShAs2Jn1v//H64o 7T59s7gMsuzuTtvHZ6YOkdcSp6f3QUS9VCWmPo7gtkrwZxZORrUTy0MbdYTdw2iTQnGP EMnENJMAhCuhbGH0ch4SMREFOgn0XXmYIfcGp8fjz0/X5KcWIfaT+XxUX20AupgrHE+n 77nUA9g97aNqohB6IFHGm/ujvd6c2S2KJy3ThVosBJTAQHR0vyyTsDq8owq7Eg90il44 f4KA== X-Forwarded-Encrypted: i=1; AJvYcCXCWTcW7PWV+8vcRSVHun4gz5Y2l3Eya7zxXw7lmNVXWQG8PIUJQjEOIDAMALemhZguYYcEtoI2yA==@kvack.org X-Gm-Message-State: AOJu0YydCpZQkqYjzmPbmzLRhoj472QFSwwHz2ZaPCjYHf3CIbJeAJai IKti6LH7LGKvKzLQRV09ln08UdBWWRnfQvEbIVTuySmEmgQZ2OgdgrEzCE9S22VqXcLeHpuPtRE QRUlZRTpStcBRSMHZch5bc8s3kpIg0/8= X-Gm-Gg: ASbGnctBMPQyfCe97pCKKqIIusHrYWsZ3lajPKLRs7UXPPV2O2mBBtyKyu2VnyRukFa MQ3Ico9jC9JoI0Zsh6iL9DPX7eT76sO3BosCr/FL+PQ8T98eON5/XodzhiCaqarHpm0zSNS1EoD wl4EL8bdzVlsibargrYj4Hht7ieqHHa8LR X-Google-Smtp-Source: AGHT+IGpvLn8hqrgPkcWVTHoe15k+0yqKJqtqmp3PMmzbuAIudjHSPH95skJXXoflNa4a233DOM5y2pvJ1SiAlHm6rU= X-Received: by 2002:a17:907:da9:b0:ad8:97d8:a52e with SMTP id a640c23a62f3a-adb495983admr1239171966b.55.1748948212831; Tue, 03 Jun 2025 03:56:52 -0700 (PDT) MIME-Version: 1.0 References: <20250603095245.17478-1-tao.wangtao@honor.com> <20250603095245.17478-2-tao.wangtao@honor.com> In-Reply-To: <20250603095245.17478-2-tao.wangtao@honor.com> From: Amir Goldstein Date: Tue, 3 Jun 2025 12:56:41 +0200 X-Gm-Features: AX0GCFvUGt-jkPjKb-TaQfCiyDY6ri9AEn30VaTl2bfo8Rvzx6IYm2tIEQwOB0U Message-ID: Subject: Re: [PATCH v4 1/4] fs: allow cross-FS copy_file_range for memory file with direct I/O To: wangtao Cc: sumit.semwal@linaro.org, christian.koenig@amd.com, kraxel@redhat.com, vivek.kasireddy@intel.com, viro@zeniv.linux.org.uk, brauner@kernel.org, hughd@google.com, akpm@linux-foundation.org, 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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: sxw7gspczyauzj6r14ogmmipe56cmq44 X-Rspamd-Queue-Id: A52F040002 X-Rspam-User: X-Rspamd-Server: rspam02 X-HE-Tag: 1748948214-397759 X-HE-Meta: U2FsdGVkX18iVzLUM/gNDw2LyRSeDdERan0UH8U3vMoKO8rFB/43srQnCbbXAviipoMip8GirFZtQ+jonXIJhGdlLi/dHANxmn58EiPOl3JD5Pyeu6Ja90jqylkzMCbsPWVEE8PqTKs70E81SH6hJiLdFOufqJLcFd9h6w4rBgmez+kfvZjS305zM7FM3H4Yg1B6bIYymLrCuR40EH8OVkRaOLTqXXCzRofyTXLa43nqp43UzDRFMvsnNqzqwAcwXiIyPIxnFf6Wv3ju4KkYpAd8TF/jVXbG7Va4XMNGnZtS/l6HimHXJElZFXVyS4kjjvp1jAOLCwQdKbgyj8tmQNrqhgTc1toGQ2csd02k4IfS4uXiSkz0pGKVAUWc4P/7cVcUlqM6MUq7EbSkGngbN3VMJbD0O+4Xt1Od8FevfkA4rwx6dsxx46xTolMVNomiXulLQnWWoztQ+H1vRRhLYilB0P2WivsMrdrKTpClh2Zi8rBlV7uD5Y9VubwGU30Xzn5kkTM36RgWkLdaj5fn9pkIEhlGviHn5yK168hvuLAP2trWKHQs52bGQAf5aj4hsy4V+ScnnGZE2zPi4t0krvyQw//d51zADMYN6+NlHVAiUYJTdfBzHzLCeoHDRrC79MzUJMiciCUNB0iODMLgPAvw9scWKO/uq6nNMNYBmWvzAP0H7K3XUM+E7M00+oKxCB7VCdjxI7OVa8JYXbtMy2XpXZYiT1No4Lxum4yhUIJ1GtfXBzP2Ku1zx/qC1SZ2xiRRyFdy1SIh6Vi44wELbZLSnmzI96MegugGCUgGn6jAmz5Op1b+A6f1O4KFvr4HipacyT3X4gb8prLvGs5nGi5kXv+oRauUR1zMs+kfW9AWOyMI+YgMa6WhahSV0PSLb8/LgZH6VwMxzklIBRrX0zYHJyHe9OPSbifFybs/AK6i9VO+SpJxCISKJ7cikFLocqYKDJhsyN+uZS4KR3D 1Fld5ACR 5t1G/ikVsi3DXIeI8svtXQYHwU4QTYYKPkWB0ek3p5QkBZN0yf5eQlnamuiKtkKwyR5oW7daS3+DdE9ePmfuZHnPf6q0hctxd5kCAaPpFG7RNXvqaquqHo+JHl4uFrna/nOjuLG2MEfwuY6eA2RnsqhFC4hEOffTwMBqq02ZXxH5TxzT4tmJ4oCq5LJIr8SWuXR3pJOTeVyfaKL0K/BselY3xPoW4y1G5XHogOhqgynh6KXDqXaKC/Q1yjZOcN10Ej9H0DNdFR2FscdWl8J6XndIXjunmddtou+zqZqhC08M2HYzhj6BnUyAyRXnTED+S7ru7gvPcYPwtgIHQpqej5BCnzNrtkHmsXuF3dFeAv8p4WTFfl3BD75DQHYn/pPqWxfqR+MNusR+1Y5Hz5Vu4n3pRYI6WilOa25q2ltjCa61t4/Gzxxnvv6OOYWDwhTtziJ551tEsEjROqRsVrKc1jMEG1lzWt5W1BlJM X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Jun 3, 2025 at 11:53=E2=80=AFAM wangtao wro= te: > > Memory files can optimize copy performance via copy_file_range callbacks: > -Compared to mmap&read: reduces GUP (get_user_pages) overhead > -Compared to sendfile/splice: eliminates one memory copy > -Supports dma-buf direct I/O zero-copy implementation > > Suggested by: Christian K=C3=B6nig > Suggested by: Amir Goldstein > Signed-off-by: wangtao > --- > fs/read_write.c | 64 +++++++++++++++++++++++++++++++++++++--------- > include/linux/fs.h | 2 ++ > 2 files changed, 54 insertions(+), 12 deletions(-) > > diff --git a/fs/read_write.c b/fs/read_write.c > index bb0ed26a0b3a..ecb4f753c632 100644 > --- a/fs/read_write.c > +++ b/fs/read_write.c > @@ -1469,6 +1469,31 @@ COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, in= t, in_fd, > } > #endif > > +static const struct file_operations *memory_copy_file_ops( > + struct file *file_in, struct file *file_out) > +{ > + if ((file_in->f_op->fop_flags & FOP_MEMORY_FILE) && > + (file_in->f_mode & FMODE_CAN_ODIRECT) && > + file_in->f_op->copy_file_range && file_out->f_op->write_iter) > + return file_in->f_op; > + else if ((file_out->f_op->fop_flags & FOP_MEMORY_FILE) && > + (file_out->f_mode & FMODE_CAN_ODIRECT) && > + file_in->f_op->read_iter && file_out->f_op->copy_file_ra= nge) > + return file_out->f_op; > + else > + return NULL; > +} > + > +static int essential_file_rw_checks(struct file *file_in, struct file *f= ile_out) > +{ > + if (!(file_in->f_mode & FMODE_READ) || > + !(file_out->f_mode & FMODE_WRITE) || > + (file_out->f_flags & O_APPEND)) > + return -EBADF; > + > + return 0; > +} > + > /* > * Performs necessary checks before doing a file copy > * > @@ -1484,9 +1509,16 @@ static int generic_copy_file_checks(struct file *f= ile_in, loff_t pos_in, > struct inode *inode_out =3D file_inode(file_out); > uint64_t count =3D *req_count; > loff_t size_in; > + bool splice =3D flags & COPY_FILE_SPLICE; > + const struct file_operations *mem_fops; > int ret; > > - ret =3D generic_file_rw_checks(file_in, file_out); > + /* The dma-buf file is not a regular file. */ > + mem_fops =3D memory_copy_file_ops(file_in, file_out); > + if (splice || mem_fops =3D=3D NULL) nit: use !mem_fops please Considering that the flag COPY_FILE_SPLICE is not allowed from userspace and is only called by nfsd and ksmbd I think we should assert and deny the combination of mem_fops && splice because it is very much unexpected. After asserting this, it would be nicer to write as: if (mem_fops) ret =3D essential_file_rw_checks(file_in, file_out); else ret =3D generic_file_rw_checks(file_in, file_out); > + else > + ret =3D essential_file_rw_checks(file_in, file_out); > if (ret) > return ret; > > @@ -1500,8 +1532,10 @@ static int generic_copy_file_checks(struct file *f= ile_in, loff_t pos_in, > * and several different sets of file_operations, but they all en= d up > * using the same ->copy_file_range() function pointer. > */ > - if (flags & COPY_FILE_SPLICE) { > + if (splice) { > /* cross sb splice is allowed */ > + } else if (mem_fops !=3D NULL) { With the assertion that splice && mem_fops is not allowed if (splice || mem_fops) { would go well together because they both allow cross-fs copy not only cross sb. > + /* cross-fs copy is allowed for memory file. */ > } else if (file_out->f_op->copy_file_range) { > if (file_in->f_op->copy_file_range !=3D > file_out->f_op->copy_file_range) > @@ -1554,6 +1588,7 @@ ssize_t vfs_copy_file_range(struct file *file_in, l= off_t pos_in, > ssize_t ret; > bool splice =3D flags & COPY_FILE_SPLICE; > bool samesb =3D file_inode(file_in)->i_sb =3D=3D file_inode(file_= out)->i_sb; > + const struct file_operations *mem_fops; > > if (flags & ~COPY_FILE_SPLICE) > return -EINVAL; > @@ -1574,18 +1609,27 @@ ssize_t vfs_copy_file_range(struct file *file_in,= loff_t pos_in, > if (len =3D=3D 0) > return 0; > > + if (splice) > + goto do_splice; > + > file_start_write(file_out); > goto do_splice needs to be after file_start_write Please wait for feedback from vfs maintainers before posting another version addressing my review comments. Thanks, Amir.