All of lore.kernel.org
 help / color / mirror / Atom feed
From: Weston Andros Adamson <dros@primarydata.com>
To: trond.myklebust@primarydata.com
Cc: linux-nfs@vger.kernel.org, Weston Andros Adamson <dros@primarydata.com>
Subject: [PATCH 00/18 v2] nfs: support multiple requests per page
Date: Thu, 24 Apr 2014 14:15:10 -0400	[thread overview]
Message-ID: <1398363328-7100-1-git-send-email-dros@primarydata.com> (raw)

This patchset changes the read and write paths to be more flexible in dealing
with requests that are not page aligned. Until now there was a 1:1 mapping
of struct nfs_page (referred to as "nfs requests") to struct page, which
limited the client to page aligned I/O in several pNFS scenarios.

This patchset allows multiple requests per page, loosely following
the approach taken with struct buffer_head (part of kernel bio interface).

With this patchset the client now supports:
 - non-page-aligned O_DIRECT I/O to DSes (instead of reverting to MDS)
 - arbitrary pnfs layout segment boundaries
 - arbitrary pnfs filelayout stripe sizes

This patchset also includes a lot of cleanup - notably we no longer need
a separate code path to support rsize/wsize < PAGE_SIZE.

This new approach opens the door to many optimizations, such as not having to
flush a page on a non-contiguous write, but for the time being we are focusing
on correctness -- this patchset touches the read and write path for *all*
versions of NFS!

This has been tested against v2, v3, v4.0 and v4.1 (no pnfs) servers with
different rsize/wsize settings, and against pynfs filelayout servers hacked to
have non page aligned stripe sizes.

I had some code review already (with changes applied) and we've been testing
this pretty extensively for the last month+ - focusing mostly on v2, v3, v4.x
(no pnfs).

The patchset applies against Trond's testing branch, but should also include
the fix I posted earlier today: "pnfs: fix race in filelayout commit path"
as the race seems to be easier to hit with this patchset applied.

I'm pretty sure I didn't break anything in the object and block layouts, but
some extra attention there would be helpful.

I plan on sharing some performance numbers once I'm able to run some nfsometer
workloads. Expect them soon.

Changes in V2:
 - now includes "pnfs: fix race in filelayout commit path" which was posted
   separately, but is needed for testing

 - applied fixup to "nfs: add support for multiple nfs reqs per page"
   to fix ref counting issues.

 - fixed "pnfs: support multiple verfs per direct req" to set dreq->flag
   to _RESCHED_WRITES, just as before

 - applied comment from Boaz to "nfs: modify pg_test interface to return size_t"   and "nfs: chain calls to pg_test"

 - I also rebased on top of trond's testing branch with recent pgio patches
   from Christoph and Anna applied first. the patches are:

    % git log --oneline HEAD~37..HEAD~18
    c1dac13 NFS: Create a common nfs_pageio_ops struct
    a9f5822 NFS: Create a common generic_pg_pgios()
    aab1abe NFS: Create a common multiple_pgios() function
    60695af NFS: Create a common initiate_pgio() function
    3e2e4ad NFS: Create a generic_pgio function
    741d1af NFS: Create a common pgio_error function
    087f8d8 NFS: Create a common rpcsetup function for reads and writes
    fce97cb NFS: Create a common rpc_call_ops struct
    c4c63d7 NFS: Create a common nfs_pgio_result_common function
    fcc4ad0 NFS: Create a common pgio_rpc_prepare function
    06a5f36 NFS: Create a common rw_header_alloc and rw_header_free function
    d4aca41 NFS: Create a common pgio_alloc and pgio_release function
    80afdb2 NFS: Move the write verifier into the nfs_pgio_header
    4f1abf9 NFS: Create a common read and write header struct
    fc7a26b NFS: Create a common read and write data struct
    81ae1c0 NFS: Create a common results structure for reads and writes
    f824d97 NFS: Create a common argument structure for reads and writes
    0d08e1b nfs: remove ->read_pageio_init from rpc ops
    9c4bc08 nfs: remove ->write_pageio_init from rpc ops

    This can be found on my (new) public repo at:

    git://git.linux-nfs.org/projects/dros/linux-nfs

    on the branch "pgio".

 -dros



