All of lore.kernel.org
 help / color / mirror / Atom feed
From: Trond Myklebust <trond.myklebust@primarydata.com>
To: Chuck Lever <chuck.lever@oracle.com>, linux-nfs@vger.kernel.org
Subject: [PATCH 01/20] NFS: Simplify page writeback
Date: Wed, 19 Jul 2017 18:09:36 -0400	[thread overview]
Message-ID: <20170719220955.58210-2-trond.myklebust@primarydata.com> (raw)
In-Reply-To: <20170719220955.58210-1-trond.myklebust@primarydata.com>

We don't expect the page header lock to ever be held across I/O, so
it should always be safe to wait for it, even if we're doing nonblocking
writebacks.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
---
 fs/nfs/write.c | 30 ++++++++++--------------------
 1 file changed, 10 insertions(+), 20 deletions(-)

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index b1af5dee5e0a..1d447e37f472 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -366,7 +366,6 @@ nfs_page_group_clear_bits(struct nfs_page *req)
  * @inode - inode associated with request page group, must be holding inode lock
  * @head  - head request of page group, must be holding head lock
  * @req   - request that couldn't lock and needs to wait on the req bit lock
- * @nonblock - if true, don't actually wait
  *
  * NOTE: this must be called holding page_group bit lock and inode spin lock
  *       and BOTH will be released before returning.
@@ -375,7 +374,7 @@ nfs_page_group_clear_bits(struct nfs_page *req)
  */
 static int
 nfs_unroll_locks_and_wait(struct inode *inode, struct nfs_page *head,
-			  struct nfs_page *req, bool nonblock)
+			  struct nfs_page *req)
 	__releases(&inode->i_lock)
 {
 	struct nfs_page *tmp;
@@ -396,10 +395,7 @@ nfs_unroll_locks_and_wait(struct inode *inode, struct nfs_page *head,
 	/* release ref from nfs_page_find_head_request_locked */
 	nfs_release_request(head);
 
-	if (!nonblock)
-		ret = nfs_wait_on_request(req);
-	else
-		ret = -EAGAIN;
+	ret = nfs_wait_on_request(req);
 	nfs_release_request(req);
 
 	return ret;
@@ -464,7 +460,6 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
  *                              operations for this page.
  *
  * @page - the page used to lookup the "page group" of nfs_page structures
- * @nonblock - if true, don't block waiting for request locks
  *
  * This function joins all sub requests to the head request by first
  * locking all requests in the group, cancelling any pending operations
@@ -478,7 +473,7 @@ nfs_destroy_unlinked_subrequests(struct nfs_page *destroy_list,
  * error was encountered.
  */
 static struct nfs_page *
-nfs_lock_and_join_requests(struct page *page, bool nonblock)
+nfs_lock_and_join_requests(struct page *page)
 {
 	struct inode *inode = page_file_mapping(page)->host;
 	struct nfs_page *head, *subreq;
@@ -511,14 +506,9 @@ nfs_lock_and_join_requests(struct page *page, bool nonblock)
 	if (ret < 0) {
 		spin_unlock(&inode->i_lock);
 
-		if (!nonblock && ret == -EAGAIN) {
-			nfs_page_group_lock_wait(head);
-			nfs_release_request(head);
-			goto try_again;
-		}
-
+		nfs_page_group_lock_wait(head);
 		nfs_release_request(head);
-		return ERR_PTR(ret);
+		goto try_again;
 	}
 
 	/* lock each request in the page group */
@@ -543,7 +533,7 @@ nfs_lock_and_join_requests(struct page *page, bool nonblock)
 			/* releases page group bit lock and
 			 * inode spin lock and all references */
 			ret = nfs_unroll_locks_and_wait(inode, head,
-				subreq, nonblock);
+				subreq);
 
 			if (ret == 0)
 				goto try_again;
@@ -624,12 +614,12 @@ nfs_error_is_fatal_on_server(int err)
  * May return an error if the user signalled nfs_wait_on_request().
  */
 static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
-				struct page *page, bool nonblock)
+				struct page *page)
 {
 	struct nfs_page *req;
 	int ret = 0;
 
-	req = nfs_lock_and_join_requests(page, nonblock);
+	req = nfs_lock_and_join_requests(page);
 	if (!req)
 		goto out;
 	ret = PTR_ERR(req);
@@ -672,7 +662,7 @@ static int nfs_do_writepage(struct page *page, struct writeback_control *wbc,
 	int ret;
 
 	nfs_pageio_cond_complete(pgio, page_index(page));
-	ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE);
+	ret = nfs_page_async_flush(pgio, page);
 	if (ret == -EAGAIN) {
 		redirty_page_for_writepage(wbc, page);
 		ret = 0;
@@ -2015,7 +2005,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
 
 	/* blocking call to cancel all requests and join to a single (head)
 	 * request */
-	req = nfs_lock_and_join_requests(page, false);
+	req = nfs_lock_and_join_requests(page);
 
 	if (IS_ERR(req)) {
 		ret = PTR_ERR(req);
-- 
2.13.3


  reply	other threads:[~2017-07-19 22:10 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 ` Trond Myklebust [this message]
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
     [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=20170719220955.58210-2-trond.myklebust@primarydata.com \
    --to=trond.myklebust@primarydata.com \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    /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.