]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs/nfs: Fix readdir slow-start regression
authorSagi Grimberg <sagi@grimberg.me>
Sat, 27 Dec 2025 10:46:29 +0000 (12:46 +0200)
committerAnna Schumaker <anna.schumaker@oracle.com>
Mon, 9 Feb 2026 18:39:38 +0000 (13:39 -0500)
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>
fs/nfs/dir.c

index 8f9ea79b788230aac78278e31c46deca3ad27c4a..b3f5c94612041f134ffc648b68a844a6f859580e 100644 (file)
@@ -72,7 +72,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)
@@ -83,7 +83,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))