Weston Andros Adamson (18):
  pnfs: fix race in filelayout commit path
  nfs: clean up PG_* flags
  nfs: remove unused arg from nfs_create_request
  nfs: modify pg_test interface to return size_t
  nfs: call nfs_can_coalesce_requests for every req
  nfs: add support for multiple nfs reqs per page
  nfs: page group syncing in read path
  nfs: page group syncing in write path
  nfs: page group support in nfs_mark_uptodate
  pnfs: clean up filelayout_alloc_commit_info
  nfs: allow coalescing of subpage requests
  nfs: chain calls to pg_test
  nfs: use > 1 request to handle bsize < PAGE_SIZE
  nfs: remove list of [rw]data from pgio header
  pnfs: support multiple verfs per direct req
  pnfs: allow non page aligned pnfs layout segments
  pnfs: filelayout: support non page aligned layouts
  nfs: support page groups in nfs_read_completion

 fs/nfs/blocklayout/blocklayout.c |  16 ++-
 fs/nfs/direct.c                  | 107 +++++++++++++--
 fs/nfs/nfs4filelayout.c          | 142 ++++++++++---------
 fs/nfs/objlayout/objio_osd.c     |  18 ++-
 fs/nfs/pageio.c                  |  91 +-----------
 fs/nfs/pagelist.c                | 290 +++++++++++++++++++++++++++++++++------
 fs/nfs/pnfs.c                    |  77 +++++------
 fs/nfs/pnfs.h                    |   3 +-
 fs/nfs/read.c                    |  51 +++++--
 fs/nfs/write.c                   | 119 +++++++++++++---
 include/linux/nfs.h              |   5 +-
 include/linux/nfs_page.h         |  33 +++--
 include/linux/nfs_xdr.h          |   6 +-
 13 files changed, 659 insertions(+), 299 deletions(-)

-- 
1.8.5.2 (Apple Git-48)


             reply	other threads:[~2014-04-24 18:15 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-24 18:15 Weston Andros Adamson [this message]
2014-04-24 18:15 ` [PATCH 01/18 v2] pnfs: fix race in filelayout commit path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 02/18 v2] nfs: clean up PG_* flags Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 03/18 v2] nfs: remove unused arg from nfs_create_request Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 04/18 v2] nfs: modify pg_test interface to return size_t Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 05/18 v2] nfs: call nfs_can_coalesce_requests for every req Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 06/18 v2] nfs: add support for multiple nfs reqs per page Weston Andros Adamson
2014-04-24 20:49   ` Anna Schumaker
2014-04-24 21:03     ` Anna Schumaker
2014-04-24 23:06       ` Weston Andros Adamson
2014-04-25 13:32         ` Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 07/18 v2] nfs: page group syncing in read path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 08/18 v2] nfs: page group syncing in write path Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 09/18 v2] nfs: page group support in nfs_mark_uptodate Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 10/18 v2] pnfs: clean up filelayout_alloc_commit_info Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 11/18 v2] nfs: allow coalescing of subpage requests Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 12/18 v2] nfs: chain calls to pg_test Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 13/18 v2] nfs: use > 1 request to handle bsize < PAGE_SIZE Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 14/18 v2] nfs: remove list of [rw]data from pgio header Weston Andros Adamson
2014-04-25 13:56   ` Anna Schumaker
2014-04-25 13:58     ` Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 15/18 v2] pnfs: support multiple verfs per direct req Weston Andros Adamson
2014-04-25 14:15   ` Anna Schumaker
2014-04-25 15:12     ` Weston Andros Adamson
2014-04-25 15:38       ` Weston Andros Adamson
2014-04-25 15:53         ` Anna Schumaker
2014-04-25 16:04           ` Weston Andros Adamson
2014-04-25 17:22             ` Anna Schumaker
2014-04-24 18:15 ` [PATCH 16/18 v2] pnfs: allow non page aligned pnfs layout segments Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 17/18 v2] pnfs: filelayout: support non page aligned layouts Weston Andros Adamson
2014-04-24 18:15 ` [PATCH 18/18 v2] 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=1398363328-7100-1-git-send-email-dros@primarydata.com \
    --to=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.