mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 15:42:32 +00:00
NFS: support large reads and writes on the wire
Most NFS server implementations allow up to 64KB reads and writes on the wire. The Solaris NFS server allows up to a megabyte, for instance. Now the Linux NFS client supports transfer sizes up to 1MB, too. This will help reduce protocol and context switch overhead on read/write intensive NFS workloads, and support larger atomic read and write operations on servers that support them. Test-plan: Connectathon and iozone on mount point with wsize=rsize>32768 over TCP. Tests with NFS over UDP to verify the maximum RPC payload size cap. Signed-off-by: Chuck Lever <cel@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
325cfed9ae
commit
40859d7ee6
8 changed files with 91 additions and 53 deletions
|
@ -221,10 +221,10 @@ nfs_calc_block_size(u64 tsize)
|
|||
static inline unsigned long
|
||||
nfs_block_size(unsigned long bsize, unsigned char *nrbitsp)
|
||||
{
|
||||
if (bsize < 1024)
|
||||
bsize = NFS_DEF_FILE_IO_BUFFER_SIZE;
|
||||
else if (bsize >= NFS_MAX_FILE_IO_BUFFER_SIZE)
|
||||
bsize = NFS_MAX_FILE_IO_BUFFER_SIZE;
|
||||
if (bsize < NFS_MIN_FILE_IO_SIZE)
|
||||
bsize = NFS_DEF_FILE_IO_SIZE;
|
||||
else if (bsize >= NFS_MAX_FILE_IO_SIZE)
|
||||
bsize = NFS_MAX_FILE_IO_SIZE;
|
||||
|
||||
return nfs_block_bits(bsize, nrbitsp);
|
||||
}
|
||||
|
@ -307,20 +307,15 @@ nfs_sb_init(struct super_block *sb, rpc_authflavor_t authflavor)
|
|||
max_rpc_payload = nfs_block_size(rpc_max_payload(server->client), NULL);
|
||||
if (server->rsize > max_rpc_payload)
|
||||
server->rsize = max_rpc_payload;
|
||||
if (server->rsize > NFS_MAX_FILE_IO_SIZE)
|
||||
server->rsize = NFS_MAX_FILE_IO_SIZE;
|
||||
server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||
|
||||
if (server->wsize > max_rpc_payload)
|
||||
server->wsize = max_rpc_payload;
|
||||
|
||||
server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||
if (server->rpages > NFS_READ_MAXIOV) {
|
||||
server->rpages = NFS_READ_MAXIOV;
|
||||
server->rsize = server->rpages << PAGE_CACHE_SHIFT;
|
||||
}
|
||||
|
||||
if (server->wsize > NFS_MAX_FILE_IO_SIZE)
|
||||
server->wsize = NFS_MAX_FILE_IO_SIZE;
|
||||
server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||
if (server->wpages > NFS_WRITE_MAXIOV) {
|
||||
server->wpages = NFS_WRITE_MAXIOV;
|
||||
server->wsize = server->wpages << PAGE_CACHE_SHIFT;
|
||||
}
|
||||
|
||||
if (sb->s_blocksize == 0)
|
||||
sb->s_blocksize = nfs_block_bits(server->wsize,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue