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 D7AB7C46CD3 for ; Thu, 21 Dec 2023 23:02:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0A74A6B0085; Thu, 21 Dec 2023 18:02:04 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 057576B0087; Thu, 21 Dec 2023 18:02:04 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E60AA6B0088; Thu, 21 Dec 2023 18:02:03 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D080F6B0085 for ; Thu, 21 Dec 2023 18:02:03 -0500 (EST) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 8F809120D24 for ; Thu, 21 Dec 2023 23:02:03 +0000 (UTC) X-FDA: 81592350126.25.E9661C5 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf18.hostedemail.com (Postfix) with ESMTP id 1BCAB1C0014 for ; Thu, 21 Dec 2023 23:02:00 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rWneAvCJ; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf18.hostedemail.com: domain of nathan@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=nathan@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1703199721; 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=7LDA9EZXnoHj60ndvSC0sBy8D8xV0NU7r8U8mgQADNI=; b=iqXKfmiubhoKx4hVHWT4Rt+n1oL9tQXY1MD3ngytTM5faT4KYQhnTGCSkcE3iA3ACj3ied jFMnmgxgISFejUcr1tgdrBTeZRJxsiSl2tP2TBrWAk00wC5CD0a2CE+fX1fL/UnC3bVWT3 uscjFSnUqTj/EKPeEZumR3QmRhoVzJw= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=rWneAvCJ; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf18.hostedemail.com: domain of nathan@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=nathan@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1703199721; a=rsa-sha256; cv=none; b=eYWggrGVYUsOi1aFwyziWDYp5RoFmNA2OZZNg3uXX6QrqV41k2rDGUw8GtlOgSNPGihUXu +h4meNWmAgeTJlg13VF5YeE61tcWxcPybm75u2k5Whz5ljWbn3adHFU4GjqMPFuSVYiCBz Gz8+9P+6neGsz1TUt7oqBZofmIOOONo= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id AC876CE20D5; Thu, 21 Dec 2023 23:01:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8340C433C7; Thu, 21 Dec 2023 23:01:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1703199716; bh=Gi5//iEP+wF2L1cPim8HDnKfYBJ/YrKYxwasffiQaNQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=rWneAvCJRSBNAyWgSITLyHiTAhjP/opK7g7PxZJ7CPATJr1YyX58tYGKBidMV6sC2 CWbTAMvwUBG0fgz50QWg2Dmy8xlABJyCrpSvFOEREtVmnWcicaR4BaqQaQJR1mIAex VIuoZsGed03Wy/nRNeqLA5A/Hcjlsu58G9u2TXDT59l84Nja9iEGuqU9wmFsbcLB1l 9hKvpIoGKMhaXZ8WUpRMnhfiVMKWBX3Jm69V6flvlr3GhqY3kP+OQcyXbnWqpdb1FF f9XlgcW2SNOXNm2XdJZWKh1ukq1QJJClCg+oJZ1lkgh6sNkFy/kTKbcQUFrsK06V0G Znz7Crj+wuMjA== Date: Thu, 21 Dec 2023 16:01:53 -0700 From: Nathan Chancellor To: David Howells Cc: Jeff Layton , Steve French , Matthew Wilcox , Marc Dionne , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Dominique Martinet , Eric Van Hensbergen , Ilya Dryomov , Christian Brauner , linux-cachefs@redhat.com, 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 Subject: Re: [PATCH v5 37/40] netfs: Optimise away reads above the point at which there can be no data Message-ID: <20231221230153.GA1607352@dev-arch.thelio-3990X> References: <20231221132400.1601991-1-dhowells@redhat.com> <20231221132400.1601991-38-dhowells@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20231221132400.1601991-38-dhowells@redhat.com> X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 1BCAB1C0014 X-Stat-Signature: ctgdtmu4frqfn334khxbrunmxg166ypy X-Rspam-User: X-HE-Tag: 1703199720-37680 X-HE-Meta: U2FsdGVkX1/xzyB+jkKP4vftujZTdIhKvY6hZ4xKC4zFJB+KOxFcuugnFrh9ujo0uiKxauQe+bF9JnlCV3nxELRrpS/6wqAv9VZHOGpjSsfExbJiz/cBbKd/Lus1USUSUDC4f22nH70I5EsmqVjMhMEzgA4AyCOPKCO/g5op0uBm04MMhepWoPlmwKVfkz6g6QZ9YNAhdAzPWb/Wa42WScMgY/SmflYWu6wh8Zj2Hom4QiFeF25+Q0tSgqjqLIISb5Lw7YQsXIMjbLBisu7lERWkjAtGyUJ35xW8Aw+/k0Y2+tNTDlOtbZkORxyRBsFJEUlsmGzHxFxvp5er6RLYJxg7ebb/pNi6xHdVw/K5vYmGLaQYXjtJhHc718Zxq06JyA3G7Bu5aSpGsd2lQDBDAypMbrKzEZvPpc+XNK+tmjteQOoLmU4BZrmAGaN9yYRlN5OKKxEE76jcYTkfsIlr3asnW1zJrzOOn4x8XjJXnADGSWLv3aVoM0vCnBvoDK/oIB3AvjsUmo0Yle90rYbQZmjMEppEzdIEKn5fQWu2j2ugj7EWeDG1swzSXwLTvjVuw249/5FF+WaOfM7SeHvasQ7FQtz6VNTSV3o0wMq3TWfR9Bpg6QDcLA33jPDncUjLlKsLgUEB/9aMdBKC3OSF9wBB1uECN7pppNNzYWOMr/7YPrjkYYnCIxRh4CKeDw4ttWikboGasremkvPiWdW1oIAB19BtQR2Ve5TYQCMLFz88HD9NBeUtGDQj+45VGNmoxjK30JaDPT5e++vFl2c8y4Hc/BfuTozw1is7qShUhZrDSF4yUstibpujbZJJbUO1mkaEzdZ4RjaduO8At+1dkxqFbtLYu138Jo334EJ5r3Y/EuN79bsEnQzPnzKEraa8Acnz9mnAxFtyTWsYOL26XmP56SR1Whs/J0SlO8KKSFUSeLdZoKC8d4vg5NElEa99bEdyy8gUr3oP+XVibZK hjuLKTVN LP9rDuDLgyuNE6k90SIAD+AiqeAAIDA12UEg4REdZveYdYbMdoazL7+Adfcqo2BwYSuaj+AYkOXArXBIVNUoEvm4nSozO1d7Vf2ypgsUuXouMeuXtffcluZL8IpTlf3oJbrY4hQNgiW2E4MpWyEoL/WiDJRj32jE8Q9C5JcFDl8OCP63moqxbOhnEujtvbymBdzsYGMAd6Pv7wK1ak2vwKgne62PkR+5VB42op/zNWkqXtxQo4EEMzTirWJNXZgzgKO5xGXy2xbQEKjGBsxzNIpPD873VWdw9GMHz6eZCyi3rFLjlceKb2p/LSUzYWUsiKJ3mx0S6XjrvF/Y= 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: Hi David, On Thu, Dec 21, 2023 at 01:23:32PM +0000, David Howells wrote: > Track the file position above which the server is not expected to have any > data (the "zero point") and preemptively assume that we can satisfy > requests by filling them with zeroes locally rather than attempting to > download them if they're over that line - even if we've written data back > to the server. Assume that any data that was written back above that > position is held in the local cache. Note that we have to split requests > that straddle the line. > > Make use of this to optimise away some reads from the server. We need to > set the zero point in the following circumstances: > > (1) When we see an extant remote inode and have no cache for it, we set > the zero_point to i_size. > > (2) On local inode creation, we set zero_point to 0. > > (3) On local truncation down, we reduce zero_point to the new i_size if > the new i_size is lower. > > (4) On local truncation up, we don't change zero_point. > > (5) On local modification, we don't change zero_point. > > (6) On remote invalidation, we set zero_point to the new i_size. > > (7) If stored data is discarded from the pagecache or culled from fscache, > we must set zero_point above that if the data also got written to the > server. > > (8) If dirty data is written back to the server, but not fscache, we must > set zero_point above that. > > (9) If a direct I/O write is made, set zero_point above that. > > Assuming the above, any read from the server at or above the zero_point > position will return all zeroes. > > The zero_point value can be stored in the cache, provided the above rules > are applied to it by any code that culls part of the local cache. > > Signed-off-by: David Howells > cc: Jeff Layton > cc: linux-cachefs@redhat.com > cc: linux-fsdevel@vger.kernel.org > cc: linux-mm@kvack.org > --- > diff --git a/include/linux/netfs.h b/include/linux/netfs.h > index 8cde618cf6d9..a5374218efe4 100644 > --- a/include/linux/netfs.h > +++ b/include/linux/netfs.h > @@ -136,6 +136,8 @@ struct netfs_inode { > struct fscache_cookie *cache; > #endif > loff_t remote_i_size; /* Size of the remote file */ > + loff_t zero_point; /* Size after which we assume there's no data > + * on the server */ > unsigned long flags; > #define NETFS_ICTX_ODIRECT 0 /* The file has DIO in progress */ > #define NETFS_ICTX_UNBUFFERED 1 /* I/O should not use the pagecache */ > @@ -463,22 +465,30 @@ static inline void netfs_inode_init(struct netfs_inode *ctx, > { > ctx->ops = ops; > ctx->remote_i_size = i_size_read(&ctx->inode); > + ctx->zero_point = ctx->remote_i_size; > ctx->flags = 0; > #if IS_ENABLED(CONFIG_FSCACHE) > ctx->cache = NULL; > #endif > + /* ->releasepage() drives zero_point */ > + mapping_set_release_always(ctx->inode.i_mapping); > } I bisected a crash that I see when trying to mount an NFS volume to this change as commit 6e3c8451f624 ("netfs: Optimise away reads above the point at which there can be no data") in next-20231221: [ 45.964963] BUG: kernel NULL pointer dereference, address: 0000000000000078 [ 45.964975] #PF: supervisor write access in kernel mode [ 45.964982] #PF: error_code(0x0002) - not-present page [ 45.964987] PGD 0 P4D 0 [ 45.964996] Oops: 0002 [#1] PREEMPT SMP NOPTI [ 45.965004] CPU: 2 PID: 2419 Comm: mount.nfs Not tainted 6.7.0-rc6-next-20231221-debug-09925-g857647efa9be #1 adbbe7bc5037c662bc8f9b8e78ccf16be15b5e58 [ 45.965014] Hardware name: HP HP Desktop M01-F1xxx/87D6, BIOS F.12 12/17/2020 [ 45.965019] RIP: 0010:nfs_alloc_inode+0xa2/0xc0 [nfs] [ 45.965092] Code: 80 b0 01 00 00 00 00 00 00 48 c7 80 38 04 00 00 00 f7 1e c2 48 c7 80 58 04 00 00 00 00 00 00 48 c7 80 40 04 00 00 00 00 00 00 80 0a 80 48 05 b8 01 00 00 e9 5f 2b 20 f5 66 66 2e 0f 1f 84 00 [ 45.965099] RSP: 0018:ffffc900058f7bc0 EFLAGS: 00010286 [ 45.965107] RAX: ffff8881958c7290 RBX: ffff888168f0f800 RCX: 0000000000000000 [ 45.965112] RDX: 0000000000000078 RSI: ffffffffc2140a71 RDI: ffff88817a12b880 [ 45.965118] RBP: ffff888168f0f800 R08: ffffc900058f7b70 R09: 88728c958188ffff [ 45.965123] R10: 000000000003a5c0 R11: 0000000000000005 R12: ffffffffc22f1a80 [ 45.965128] R13: ffffc900058f7c30 R14: 0000000000000000 R15: 0000000000000002 [ 45.965134] FS: 00007ff78c318740(0000) GS:ffff8887ff280000(0000) knlGS:0000000000000000 [ 45.965140] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 45.965146] CR2: 0000000000000078 CR3: 000000018a514000 CR4: 0000000000350ef0 [ 45.965152] Call Trace: [ 45.965160] [ 45.965167] ? __die+0x23/0x70 [ 45.965183] ? page_fault_oops+0x173/0x4e0 [ 45.965197] ? nfs_alloc_inode+0x21/0xc0 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965279] ? exc_page_fault+0x7e/0x180 [ 45.965291] ? asm_exc_page_fault+0x26/0x30 [ 45.965308] ? nfs_alloc_inode+0x21/0xc0 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965374] ? nfs_alloc_inode+0xa2/0xc0 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965441] alloc_inode+0x1e/0xc0 [ 45.965452] ? __pfx_nfs_find_actor+0x10/0x10 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965517] iget5_locked+0x97/0xf0 [ 45.965525] ? __pfx_nfs_init_locked+0x10/0x10 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965593] nfs_fhget+0xe4/0x700 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965666] nfs_get_root+0xc6/0x4a0 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965732] ? kernfs_rename_ns+0x85/0x210 [ 45.965754] nfs_get_tree_common+0xc7/0x520 [nfs aac4a012b174ef6e5996d0df3638a0616e82eb47] [ 45.965826] vfs_get_tree+0x29/0xf0 [ 45.965836] fc_mount+0x12/0x40 [ 45.965846] do_nfs4_mount+0x12e/0x370 [nfsv4 9bac1f2bd94d7294fbbaf875b7b5cec5adc527f5] [ 45.965946] nfs4_try_get_tree+0x48/0xd0 [nfsv4 9bac1f2bd94d7294fbbaf875b7b5cec5adc527f5] [ 45.966034] vfs_get_tree+0x29/0xf0 [ 45.966041] ? srso_return_thunk+0x5/0x5f [ 45.966051] path_mount+0x4ca/0xb10 [ 45.966063] __x64_sys_mount+0x11a/0x150 [ 45.966074] do_syscall_64+0x64/0xe0 [ 45.966083] ? do_syscall_64+0x70/0xe0 [ 45.966090] ? syscall_exit_to_user_mode+0x2b/0x40 [ 45.966098] ? srso_return_thunk+0x5/0x5f [ 45.966106] ? do_syscall_64+0x70/0xe0 [ 45.966113] ? srso_return_thunk+0x5/0x5f [ 45.966121] ? exc_page_fault+0x7e/0x180 [ 45.966130] entry_SYSCALL_64_after_hwframe+0x6c/0x74 [ 45.966138] RIP: 0033:0x7ff78c5f2a1e ... It appears that ctx->inode.i_mapping is NULL in netfs_inode_init(). This patch appears to cure the problem for me but I am not sure if it is proper or not. Cheers, Nathan diff --git a/include/linux/netfs.h b/include/linux/netfs.h index a5374218efe4..8daaba665421 100644 --- a/include/linux/netfs.h +++ b/include/linux/netfs.h @@ -471,7 +471,8 @@ static inline void netfs_inode_init(struct netfs_inode *ctx, ctx->cache = NULL; #endif /* ->releasepage() drives zero_point */ - mapping_set_release_always(ctx->inode.i_mapping); + if (ctx->inode.i_mapping) + mapping_set_release_always(ctx->inode.i_mapping); } /**