linux/fs/nfs
Chuck Lever 0aaaf5c424 NFS: Cache state owners after files are closed
Servers have a finite amount of memory to store NFSv4 open and lock
owners.  Moreover, servers may have a difficult time determining when
they can reap their state owner table, thanks to gray areas in the
NFSv4 protocol specification.  Thus clients should be careful to reuse
state owners when possible.

Currently Linux is not too careful.  When a user has closed all her
files on one mount point, the state owner's reference count goes to
zero, and it is released.  The next OPEN allocates a new one.  A
workload that serially opens and closes files can run through a large
number of open owners this way.

When a state owner's reference count goes to zero, slap it onto a free
list for that nfs_server, with an expiry time.  Garbage collect before
looking for a state owner.  This makes state owners for active users
available for re-use.

Now that there can be unused state owners remaining at umount time,
purge the state owner free list when a server is destroyed.  Also be
sure not to reclaim unused state owners during state recovery.

This change has benefits for the client as well.  For some workloads,
this approach drops the number of OPEN_CONFIRM calls from the same as
the number of OPEN calls, down to just one.  This reduces wire traffic
and thus open(2) latency.  Before this patch, untarring a kernel
source tarball shows the OPEN_CONFIRM call counter steadily increasing
through the test.  With the patch, the OPEN_CONFIRM count remains at 1
throughout the entire untar.

As long as the expiry time is kept short, I don't think garbage
collection should be terribly expensive, although it does bounce the
clp->cl_lock around a bit.

[ At some point we should rationalize the use of the nfs_server
->destroy method. ]

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
[Trond: Fixed a garbage collection race and a few efficiency issues]
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
2012-01-05 11:59:18 -05:00
..
blocklayout pnfsblock: fix writeback deadlock 2011-10-18 09:08:15 -07:00
objlayout pnfs-obj: Support for RAID5 read-4-write interface. 2011-11-02 23:56:09 -04:00
cache_lib.c switch vfs_path_lookup() to struct path 2011-07-20 01:44:14 -04:00
cache_lib.h atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
callback_proc.c NFSv4.1: fix backchannel slotid off-by-one bug 2012-01-05 10:42:40 -05:00
callback_xdr.c nfs: set vs_hidden on nfs4_callback_version4 (try #2) 2011-11-04 09:00:09 -04:00
callback.c sunrpc: use better NUMA affinities 2011-08-19 13:25:36 -04:00
callback.h NFSv4.1: Fix the callback 'highest_used_slotid' behaviour 2011-08-04 11:55:35 -04:00
client.c NFS: Cache state owners after files are closed 2012-01-05 11:59:18 -05:00
delegation.c NFS: Use the inode->i_version to cache NFSv4 change attribute information 2011-10-18 09:14:34 -07:00
delegation.h NFS: Move cl_delegations to the nfs_server struct 2011-01-06 14:57:46 -05:00
dir.c nfs: when attempting to open a directory, fall back on normal lookup (try #5) 2011-11-04 16:39:04 -04:00
direct.c atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
dns_resolve.c sunrpc: use seconds since boot in expiry cache 2010-09-07 19:21:20 -04:00
dns_resolve.h NFS: Use kernel DNS resolver [ver #2] 2010-08-11 17:11:28 +00:00
file.c NFS - fix recent breakage to NFS error handling. 2012-01-05 10:42:39 -05:00
fscache-index.c NFS: Use the inode->i_version to cache NFSv4 change attribute information 2011-10-18 09:14:34 -07:00
fscache.c FS-Cache: Add a helper to bulk uncache pages on an inode 2011-07-07 13:21:56 -07:00
fscache.h NFS: Propagate 'fsc' mount option through automounts 2009-09-23 14:36:39 -04:00
getroot.c Merge branch 'nfs-for-2.6.39' into nfs-for-next 2011-03-24 17:03:14 -04:00
idmap.c SUNRPC/NFS: make rpc pipe upcall generic 2011-10-18 09:08:12 -07:00
inode.c nfs: when attempting to open a directory, fall back on normal lookup (try #5) 2011-11-04 16:39:04 -04:00
internal.h NFS: Revert pnfs ugliness from the generic NFS read code path 2011-11-10 14:50:26 -05:00
iostat.h NFS: Squelch compiler warning in nfs_add_server_stats() 2010-05-14 15:09:31 -04:00
Kconfig pnfs: Automatically select blocks & objects layouts 2011-08-11 17:51:27 -07:00
Makefile pnfsblock: add blocklayout Kconfig option, Makefile, and stubs 2011-07-31 12:18:15 -04:00
mount_clnt.c NFS: Remove redundant unlikely() 2010-12-21 11:51:23 -05:00
namespace.c NFS: Add SECINFO_NO_NAME procedure 2011-07-12 13:40:27 -04:00
nfs2xdr.c Merge branch 'bugfixes' into nfs-for-2.6.38 2011-01-10 14:48:02 -05:00
nfs3acl.c switch posix_acl_create() to umode_t * 2011-08-01 02:09:42 -04:00
nfs3proc.c nfs: when attempting to open a directory, fall back on normal lookup (try #5) 2011-11-04 16:39:04 -04:00
nfs3xdr.c NFS: Fix "kernel BUG at fs/nfs/nfs3xdr.c:1338!" 2011-01-25 15:24:47 -05:00
nfs4_fs.h NFS: Cache state owners after files are closed 2012-01-05 11:59:18 -05:00
nfs4filelayout.c nfs: fix a minor do_div portability issue 2012-01-05 10:42:42 -05:00
nfs4filelayout.h NFSv4.1: do not use deviceids after MDS clientid invalidation 2011-07-12 13:40:29 -04:00
nfs4filelayoutdev.c NFS: fix comment 2011-07-12 13:40:27 -04:00
nfs4namespace.c nfs: nfs_do_{ref,sub}mount() superblock argument is redundant 2011-03-16 16:48:06 -04:00
nfs4proc.c NFSv4: include bitmap in nfsv4 get acl data 2012-01-05 10:42:42 -05:00
nfs4renewd.c NFSv4: The NFSv4.0 client must send RENEW calls if it holds a delegation 2011-08-24 15:07:37 -04:00
nfs4state.c NFS: Cache state owners after files are closed 2012-01-05 11:59:18 -05:00
nfs4xdr.c NFSv4: include bitmap in nfsv4 get acl data 2012-01-05 10:42:42 -05:00
nfsroot.c NFS: Revert NFSROOT default mount options 2011-05-27 17:42:47 -04:00
pagelist.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
pnfs_dev.c fs: add export.h to files using EXPORT_SYMBOL/THIS_MODULE macros 2011-10-31 19:30:31 -04:00
pnfs.c Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/linux-nfs 2011-11-22 08:54:15 -08:00
pnfs.h pnfs: recoalesce when ld read pagelist fails 2011-10-18 09:08:14 -07:00
proc.c nfs: when attempting to open a directory, fall back on normal lookup (try #5) 2011-11-04 16:39:04 -04:00
read.c NFS: Revert pnfs ugliness from the generic NFS read code path 2011-11-10 14:50:26 -05:00
super.c nfs: fix regression in handling of context= option in NFSv4 2012-01-05 10:42:40 -05:00
symlink.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
sysctl.c NFS: new idmapper 2010-10-07 18:48:49 -04:00
unlink.c NFS: Get rid of nfs_restart_rpc() 2011-10-19 13:58:30 -07:00
write.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00