On Tue, 2024-10-08 at 15:58 -0700, Dai Ngo wrote: > After the delegation is returned to the NFS server remove it > from the server's delegations list to reduce the time it takes > to scan this list. > > Network trace captured while running the below script shows the > time taken to service the CB_RECALL increases gradually due to > the overhead of traversing the delegation list in > nfs_delegation_find_inode_server. > > The NFS server in this test is a Solaris server which issues > CB_RECALL when receiving the all-zero stateid in the SETATTR. > > mount=/mnt/data > for i in $(seq 1 20) > do > echo $i > mkdir $mount/testtarfile$i > time tar -C $mount/testtarfile$i -xf 5000_files.tar > done > > Signed-off-by: Dai Ngo <dai.ngo@xxxxxxxxxx> > --- > fs/nfs/delegation.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c > index 20cb2008f9e4..035ba52742a5 100644 > --- a/fs/nfs/delegation.c > +++ b/fs/nfs/delegation.c > @@ -1001,6 +1001,11 @@ void nfs_delegation_mark_returned(struct inode > *inode, > } > > nfs_mark_delegation_revoked(delegation); > + clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); > + spin_unlock(&delegation->lock); > + if (nfs_detach_delegation(NFS_I(inode), delegation, > NFS_SERVER(inode))) > + nfs_put_delegation(delegation); > + goto out_rcu_unlock; > > out_clear_returning: > clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); OK, I can fix up nfs_revoke_delegation() later. Thanks! Reviewed-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx