| From 3fdc787913d740a6768a072ae3bc17b0e6cd859e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 27 Dec 2025 12:46:29 +0200 |
| Subject: fs/nfs: Fix readdir slow-start regression |
| |
| From: Sagi Grimberg <sagi@grimberg.me> |
| |
| [ Upstream commit 42e7c876b182da65723700f6bc507a8aecb10d3b ] |
| |
| Commit 580f236737d1 ("NFS: Adjust the amount of readahead |
| performed by NFS readdir") reduces the amount of readahead names |
| caching done by the client. |
| |
| The downside of this approach is READDIR now may suffer from |
| a slow-start issue, where initially it will fetch names that fit |
| in a single page, then in 2, 4, 8 until the maximum supported |
| transfer size (usually 1M). |
| |
| This patch tries to take a balanced approach between mitigating |
| the slow-start issue still maintaining some efficiency gains. |
| |
| Fixes: 580f236737d1 ("NFS: Adjust the amount of readahead performed by NFS readdir") |
| Signed-off-by: Sagi Grimberg <sagi@grimberg.me> |
| Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/nfs/dir.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
| index e3654f4a1b9aa..571bb40880b2d 100644 |
| --- a/fs/nfs/dir.c |
| +++ b/fs/nfs/dir.c |
| @@ -73,7 +73,7 @@ const struct address_space_operations nfs_dir_aops = { |
| .free_folio = nfs_readdir_clear_array, |
| }; |
| |
| -#define NFS_INIT_DTSIZE PAGE_SIZE |
| +#define NFS_INIT_DTSIZE SZ_64K |
| |
| static struct nfs_open_dir_context * |
| alloc_nfs_open_dir_context(struct inode *dir) |
| @@ -84,7 +84,7 @@ alloc_nfs_open_dir_context(struct inode *dir) |
| ctx = kzalloc(sizeof(*ctx), GFP_KERNEL_ACCOUNT); |
| if (ctx != NULL) { |
| ctx->attr_gencount = nfsi->attr_gencount; |
| - ctx->dtsize = NFS_INIT_DTSIZE; |
| + ctx->dtsize = min(NFS_SERVER(dir)->dtsize, NFS_INIT_DTSIZE); |
| spin_lock(&dir->i_lock); |
| if (list_empty(&nfsi->open_files) && |
| (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)) |
| -- |
| 2.51.0 |
| |