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 98567C04A6A for ; Fri, 11 Aug 2023 08:56:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 05B1E6B0088; Fri, 11 Aug 2023 04:56:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F25C36B0089; Fri, 11 Aug 2023 04:56:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DC70A8D0002; Fri, 11 Aug 2023 04:56:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C96456B0088 for ; Fri, 11 Aug 2023 04:56:36 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 93C7F121024 for ; Fri, 11 Aug 2023 08:56:36 +0000 (UTC) X-FDA: 81111217992.13.FB1C3E0 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by imf13.hostedemail.com (Postfix) with ESMTP id 7449520016 for ; Fri, 11 Aug 2023 08:56:34 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b="JqNe/Cyv"; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Tfu7sJUr; spf=pass (imf13.hostedemail.com: domain of jack@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1691744194; 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: in-reply-to:in-reply-to:references:references:dkim-signature; bh=6fhVb2cx4yzEnYTf9Ohkg8zDjKEMQKhFBxXUAKKq+aU=; b=HJDZVlfoqKjq+V1T0ycel0YOD/LgnNOsbFfD5v8jOZCkqOT3Bxki5iALnAYwo+T6s+K6Vj UHB5+6eH7GjfEv5qTuMDq++2OtHHQyhVwz03T6Bjpqhm0oaR43cslxL+RcCNN0Md7ZD6QK 3rrc8nma/esxLbuYN6iU4nw/wO+IHII= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b="JqNe/Cyv"; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Tfu7sJUr; spf=pass (imf13.hostedemail.com: domain of jack@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1691744194; a=rsa-sha256; cv=none; b=HpyIqwv/ISPSpH1R6YtbHKwUpOZyyOXiTwc0vr1caEFIrZT5k118DTz0D0I3gEGlDrGA4u w3ZbUhJ8yZn/AocAYO/InA9TONyDSsiD+I50oLAsUVkkm2Eond/YwYVUk1+DAzABcxI5zA BLXbpk+jiF3wOgwdPKxxDj+EJdB+ntA= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id EC1321F88C; Fri, 11 Aug 2023 08:56:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1691744192; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=6fhVb2cx4yzEnYTf9Ohkg8zDjKEMQKhFBxXUAKKq+aU=; b=JqNe/CyvlBtYjWqcGYTzITpkCs70XnLANK/XkJmPg5d2LGH6HCj8GvH1NZfz/ZSiBNlRbH I1SzawXs7wWw1khy+iUiHupqQm7S+WrXrl4VryxO6JPLXILsLRcwYNRnAr1G6R/+5gOuDx 2zTvkDG4K+BejSKRnWv/EfC3MNGezH8= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1691744192; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=6fhVb2cx4yzEnYTf9Ohkg8zDjKEMQKhFBxXUAKKq+aU=; b=Tfu7sJUr1Wyc5JsibINKkP1kVCyWdQqypjPKx3qo3ydW4k8rC0Y7pHtBubF5Yjhgjv+F8k 2ntel4Q+Lw/UtfCA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id CA8F113592; Fri, 11 Aug 2023 08:56:32 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 6xhcMcD31WQMDgAAMHmgww (envelope-from ); Fri, 11 Aug 2023 08:56:32 +0000 Received: by quack3.suse.cz (Postfix, from userid 1000) id 4FA1DA076F; Fri, 11 Aug 2023 10:56:32 +0200 (CEST) Date: Fri, 11 Aug 2023 10:56:32 +0200 From: Jan Kara To: Hugh Dickins Cc: Christian Brauner , Andrew Morton , Oleksandr Tymoshenko , Carlos Maiolino , Jeff Layton , Chuck Lever , Jan Kara , Miklos Szeredi , Daniel Xu , Chris Down , Tejun Heo , Greg Kroah-Hartman , Matthew Wilcox , Christoph Hellwig , Pete Zaitcev , Helge Deller , Topi Miettinen , Yu Kuai , "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCH vfs.tmpfs v2 4/5] tmpfs: trivial support for direct IO Message-ID: <20230811085632.hfmdzni2yzgmcy44@quack3> References: <7c12819-9b94-d56-ff88-35623aa34180@google.com> <6f2742-6f1f-cae9-7c5b-ed20fc53215@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6f2742-6f1f-cae9-7c5b-ed20fc53215@google.com> X-Rspamd-Queue-Id: 7449520016 X-Rspam-User: X-Stat-Signature: d7can8qdwoed9tq67dueo3k8gc1ct16q X-Rspamd-Server: rspam01 X-HE-Tag: 1691744194-884784 X-HE-Meta: U2FsdGVkX1/eFLQU6FLt0F7EAaZY2bgQpWLSs0kpCObusPgUKFWp2NbNpJXdqdb72LIw5WxqKE9+rjbFfMnHcHs6MzeeDgLyhtWnwMNrAc7S8BxtSmoOVlRAQnxN9n/4r0hkglKBixpUNeG7IiX4RZ4RPyB+wKr+r27gFPDhRkT2HIQGAgXuC+gfXFoMwxYSAqx+sarDeV6XTA3B1M8zjAf/H/zprtvIBIL8BODMJ/ueASYj+/zDy4GI4cJwaflYI/WDk5EW8uRr2W5CkDvCHgMUkXxTYguVp0/bWhnJ0t9cSUC3fAoQvH2US8PabWVtTKmBrUoS972F1o4p34U16CMLGv6Y8FaXQoyAxf/GAB7v68w4g7/P333ig1IGRHjuuLsNQJkrfgQupD79KjZTYgDfeuMqd9kyHX07H+FBwhTELy8UNZQJ10eSTj0dZAaGMKmnTIMlYc2z5EAwvpA2YQ8yV2C+xOiF5KievDDQ2dhp064wYQen6YgztluJapSc/N7qG/0BcqW27tOPkxdN+wqWC+zKv6125nhOiFVOLyxgMHqXPqARyeWpO8b5w7bfjN/YIIpVjBOP2efEiAaO2TYPi1nLMbCcj39k5j4EyNi6bXFhmIqCrCcKVbuLaR8UCJ8azCQcUBoEwrqW2WRAwPNX118OrND38dJPvShfrC2WCeVflmYCrbAJAcbtuBQBhT+TsSGhe5cwv/Z1VG/mbuYz1Tzid3+tAkZU+1rOV3Ssl7cPGJFWLFwAYE3wcrPIYigMV1381fqpn0na0HXp/6SUCtsu8VZGkoQ4+EuGQ4Xllpwss1Jt6SySvCO/vSR0InW6uOTMMwGIkspfv4HY8E4ZiJJsFiyjeF7tUjTEfAjqAr0s/476wpCXTh3gH/nrWnuE4sK9hcBKP8KI+wrqD/AgrxdjfHHJ+e3vhdF/gmnKiwwIe8xXvRYHDV5pKpbyxuyHoGa7VaigSCTMuwn dI0KX+8J 29YBLp8+kSES/o4JpXFCpH7fiKqUdPcVmk9zV9ZUUDgcWbQ0SF5MY+AnDjMpGn1ww8Ok1Fweb5DxG+0wnXj05KpfUvNsStjLAAwcwo83Wcck3GXdgI80OBiiqSOdvMqZIbE7kGjCvHc8jO/WATuQHh5uXyXL14CaUQw/DBEmEsN0RjGKCMALWHrV1F1b1A2mR9kXENt4QWru6C4JSeAlUPn718e6L6k/bTfqoPwGlCAFlkR7Q3y+7ihG6nBHotAptkEn10kHB81dgahxRJMAG/fcQcP5XjH6E9ozlaz7TQ3G6Iol1VwakPdObvw== 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: On Thu 10-08-23 23:27:07, Hugh Dickins wrote: > Depending upon your philosophical viewpoint, either tmpfs always does > direct IO, or it cannot ever do direct IO; but whichever, if tmpfs is to > stand in for a more sophisticated filesystem, it can be helpful for tmpfs > to support O_DIRECT. So, give tmpfs a shmem_file_open() method, to set > the FMODE_CAN_ODIRECT flag: then unchanged shmem_file_read_iter() and new > shmem_file_write_iter() do the work (without any shmem_direct_IO() stub). > > Perhaps later, once the direct_IO method has been eliminated from all > filesystems, generic_file_write_iter() will be such that tmpfs can again > use it, even for O_DIRECT. > > xfstests auto generic which were not run on tmpfs before but now pass: > 036 091 113 125 130 133 135 198 207 208 209 210 211 212 214 226 239 263 > 323 355 391 406 412 422 427 446 451 465 551 586 591 609 615 647 708 729 > with no new failures. > > LTP dio tests which were not run on tmpfs before but now pass: > dio01 through dio30, except for dio04 and dio10, which fail because > tmpfs dio read and write allow odd count: tmpfs could be made stricter, > but would that be an improvement? > > Signed-off-by: Hugh Dickins > --- > Thanks for your earlier review, Jan: I've certainly not copied that > into this entirely different version. I prefer the v1, but fine if > people prefer this v2. Yeah, this solution is also fine with me so feel free to add: Reviewed-by: Jan Kara I agree the previous version has less code duplication but once .direct_IO is gone shmem_file_write_iter() will be actually how some generic helper will look like so we can deduplicate the code then. Honza > mm/shmem.c | 32 ++++++++++++++++++++++++++++++-- > 1 file changed, 30 insertions(+), 2 deletions(-) > > diff --git a/mm/shmem.c b/mm/shmem.c > index ca43fb256b8e..b782edeb69aa 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2388,6 +2388,12 @@ static int shmem_mmap(struct file *file, struct vm_area_struct *vma) > return 0; > } > > +static int shmem_file_open(struct inode *inode, struct file *file) > +{ > + file->f_mode |= FMODE_CAN_ODIRECT; > + return generic_file_open(inode, file); > +} > + > #ifdef CONFIG_TMPFS_XATTR > static int shmem_initxattrs(struct inode *, const struct xattr *, void *); > > @@ -2839,6 +2845,28 @@ static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to) > return retval ? retval : error; > } > > +static ssize_t shmem_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > +{ > + struct file *file = iocb->ki_filp; > + struct inode *inode = file->f_mapping->host; > + ssize_t ret; > + > + inode_lock(inode); > + ret = generic_write_checks(iocb, from); > + if (ret <= 0) > + goto unlock; > + ret = file_remove_privs(file); > + if (ret) > + goto unlock; > + ret = file_update_time(file); > + if (ret) > + goto unlock; > + ret = generic_perform_write(iocb, from); > +unlock: > + inode_unlock(inode); > + return ret; > +} > + > static bool zero_pipe_buf_get(struct pipe_inode_info *pipe, > struct pipe_buffer *buf) > { > @@ -4434,12 +4462,12 @@ EXPORT_SYMBOL(shmem_aops); > > static const struct file_operations shmem_file_operations = { > .mmap = shmem_mmap, > - .open = generic_file_open, > + .open = shmem_file_open, > .get_unmapped_area = shmem_get_unmapped_area, > #ifdef CONFIG_TMPFS > .llseek = shmem_file_llseek, > .read_iter = shmem_file_read_iter, > - .write_iter = generic_file_write_iter, > + .write_iter = shmem_file_write_iter, > .fsync = noop_fsync, > .splice_read = shmem_file_splice_read, > .splice_write = iter_file_splice_write, > -- > 2.35.3 -- Jan Kara SUSE Labs, CR