From patchwork Fri Oct 13 16:03:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 13421149 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 1DF5ACDB484 for ; Fri, 13 Oct 2023 16:05:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9F9256B00BA; Fri, 13 Oct 2023 12:05:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9A80D6B00BB; Fri, 13 Oct 2023 12:05:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7FA836B00BC; Fri, 13 Oct 2023 12:05:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 5BE906B00BA for ; Fri, 13 Oct 2023 12:05:01 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 303491CA91F for ; Fri, 13 Oct 2023 16:05:01 +0000 (UTC) X-FDA: 81340912002.16.5A0D29A Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf14.hostedemail.com (Postfix) with ESMTP id 0C3E7100033 for ; Fri, 13 Oct 2023 16:04:58 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="F/yDHuDJ"; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf14.hostedemail.com: domain of dhowells@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1697213099; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=aqcfzX40HIma5NWVee2e/vr5lWKlCuYEF11W+qKc9UY=; b=Ii6jyvvTzrqDCA5z8T0b1kvyTx91NdCY7KfviVTnhho/YyTHTW3DNcKwH9yLXNd8bhlsLJ 81mXjt9LvSjZ6gx8oqaFHdWPQUyF8BCwyHWGaRLXj4QUNX/g4BPzSC/bH+4S5H3yaMRg2v NJSB78RNr7usOGkj7kWJW3/wfh/QAB8= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b="F/yDHuDJ"; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf14.hostedemail.com: domain of dhowells@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1697213099; a=rsa-sha256; cv=none; b=fCqyjagDSbmF3LeHnRiBq+u076Vmtj7tGU1+37claB8gSdiji2LvABJMB06E+j/LL4s19i S3ktc5k939a4mxRiOt7VuBmksdNt7u7WMWXveK4o2Z8t1oxDdZUNWgF8af7zZzsEHp55kp pOutKEwr+x/IUBSg0YMoOoCMJbP1o6s= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1697213098; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aqcfzX40HIma5NWVee2e/vr5lWKlCuYEF11W+qKc9UY=; b=F/yDHuDJyo4nWQODxXEfs/MIElx7mtNKSGAIdos9Sxet1ANLPeXnNDSqLackvucbtVlE9F 9NKkHNtTL1qNuZQXs63rPsoR7N5ByBirmf7XWm3BRXBoxz1MAKRtKOMBCM562QebYP0Dea cILNana4EEpPV/x3u5NuQVeYRyZyeFE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-27-8vmob4DEMPKj3lAspxqLxw-1; Fri, 13 Oct 2023 12:04:53 -0400 X-MC-Unique: 8vmob4DEMPKj3lAspxqLxw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6C86918186BB; Fri, 13 Oct 2023 16:04:51 +0000 (UTC) Received: from warthog.procyon.org.uk (unknown [10.42.28.226]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8E94CC15BBC; Fri, 13 Oct 2023 16:04:48 +0000 (UTC) From: David Howells To: Jeff Layton , Steve French Cc: David Howells , Matthew Wilcox , Marc Dionne , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Dominique Martinet , Ilya Dryomov , Christian Brauner , linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org, ceph-devel@vger.kernel.org, v9fs@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-cachefs@redhat.com Subject: [RFC PATCH 07/53] netfs: Provide invalidate_folio and release_folio calls Date: Fri, 13 Oct 2023 17:03:36 +0100 Message-ID: <20231013160423.2218093-8-dhowells@redhat.com> In-Reply-To: <20231013160423.2218093-1-dhowells@redhat.com> References: <20231013160423.2218093-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-Rspamd-Queue-Id: 0C3E7100033 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: o7hyhingqyexpboj9g57a7tqi6p5ashi X-HE-Tag: 1697213098-664111 X-HE-Meta: U2FsdGVkX1/TXa+J7TcBMHfTeRjIRUGODUbYcah9zFJQ0UgJlnToYu4Fe/tqq7d/OKOdsm6g+voqZnXsRNQWWDaj8G9m6TQHDTu26wXVdha5JTHYM4R55AU1Ap7KQwZTg9RzecLotXBKvz496zsYLYlT5zDldQ3iGZDXp0uD0ILKZ06H45aWEhePBPmAy2aN6Pb1xDtAw7EzyEp+fnsU8FsHKvBFctjZHDuWunfYB/2NZD60nXSbJlywmK21D9BkZWJVOhTzyu8xcyYLLcS9O+MnB0vXH/ODiHhQYFBspKcVEo0ED7K6xDsphSLPsJ30SfktEQdcZLBn5pMgNk0vGis30HYo3ba1lyzcbhMC0TK9Xb4tn8k74AClra4U3rFy61HUXs5oq8mAS8NU0OVXy5jBxjGUOkTctmSnqS4O4bjRMw2JAr4pvAWbGBqQot3o9MsnZ+1rwKbmd/bfmK0XeKSRBEoOQ+PJlrjdMYNwT9ga/M1HDA1tSPuHBhFO97wGmlxRLqNQpCR5d+JBlYbtcHORHEmtpGk90MjWB2Zx08UGkq1FDYhO3aal6Pfee+9EKGOigXIx0y6XKIfNx3FVjZEjhG/hNdisVKvcrLD1z7Tx8/GLu9OIbB7xjZlk9QqFXFj8hS15XOl/fDiif+6hoF1JmwP55YWt3aGxBzw1WCO8OCwJyHd3PLdhTpZY+quFi/g7rMcJ8VCW4cPXChjBOthCGKTGGCHpHG3snYWbUDvsk5rQcNQCXHiZDlZbE5oAghR/e3206xLy7LxiO3jzOoJSnZ04DVksaalwbL2ub4FNiznG94ufKoOcT9ZxH27Cv/IlxVQ7k6CfBPqhMoy/BToU8DAewP4N5RVCHZVwbYvw0K8SGFvJWd5jKvFU2rCul+GKZJJw+YDyT+cfQG9mb5OGvvqHj3gCvnWofFzw90iFF8xwD/cLcQDPdLC6v6OgB3aR4BcDneQbWHqFeH+ ONoQ0aoD OM4fsu2TmEvgbqKpJceqd4KrYwQJ7oTVSxW4rlvXsLtEBFLPwvFayaYLu9j802qedT4rzCfNHUKWP6MNCT5DSDE5P/10L4afo4HEc0EThmcvyJSSLho+o7wcsFopAjN4FJSLpwEVi4em4+haF0UOllgOA1cXpm0+zItCdGSHOX6+bx3LO+FMqkYgVlFJg4ZrTi6PeZgSvSZy1wL/VmqiAnrR0vA8GY4J/XU/Zt6VkDFIMNvEuTk+K4zWPvPV4t14JSwVerBT5kEsv39Pc+hBoOBpe09OOVItkOsYqYKOMgo5Zj8s/XhHuWyp5VQWlcUlHjPok9+1ODIdHBu3Z1flZJA11QGC/jHUUboPiMNszvLkW6r4= 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: Provide default invalidate_folio and release_folio calls. These will need to interact with invalidation correctly at some point. They will be needed if netfslib is to make use of folio->private for its own purposes. Signed-off-by: David Howells cc: Jeff Layton cc: linux-cachefs@redhat.com cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org Reviewed-by: Jeff Layton --- fs/9p/vfs_addr.c | 33 ++------------------------- fs/afs/file.c | 53 ++++--------------------------------------- fs/ceph/addr.c | 24 ++------------------ fs/netfs/Makefile | 1 + fs/netfs/misc.c | 51 +++++++++++++++++++++++++++++++++++++++++ include/linux/netfs.h | 6 +++-- 6 files changed, 64 insertions(+), 104 deletions(-) create mode 100644 fs/netfs/misc.c diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c index 8a635999a7d6..18a666c43e4a 100644 --- a/fs/9p/vfs_addr.c +++ b/fs/9p/vfs_addr.c @@ -104,35 +104,6 @@ const struct netfs_request_ops v9fs_req_ops = { .issue_read = v9fs_issue_read, }; -/** - * v9fs_release_folio - release the private state associated with a folio - * @folio: The folio to be released - * @gfp: The caller's allocation restrictions - * - * Returns true if the page can be released, false otherwise. - */ - -static bool v9fs_release_folio(struct folio *folio, gfp_t gfp) -{ - if (folio_test_private(folio)) - return false; -#ifdef CONFIG_9P_FSCACHE - if (folio_test_fscache(folio)) { - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_fscache(folio); - } - fscache_note_page_release(v9fs_inode_cookie(V9FS_I(folio_inode(folio)))); -#endif - return true; -} - -static void v9fs_invalidate_folio(struct folio *folio, size_t offset, - size_t length) -{ - folio_wait_fscache(folio); -} - #ifdef CONFIG_9P_FSCACHE static void v9fs_write_to_cache_done(void *priv, ssize_t transferred_or_error, bool was_async) @@ -355,8 +326,8 @@ const struct address_space_operations v9fs_addr_operations = { .writepage = v9fs_vfs_writepage, .write_begin = v9fs_write_begin, .write_end = v9fs_write_end, - .release_folio = v9fs_release_folio, - .invalidate_folio = v9fs_invalidate_folio, + .release_folio = netfs_release_folio, + .invalidate_folio = netfs_invalidate_folio, .launder_folio = v9fs_launder_folio, .direct_IO = v9fs_direct_IO, }; diff --git a/fs/afs/file.c b/fs/afs/file.c index 0c49b3b6f214..3fea5cd8ef13 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -20,9 +20,6 @@ static int afs_file_mmap(struct file *file, struct vm_area_struct *vma); static int afs_symlink_read_folio(struct file *file, struct folio *folio); -static void afs_invalidate_folio(struct folio *folio, size_t offset, - size_t length); -static bool afs_release_folio(struct folio *folio, gfp_t gfp_flags); static ssize_t afs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter); static ssize_t afs_file_splice_read(struct file *in, loff_t *ppos, @@ -57,8 +54,8 @@ const struct address_space_operations afs_file_aops = { .readahead = netfs_readahead, .dirty_folio = afs_dirty_folio, .launder_folio = afs_launder_folio, - .release_folio = afs_release_folio, - .invalidate_folio = afs_invalidate_folio, + .release_folio = netfs_release_folio, + .invalidate_folio = netfs_invalidate_folio, .write_begin = afs_write_begin, .write_end = afs_write_end, .writepages = afs_writepages, @@ -67,8 +64,8 @@ const struct address_space_operations afs_file_aops = { const struct address_space_operations afs_symlink_aops = { .read_folio = afs_symlink_read_folio, - .release_folio = afs_release_folio, - .invalidate_folio = afs_invalidate_folio, + .release_folio = netfs_release_folio, + .invalidate_folio = netfs_invalidate_folio, .migrate_folio = filemap_migrate_folio, }; @@ -405,48 +402,6 @@ int afs_write_inode(struct inode *inode, struct writeback_control *wbc) return 0; } -/* - * invalidate part or all of a page - * - release a page and clean up its private data if offset is 0 (indicating - * the entire page) - */ -static void afs_invalidate_folio(struct folio *folio, size_t offset, - size_t length) -{ - _enter("{%lu},%zu,%zu", folio->index, offset, length); - - folio_wait_fscache(folio); - _leave(""); -} - -/* - * release a page and clean up its private state if it's not busy - * - return true if the page can now be released, false if not - */ -static bool afs_release_folio(struct folio *folio, gfp_t gfp) -{ - struct afs_vnode *vnode = AFS_FS_I(folio_inode(folio)); - - _enter("{{%llx:%llu}[%lu],%lx},%x", - vnode->fid.vid, vnode->fid.vnode, folio_index(folio), folio->flags, - gfp); - - /* deny if folio is being written to the cache and the caller hasn't - * elected to wait */ -#ifdef CONFIG_AFS_FSCACHE - if (folio_test_fscache(folio)) { - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_fscache(folio); - } - fscache_note_page_release(afs_vnode_cache(vnode)); -#endif - - /* Indicate that the folio can be released */ - _leave(" = T"); - return true; -} - static void afs_add_open_mmap(struct afs_vnode *vnode) { if (atomic_inc_return(&vnode->cb_nr_mmap) == 1) { diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index f4863078f7fe..ced19ff08988 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -160,27 +160,7 @@ static void ceph_invalidate_folio(struct folio *folio, size_t offset, ceph_put_snap_context(snapc); } - folio_wait_fscache(folio); -} - -static bool ceph_release_folio(struct folio *folio, gfp_t gfp) -{ - struct inode *inode = folio->mapping->host; - - dout("%llx:%llx release_folio idx %lu (%sdirty)\n", - ceph_vinop(inode), - folio->index, folio_test_dirty(folio) ? "" : "not "); - - if (folio_test_private(folio)) - return false; - - if (folio_test_fscache(folio)) { - if (current_is_kswapd() || !(gfp & __GFP_FS)) - return false; - folio_wait_fscache(folio); - } - ceph_fscache_note_page_release(inode); - return true; + netfs_invalidate_folio(folio, offset, length); } static void ceph_netfs_expand_readahead(struct netfs_io_request *rreq) @@ -1563,7 +1543,7 @@ const struct address_space_operations ceph_aops = { .write_end = ceph_write_end, .dirty_folio = ceph_dirty_folio, .invalidate_folio = ceph_invalidate_folio, - .release_folio = ceph_release_folio, + .release_folio = netfs_release_folio, .direct_IO = noop_direct_IO, }; diff --git a/fs/netfs/Makefile b/fs/netfs/Makefile index 386d6fb92793..cd22554d9048 100644 --- a/fs/netfs/Makefile +++ b/fs/netfs/Makefile @@ -5,6 +5,7 @@ netfs-y := \ io.o \ iterator.o \ main.o \ + misc.o \ objects.o netfs-$(CONFIG_NETFS_STATS) += stats.o diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c new file mode 100644 index 000000000000..c3baf2b247d9 --- /dev/null +++ b/fs/netfs/misc.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Miscellaneous routines. + * + * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + */ + +#include +#include "internal.h" + +/** + * netfs_invalidate_folio - Invalidate or partially invalidate a folio + * @folio: Folio proposed for release + * @offset: Offset of the invalidated region + * @length: Length of the invalidated region + * + * Invalidate part or all of a folio for a network filesystem. The folio will + * be removed afterwards if the invalidated region covers the entire folio. + */ +void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length) +{ + _enter("{%lx},%zx,%zx", folio_index(folio), offset, length); + + folio_wait_fscache(folio); +} +EXPORT_SYMBOL(netfs_invalidate_folio); + +/** + * netfs_release_folio - Try to release a folio + * @folio: Folio proposed for release + * @gfp: Flags qualifying the release + * + * Request release of a folio and clean up its private state if it's not busy. + * Returns true if the folio can now be released, false if not + */ +bool netfs_release_folio(struct folio *folio, gfp_t gfp) +{ + struct netfs_inode *ctx = netfs_inode(folio_inode(folio)); + + if (folio_test_private(folio)) + return false; + if (folio_test_fscache(folio)) { + if (current_is_kswapd() || !(gfp & __GFP_FS)) + return false; + folio_wait_fscache(folio); + } + + fscache_note_page_release(netfs_i_cookie(ctx)); + return true; +} +EXPORT_SYMBOL(netfs_release_folio); diff --git a/include/linux/netfs.h b/include/linux/netfs.h index ed64d1034afa..daa431c4148d 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -299,8 +299,10 @@ struct readahead_control; void netfs_readahead(struct readahead_control *); int netfs_read_folio(struct file *, struct folio *); int netfs_write_begin(struct netfs_inode *, struct file *, - struct address_space *, loff_t pos, unsigned int len, - struct folio **, void **fsdata); + struct address_space *, loff_t pos, unsigned int len, + struct folio **, void **fsdata); +void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length); +bool netfs_release_folio(struct folio *folio, gfp_t gfp); void netfs_subreq_terminated(struct netfs_io_subrequest *, ssize_t, bool); void netfs_get_subrequest(struct netfs_io_subrequest *subreq,