diff options
author | Chuck Lever <cel@netapp.com> | 2006-05-25 07:40:53 +0200 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-06-09 15:34:07 +0200 |
commit | 0d0b5cb36faf7002a11736032313f06d6f3d881c (patch) | |
tree | d767ae12fde00b553546aab9f5aa3e23cd86069d /fs/nfs/read.c | |
parent | SUNRPC: NFS_ROOT always uses the same XIDs (diff) | |
download | linux-0d0b5cb36faf7002a11736032313f06d6f3d881c.tar.xz linux-0d0b5cb36faf7002a11736032313f06d6f3d881c.zip |
NFS: Optimize allocation of nfs_read/write_data structures
Clean up use of page_array, and fix an off-by-one error noticed by Tom
Talpey which causes kmalloc calls in cases where using the page_array
is sufficient.
Test plan:
Normal client functional testing with r/wsize=32768.
Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r-- | fs/nfs/read.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 4b5f58da5650..fd9018c692bb 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -51,14 +51,11 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) if (p) { memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->pages); - if (pagecount < NFS_PAGEVEC_SIZE) - p->pagevec = &p->page_array[0]; + if (pagecount <= ARRAY_SIZE(p->page_array)) + p->pagevec = p->page_array; else { - size_t size = ++pagecount * sizeof(struct page *); - p->pagevec = kmalloc(size, GFP_NOFS); - if (p->pagevec) { - memset(p->pagevec, 0, size); - } else { + p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS); + if (!p->pagevec) { mempool_free(p, nfs_rdata_mempool); p = NULL; } |