android_kernel_xiaomi_sm8350/fs/nfs
Chuck Lever 06cf6f2ed0 NFS: Eliminate nfs_get_user_pages()
Neil Brown observed that the kmalloc() in nfs_get_user_pages() is more
likely to fail if the I/O is large enough to require the allocation of more
than a single page to keep track of all the pinned pages in the user's
buffer.

Instead of tracking one large page array per dreq/iocb, track pages per
nfs_read/write_data, just like the cached I/O path does.  An array for
pages is already allocated for us by nfs_readdata_alloc() (and the write
and commit equivalents).

This is also required for adding support for vectored I/O to the NFS direct
I/O path.

The original reason to pin the user buffer and allocate all the NFS data
structures before trying to schedule I/O was to ensure all needed resources
are allocated on the client before starting to send requests.  This reduces
the chance that resource exhaustion on the client will cause a short read
or write.

On the other hand, for an application making very large application I/O
requests, this means that it will be nearly impossible for the application
to make forward progress on a resource-limited client.

Thus, moving the buffer pinning functionality into the I/O scheduling
loops should be good for scalability.  The next patch will do the same for
NFS data structure allocation.

Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
2006-06-24 13:11:39 -04:00
..
callback_proc.c
callback_xdr.c NFSv4: really return status from decode_recall_args() 2006-06-09 09:34:12 -04:00
callback.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
callback.h
delegation.c
delegation.h
dir.c NFS: Ensure the client submounts, when it crosses a server mountpoint. 2006-06-09 09:34:19 -04:00
direct.c NFS: Eliminate nfs_get_user_pages() 2006-06-24 13:11:39 -04:00
file.c Merge branch 'master' of /home/trondmy/kernel/linux-2.6/ 2006-06-24 13:07:53 -04:00
idmap.c NFS: Store the file system "fsid" value in the NFS super block. 2006-06-09 09:34:19 -04:00
inode.c [PATCH] VFS: Permit filesystem to perform statfs with a known root dentry 2006-06-23 07:42:45 -07:00
internal.h NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
iostat.h
Makefile NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
mount_clnt.c
namespace.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
nfs2xdr.c Merge branch 'master' of /home/trondmy/kernel/linux-2.6/ 2006-06-24 13:07:53 -04:00
nfs3acl.c NFSv3: Client-side nfsacl caching fix 2006-06-09 09:34:11 -04:00
nfs3proc.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
nfs3xdr.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
nfs4_fs.h NFSv4: Define an fs_locations bitmap 2006-06-09 09:34:25 -04:00
nfs4namespace.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
nfs4proc.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
nfs4renewd.c
nfs4state.c
nfs4xdr.c NFSv4: A root pathname is sent as a zero component4 2006-06-09 09:34:30 -04:00
nfsroot.c
pagelist.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
proc.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
read.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00
super.c Merge branch 'master' of /home/trondmy/kernel/linux-2.6/ 2006-06-24 13:07:53 -04:00
symlink.c NFS: Separate metadata and page cache revalidation mechanisms 2006-06-09 09:34:09 -04:00
sysctl.c NFS: Add timeout to submounts 2006-06-09 09:34:20 -04:00
unlink.c
write.c NFS: Split fs/nfs/inode.c 2006-06-09 09:34:33 -04:00