On Wed, Jun 9, 2010 at 3:39 PM, Boaz Harrosh <bharrosh@xxxxxxxxxxx> wrote: > On 06/09/2010 10:29 PM, Fred Isaman wrote: >> On Wed, Jun 9, 2010 at 3:19 PM, Boaz Harrosh <bharrosh@xxxxxxxxxxx> wrote: >>> On 06/08/2010 07:19 AM, Fred Isaman wrote: >>>> Change readpages path to only call LAYOUTGET once. >>>> >>>> Signed-off-by: Fred Isaman <iisaman@xxxxxxxxxx> >>>> --- >>>> fs/nfs/pagelist.c | 2 ++ >>>> fs/nfs/pnfs.c | 37 +++++++------------------------------ >>>> fs/nfs/pnfs.h | 25 ++++++++++++++++--------- >>>> 3 files changed, 25 insertions(+), 39 deletions(-) >>>> >>>> diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c >>>> index ed647b9..c3e5a1f 100644 >>>> --- a/fs/nfs/pagelist.c >>>> +++ b/fs/nfs/pagelist.c >>>> @@ -253,6 +253,8 @@ static int nfs_can_coalesce_requests(struct nfs_page *prev, >>>> return 0; >>>> if (prev->wb_pgbase + prev->wb_bytes != PAGE_CACHE_SIZE) >>>> return 0; >>>> + if (req->wb_lseg != prev->wb_lseg) >>>> + return 0; >>>> #ifdef CONFIG_NFS_V4_1 >>>> if (pgio->pg_test && !pgio->pg_test(pgio, prev, req)) >>>> return 0; >>>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c >>>> index 2b5f6fc..692a18e 100644 >>>> --- a/fs/nfs/pnfs.c >>>> +++ b/fs/nfs/pnfs.c >>>> @@ -1689,7 +1689,7 @@ pnfs_readpages(struct nfs_read_data *rdata) >>>> { >>>> struct nfs_readargs *args = &rdata->args; >>>> struct inode *inode = rdata->inode; >>>> - int numpages, status, pgcount, temp; >>>> + int numpages, pgcount, temp; >>>> struct nfs_server *nfss = NFS_SERVER(inode); >>>> struct nfs_inode *nfsi = NFS_I(inode); >>>> struct pnfs_layout_segment *lseg; >>>> @@ -1701,19 +1701,8 @@ pnfs_readpages(struct nfs_read_data *rdata) >>>> args->count, >>>> args->offset); >>>> >>>> - /* Retrieve and set layout if not allready cached */ >>>> - status = _pnfs_update_layout(inode, >>>> - args->context, >>>> - args->count, >>>> - args->offset, >>>> - IOMODE_READ, >>>> - &lseg); >>>> - if (status) { >>>> - dprintk("%s: Updating layout failed (%d), retry with NFS \n", >>>> - __func__, status); >>>> - trypnfs = PNFS_NOT_ATTEMPTED; >>>> - goto out; >>>> - } >>>> + lseg = rdata->req->wb_lseg; >>>> + get_lseg(lseg); >>>> >>>> /* Determine number of pages. */ >>>> pgcount = args->pgbase + args->count; >>>> @@ -1740,7 +1729,6 @@ pnfs_readpages(struct nfs_read_data *rdata) >>>> rdata->pdata.lseg = NULL; >>>> put_lseg(lseg); >>>> } >>>> - out: >>>> dprintk("%s End (trypnfs:%d)\n", __func__, trypnfs); >>>> return trypnfs; >>>> } >>>> @@ -1749,21 +1737,10 @@ enum pnfs_try_status >>>> _pnfs_try_to_read_data(struct nfs_read_data *data, >>>> const struct rpc_call_ops *call_ops) >>>> { >>>> - struct inode *ino = data->inode; >>>> - struct nfs_server *nfss = NFS_SERVER(ino); >>>> - >>>> - dprintk("--> %s\n", __func__); >>>> - /* Only create an rpc request if utilizing NFSv4 I/O */ >>>> - if (!pnfs_enabled_sb(nfss) || >>>> - !nfss->pnfs_curr_ld->ld_io_ops->read_pagelist) { >>>> - dprintk("<-- %s: not using pnfs\n", __func__); >>>> - return PNFS_NOT_ATTEMPTED; >>>> - } else { >>>> - dprintk("%s: Utilizing pNFS I/O\n", __func__); >>>> - data->pdata.call_ops = call_ops; >>>> - data->pdata.pnfs_error = 0; >>>> - return pnfs_readpages(data); >>>> - } >>> >>> Wahoo, nice stuff Ha >>> >>> By now this can go into it's only caller. >>> (And caller de-inlined, what was that all about) >>> >>>> + dprintk("%s: Utilizing pNFS I/O\n", __func__); >>>> + data->pdata.call_ops = call_ops; >>>> + data->pdata.pnfs_error = 0; >>>> + return pnfs_readpages(data); >>>> } >>>> >>>> enum pnfs_try_status >>>> diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h >>>> index 6326ed5..816ebe1 100644 >>>> --- a/fs/nfs/pnfs.h >>>> +++ b/fs/nfs/pnfs.h >>>> @@ -94,22 +94,29 @@ static inline int pnfs_enabled_sb(struct nfs_server *nfss) >>>> return nfss->pnfs_curr_ld != NULL; >>>> } >>>> >>>> +static inline void _pnfs_clear_lseg_from_pages(struct list_head *head) >>>> +{ >>>> + struct nfs_page *req; >>>> + >>>> + list_for_each_entry(req, head, wb_list) { >>>> + put_lseg(req->wb_lseg); >>>> + req->wb_lseg = NULL; >>>> + } >>>> +} >>>> + >>>> static inline enum pnfs_try_status >>>> pnfs_try_to_read_data(struct nfs_read_data *data, >>>> const struct rpc_call_ops *call_ops) >>> >>> Don't think this needs to be inline, whats the point? >>> >> >> The point is that it is in the header file, not a c file. >> > > That's what I meant. Why is it in the header file. Why not > in .c file and declared. > To make it easy to ifdef out if CONFIG_NFS_V4_1 is not set. Fred >> Fred >> > > (-Bz > >>>> { >>>> - struct inode *inode = data->inode; >>>> - struct nfs_server *nfss = NFS_SERVER(inode); >>>> enum pnfs_try_status ret; >>>> >>>> - /* FIXME: read_pagelist should probably be mandated */ >>>> - if (PNFS_EXISTS_LDIO_OP(nfss, read_pagelist)) >>>> - ret = _pnfs_try_to_read_data(data, call_ops); >>>> - else >>>> - ret = PNFS_NOT_ATTEMPTED; >>>> - >>>> + if (!data->req->wb_lseg) >>>> + return PNFS_NOT_ATTEMPTED; >>>> + ret = _pnfs_try_to_read_data(data, call_ops); >>>> if (ret == PNFS_ATTEMPTED) >>>> - nfs_inc_stats(inode, NFSIOS_PNFS_READ); >>>> + nfs_inc_stats(data->inode, NFSIOS_PNFS_READ); >>>> + else >>>> + _pnfs_clear_lseg_from_pages(&data->pages); >>>> return ret; >>>> } >>>> >>> >>> Boaz >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in >>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> > > -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html