From: Boaz Harrosh <bharrosh@panasas.com>
To: Weston Andros Adamson <dros@primarydata.com>,
<trond.myklebust@primarydata.com>
Cc: <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH 11/17] nfs: chain calls to pg_test
Date: Wed, 23 Apr 2014 15:20:15 +0300 [thread overview]
Message-ID: <5357AFFF.8030902@panasas.com> (raw)
In-Reply-To: <1398202165-78897-12-git-send-email-dros@primarydata.com>
On 04/23/2014 12:29 AM, Weston Andros Adamson wrote:
> Now that pg_test can change the size of the request (by returning a non-zero
> size smaller than the request), pg_test functions that call other
> pg_test functions must return the minimum of the result - or 0 if any fail.
>
> Also clean up the logic of some pg_test functions so that all checks are
> for contitions where coalescing is not possible.
>
> Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
> ---
> fs/nfs/nfs4filelayout.c | 27 ++++++++++++++-------------
> fs/nfs/objlayout/objio_osd.c | 12 ++++++++----
> fs/nfs/pnfs.c | 15 ++++++++++-----
> 3 files changed, 32 insertions(+), 22 deletions(-)
>
> diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
> index 3b32c95..cfd76bd 100644
> --- a/fs/nfs/nfs4filelayout.c
> +++ b/fs/nfs/nfs4filelayout.c
> @@ -930,26 +930,27 @@ static size_t
> filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
> struct nfs_page *req)
> {
> + unsigned int size;
> u64 p_stripe, r_stripe;
> u32 stripe_unit;
>
> - if (!pnfs_generic_pg_test(pgio, prev, req) ||
> - !nfs_generic_pg_test(pgio, prev, req))
> + /* calls nfs_generic_pg_test */
> + size = pnfs_generic_pg_test(pgio, prev, req);
> + if (!size)
> return 0;
>
> - if (!prev)
> - return req->wb_bytes;
> + if (prev) {
> + p_stripe = (u64)req_offset(prev);
> + r_stripe = (u64)req_offset(req);
> + stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
>
> - p_stripe = (u64)req_offset(prev);
> - r_stripe = (u64)req_offset(req);
> - stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
> + do_div(p_stripe, stripe_unit);
> + do_div(r_stripe, stripe_unit);
>
> - do_div(p_stripe, stripe_unit);
> - do_div(r_stripe, stripe_unit);
> -
> - if (p_stripe == r_stripe)
> - return req->wb_bytes;
> - return 0;
> + if (p_stripe != r_stripe)
> + return 0;
> + }
> + return min(size, req->wb_bytes);
> }
>
> static void
> diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
> index c20352a..31de29e 100644
> --- a/fs/nfs/objlayout/objio_osd.c
> +++ b/fs/nfs/objlayout/objio_osd.c
> @@ -571,13 +571,17 @@ int objio_write_pagelist(struct nfs_write_data *wdata, int how)
> static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio,
> struct nfs_page *prev, struct nfs_page *req)
> {
> - if (!pnfs_generic_pg_test(pgio, prev, req))
> + unsigned int size;
> +
> + size = pnfs_generic_pg_test(pgio, prev, req);
> +
> + if (!size)
> return 0;
>
> - if (pgio->pg_count + req->wb_bytes <=
> + if (pgio->pg_count + req->wb_bytes >
> (unsigned long)pgio->pg_layout_private)
> - return req->wb_bytes;
> - return 0;
> + return 0;
objio_osd can enjoy the new facility by returning the
remainder here:
max_io = (unsigned long)pgio->pg_layout_private);
wb_bytes = min(size, req->wb_bytes);
if (pgio->pg_count + req->wb_bytes > max_io)
wb_bytes = max_io - pgio->pg_count;
return wb_bytes;
Which reminds me that this code sucks and I need to fix it. I will do
so after you send your changes.
[I promise to test these guys soon. Can you please put them on a public tree?]
Thanks
Boaz
> + return min(size, req->wb_bytes);
> }
>
> static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 6201bf6..7c89385 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -1469,8 +1469,12 @@ size_t
> pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
> struct nfs_page *req)
> {
> - if (pgio->pg_lseg == NULL)
> - return nfs_generic_pg_test(pgio, prev, req);
> + unsigned int size;
> +
> + size = nfs_generic_pg_test(pgio, prev, req);
> +
> + if (!size)
> + return 0;
>
> /*
> * Test if a nfs_page is fully contained in the pnfs_layout_range.
> @@ -1486,10 +1490,11 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
> * first byte that lies outside the pnfs_layout_range. FIXME?
> *
> */
> - if (req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset,
> + if (req_offset(req) >= end_offset(pgio->pg_lseg->pls_range.offset,
> pgio->pg_lseg->pls_range.length))
> - return req->wb_bytes;
> - return 0;
> + return 0;
> +
> + return min(size, req->wb_bytes);
> }
> EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
>
>
next prev parent reply other threads:[~2014-04-23 12:20 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-22 21:29 [PATCH 00/17] nfs: support multiple requests per page Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 01/17] nfs: clean up PG_* flags Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 02/17] nfs: remove unused arg from nfs_create_request Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 03/17] nfs: modify pg_test interface to return size_t Weston Andros Adamson
2014-04-23 12:30 ` Boaz Harrosh
2014-04-22 21:29 ` [PATCH 04/17] nfs: call nfs_can_coalesce_requests for every req Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 05/17] nfs: add support for multiple nfs reqs per page Weston Andros Adamson
2014-04-22 21:40 ` Weston Andros Adamson
2014-04-23 14:40 ` Weston Andros Adamson
2014-04-24 14:50 ` Jeff Layton
2014-04-24 15:23 ` Weston Andros Adamson
2014-04-24 15:45 ` Jeff Layton
2014-04-24 16:15 ` Weston Andros Adamson
2014-04-24 16:52 ` Jeff Layton
2014-04-24 17:23 ` Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 06/17] nfs: page group syncing in read path Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 07/17] nfs: page group syncing in write path Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 08/17] nfs: page group support in nfs_mark_uptodate Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 09/17] pnfs: clean up filelayout_alloc_commit_info Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 10/17] nfs: allow coalescing of subpage requests Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 11/17] nfs: chain calls to pg_test Weston Andros Adamson
2014-04-23 12:20 ` Boaz Harrosh [this message]
2014-04-23 13:37 ` Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 12/17] nfs: use > 1 request to handle bsize < PAGE_SIZE Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 13/17] nfs: remove list of [rw]data from pgio header Weston Andros Adamson
2014-04-23 14:16 ` Anna Schumaker
2014-04-23 14:31 ` Weston Andros Adamson
2014-04-23 14:36 ` Anna Schumaker
2014-04-23 17:44 ` Weston Andros Adamson
2014-04-23 17:51 ` Anna Schumaker
2014-04-24 11:55 ` Boaz Harrosh
2014-04-22 21:29 ` [PATCH 14/17] pnfs: support multiple verfs per direct req Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 15/17] pnfs: allow non page aligned pnfs layout segments Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 16/17] pnfs: filelayout: support non page aligned layouts Weston Andros Adamson
2014-04-22 21:29 ` [PATCH 17/17] nfs: support page groups in nfs_read_completion Weston Andros Adamson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5357AFFF.8030902@panasas.com \
--to=bharrosh@panasas.com \
--cc=dros@primarydata.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@primarydata.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.