linux-nfs.vger.kernel.org archive mirror
 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 v3 08/18] nfs: page group syncing in write path
Date: Thu, 15 May 2014 11:56:47 -0400	[thread overview]
Message-ID: <1400169417-28245-9-git-send-email-dros@primarydata.com> (raw)
In-Reply-To: <1400169417-28245-1-git-send-email-dros@primarydata.com>

Operations that modify state for a whole page must be syncronized across
all requests within a page group. In the write path, this is calling
end_page_writeback and removing the head request from an inode.
Both of these operations should not be called until all requests
in a page group have reached the point where they would call them.

This patch should have no effect yet since all page groups currently
have one request, but will come into play when pg_test functions are
modified to split pages into sub-page regions.

Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
---
 fs/nfs/pagelist.c        |  2 ++
 fs/nfs/write.c           | 32 ++++++++++++++++++++------------
 include/linux/nfs_page.h |  2 ++
 3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index 87cdb4b..ce3faad 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -397,6 +397,8 @@ static void nfs_free_request(struct nfs_page *req)
 	WARN_ON_ONCE(test_bit(PG_TEARDOWN, &req->wb_flags));
 	WARN_ON_ONCE(test_bit(PG_UNLOCKPAGE, &req->wb_flags));
 	WARN_ON_ONCE(test_bit(PG_UPTODATE, &req->wb_flags));
+	WARN_ON_ONCE(test_bit(PG_WB_END, &req->wb_flags));
+	WARN_ON_ONCE(test_bit(PG_REMOVE, &req->wb_flags));
 
 	/* Release struct file and open context */
 	nfs_clear_request(req);
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index d0f30f1..5d75276 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -201,12 +201,15 @@ static void nfs_set_page_writeback(struct page *page)
 	}
 }
 
-static void nfs_end_page_writeback(struct page *page)
+static void nfs_end_page_writeback(struct nfs_page *req)
 {
-	struct inode *inode = page_file_mapping(page)->host;
+	struct inode *inode = page_file_mapping(req->wb_page)->host;
 	struct nfs_server *nfss = NFS_SERVER(inode);
 
-	end_page_writeback(page);
+	if (!nfs_page_group_sync_on_bit(req, PG_WB_END))
+		return;
+
+	end_page_writeback(req->wb_page);
 	if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
 		clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
 }
@@ -397,15 +400,20 @@ static void nfs_inode_remove_request(struct nfs_page *req)
 {
 	struct inode *inode = req->wb_context->dentry->d_inode;
 	struct nfs_inode *nfsi = NFS_I(inode);
+	struct nfs_page *head;
 
-	spin_lock(&inode->i_lock);
-	if (likely(!PageSwapCache(req->wb_page))) {
-		set_page_private(req->wb_page, 0);
-		ClearPagePrivate(req->wb_page);
-		clear_bit(PG_MAPPED, &req->wb_flags);
+	if (nfs_page_group_sync_on_bit(req, PG_REMOVE)) {
+		head = req->wb_head;
+
+		spin_lock(&inode->i_lock);
+		if (likely(!PageSwapCache(head->wb_page))) {
+			set_page_private(head->wb_page, 0);
+			ClearPagePrivate(head->wb_page);
+			clear_bit(PG_MAPPED, &head->wb_flags);
+		}
+		nfsi->npages--;
+		spin_unlock(&inode->i_lock);
 	}
-	nfsi->npages--;
-	spin_unlock(&inode->i_lock);
 	nfs_release_request(req);
 }
 
@@ -599,7 +607,7 @@ remove_req:
 		nfs_inode_remove_request(req);
 next:
 		nfs_unlock_request(req);
-		nfs_end_page_writeback(req->wb_page);
+		nfs_end_page_writeback(req);
 		do_destroy = !test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags);
 		nfs_release_request(req);
 	}
@@ -964,7 +972,7 @@ static void nfs_redirty_request(struct nfs_page *req)
 {
 	nfs_mark_request_dirty(req);
 	nfs_unlock_request(req);
-	nfs_end_page_writeback(req->wb_page);
+	nfs_end_page_writeback(req);
 	nfs_release_request(req);
 }
 
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 6385175..7d9096d 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -31,6 +31,8 @@ enum {
 	PG_TEARDOWN,		/* page group sync for destroy */
 	PG_UNLOCKPAGE,		/* page group sync bit in read path */
 	PG_UPTODATE,		/* page group sync bit in read path */
+	PG_WB_END,		/* page group sync bit in write path */
+	PG_REMOVE,		/* page group sync bit in write path */
 };
 
 struct nfs_inode;
-- 
1.8.5.2 (Apple Git-48)


  parent reply	other threads:[~2014-05-15 15:57 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-15 15:56 [PATCH v3 00/18] nfs: support multiple requests per page Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 01/18] pnfs: fix race in filelayout commit path Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 02/18] nfs: clean up PG_* flags Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 03/18] nfs: remove unused arg from nfs_create_request Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 04/18] nfs: modify pg_test interface to return size_t Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 05/18] nfs: call nfs_can_coalesce_requests for every req Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 06/18] nfs: add support for multiple nfs reqs per page Weston Andros Adamson
2014-05-15 21:12   ` Anna Schumaker
2014-05-15 22:19     ` Weston Andros Adamson
2014-05-16 12:58       ` Anna Schumaker
2014-05-15 15:56 ` [PATCH v3 07/18] nfs: page group syncing in read path Weston Andros Adamson
2014-05-15 15:56 ` Weston Andros Adamson [this message]
2014-05-15 15:56 ` [PATCH v3 09/18] nfs: page group support in nfs_mark_uptodate Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 10/18] pnfs: clean up filelayout_alloc_commit_info Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 11/18] nfs: allow coalescing of subpage requests Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 12/18] nfs: chain calls to pg_test Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 13/18] nfs: use > 1 request to handle bsize < PAGE_SIZE Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 14/18] nfs: remove data list from pgio header Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 15/18] pnfs: support multiple verfs per direct req Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 16/18] pnfs: allow non page aligned pnfs layout segments Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 17/18] pnfs: filelayout: support non page aligned layouts Weston Andros Adamson
2014-05-15 15:56 ` [PATCH v3 18/18] nfs: support page groups in nfs_read_completion Weston Andros Adamson
2014-05-19 15:37 ` [PATCH v3 00/18] nfs: support multiple requests per page Christoph Hellwig
2014-05-19 16:20   ` Weston Andros Adamson
2014-05-28 23:23 ` Trond Myklebust

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=1400169417-28245-9-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).