All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@redhat.com>
To: Trond Myklebust <trond.myklebust@primarydata.com>,
	Chuck Lever <chuck.lever@oracle.com>,
	linux-nfs@vger.kernel.org
Subject: Re: [PATCH 00/20] Reducing inode->i_lock contention in writebacks
Date: Tue, 25 Jul 2017 11:55:20 -0400	[thread overview]
Message-ID: <1500998120.27030.0.camel@redhat.com> (raw)
In-Reply-To: <20170719220955.58210-1-trond.myklebust@primarydata.com>

On Wed, 2017-07-19 at 18:09 -0400, Trond Myklebust wrote:
> Chuck Lever has presented measurements, that would appear to indicate that
> the inode->i_lock can be a source of contention when doing writeback using
> high performance networks. This patch series is therefore an attempt to
> address the sources of contention that his measurements pointed to.
> 
> According to Chuck's table, the main sources of contention appear to
> be in nfs_flush_incompatible(), nfs_lock_and_join_requests() and
> nfs_updatepage(). Most of this patch series focuses on fixing
> nfs_lock_and_join_requests(), since it holds the inode lock, while
> taking locks on the page group and the sub-requests themselves,
> rolling them all back if ever there is contention.
> By noting a few simple rules that are mostly already in place, we
> can simplify that locking to ensure that we only have to keep the
> spin lock while we're dereferencing and locking the head page pointer
> that is stored in page_private(page).
> 
> Along the way, the patches also simplify the code a little, and fix
> a number of subtle races which mainly occur when you set wsize to
> some value smaller than the page size. The most notable such race
> occurs between nfs_lock_and_join_requests() and nfs_page_group_destroy(),
> and could lead to a double free() of some of the sub-requests.
> 
> Finally, there are 2 patches tacked onto the end of the series that
> attempt to improve the throttling of writes when the RPC layer is
> congested. They do so by forcing each caller of nfs_initiate_pgio()
> to wait until the request is being transmitted. The expectation is
> that this might help improve latencies when there are several processes
> competing for access to the RPC transport.
> 
> Trond Myklebust (20):
>   NFS: Simplify page writeback
>   NFS: Reduce lock contention in nfs_page_find_head_request()
>   NFS: Reduce lock contention in nfs_try_to_update_request()
>   NFS: Ensure we always dereference the page head last
>   NFS: Fix a reference and lock leak in nfs_lock_and_join_requests()
>   NFS: Fix an ABBA issue in nfs_lock_and_join_requests()
>   NFS: Don't check request offset and size without holding a lock
>   NFS: Don't unlock writebacks before declaring PG_WB_END
>   NFS: Fix the inode request accounting when pages have subrequests
>   NFS: Teach nfs_try_to_update_request() to deal with request
>     page_groups
>   NFS: Remove page group limit in nfs_flush_incompatible()
>   NFS: Reduce inode->i_lock contention in nfs_lock_and_join_requests()
>   NFS: Further optimise nfs_lock_and_join_requests()
>   NFS: Fix nfs_page_group_destroy() and nfs_lock_and_join_requests()
>     race cases
>   NFS: Remove nfs_page_group_clear_bits()
>   NFS: Remove unuse function nfs_page_group_lock_wait()
>   NFS: Remove unused parameter from nfs_page_group_lock()
>   NFS: Fix up nfs_page_group_covers_page()
>   SUNRPC: Add a function to allow waiting for RPC transmission
>   NFS: Throttle I/O to the NFS server
> 
>  fs/nfs/pagelist.c            |  64 +++------
>  fs/nfs/write.c               | 313 ++++++++++++++++++-------------------------
>  include/linux/nfs_page.h     |   3 +-
>  include/linux/sunrpc/sched.h |   3 +
>  net/sunrpc/sched.c           |  22 +++
>  net/sunrpc/xprt.c            |   6 +
>  6 files changed, 177 insertions(+), 234 deletions(-)
> 

Looks good:

Reviewed-by: Jeff Layton <jlayton@redhat.com>

  parent reply	other threads:[~2017-07-25 15:55 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-19 22:09 [PATCH 00/20] Reducing inode->i_lock contention in writebacks Trond Myklebust
2017-07-19 22:09 ` [PATCH 01/20] NFS: Simplify page writeback Trond Myklebust
2017-07-19 22:09   ` [PATCH 02/20] NFS: Reduce lock contention in nfs_page_find_head_request() Trond Myklebust
2017-07-19 22:09     ` [PATCH 03/20] NFS: Reduce lock contention in nfs_try_to_update_request() Trond Myklebust
2017-07-19 22:09       ` [PATCH 04/20] NFS: Ensure we always dereference the page head last Trond Myklebust
2017-07-19 22:09         ` [PATCH 05/20] NFS: Fix a reference and lock leak in nfs_lock_and_join_requests() Trond Myklebust
2017-07-19 22:09           ` [PATCH 06/20] NFS: Fix an ABBA issue " Trond Myklebust
2017-07-19 22:09             ` [PATCH 07/20] NFS: Don't check request offset and size without holding a lock Trond Myklebust
2017-07-19 22:09               ` [PATCH 08/20] NFS: Don't unlock writebacks before declaring PG_WB_END Trond Myklebust
2017-07-19 22:09                 ` [PATCH 09/20] NFS: Fix the inode request accounting when pages have subrequests Trond Myklebust
2017-07-19 22:09                   ` [PATCH 10/20] NFS: Teach nfs_try_to_update_request() to deal with request page_groups Trond Myklebust
2017-07-19 22:09                     ` [PATCH 11/20] NFS: Remove page group limit in nfs_flush_incompatible() Trond Myklebust
2017-07-19 22:09                       ` [PATCH 12/20] NFS: Reduce inode->i_lock contention in nfs_lock_and_join_requests() Trond Myklebust
2017-07-19 22:09                         ` [PATCH 13/20] NFS: Further optimise nfs_lock_and_join_requests() Trond Myklebust
2017-07-19 22:09                           ` [PATCH 14/20] NFS: Fix nfs_page_group_destroy() and nfs_lock_and_join_requests() race cases Trond Myklebust
2017-07-19 22:09                             ` [PATCH 15/20] NFS: Remove nfs_page_group_clear_bits() Trond Myklebust
2017-07-19 22:09                               ` [PATCH 16/20] NFS: Remove unuse function nfs_page_group_lock_wait() Trond Myklebust
2017-07-19 22:09                                 ` [PATCH 17/20] NFS: Remove unused parameter from nfs_page_group_lock() Trond Myklebust
2017-07-19 22:09                                   ` [PATCH 18/20] NFS: Fix up nfs_page_group_covers_page() Trond Myklebust
2017-07-19 22:09                                     ` [PATCH 19/20] SUNRPC: Add a function to allow waiting for RPC transmission Trond Myklebust
2017-07-19 22:09                                       ` [PATCH 20/20] NFS: Throttle I/O to the NFS server Trond Myklebust
2017-07-20  6:52 ` [PATCH 00/20] Reducing inode->i_lock contention in writebacks Chuck Lever
2017-07-25  4:13 ` Weston Andros Adamson
2017-07-25 15:55 ` Jeff Layton [this message]
     [not found] ` <29B1641A-1D00-4CD3-8FBD-4B1D211D3AD7@oracle.com>
2017-07-28 19:59   ` Chuck Lever

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=1500998120.27030.0.camel@redhat.com \
    --to=jlayton@redhat.com \
    --cc=chuck.lever@oracle.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.