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 09/18] nfs: page group support in nfs_mark_uptodate
Date: Thu, 15 May 2014 11:56:48 -0400	[thread overview]
Message-ID: <1400169417-28245-10-git-send-email-dros@primarydata.com> (raw)
In-Reply-To: <1400169417-28245-1-git-send-email-dros@primarydata.com>

Change how nfs_mark_uptodate checks to see if writes cover a whole page.

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/write.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 67 insertions(+), 7 deletions(-)

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 5d75276..17b9895 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -154,18 +154,78 @@ static void nfs_set_pageerror(struct page *page)
 	nfs_zap_mapping(page_file_mapping(page)->host, page_file_mapping(page));
 }
 
+/*
+ * nfs_page_group_search_locked
+ * @head - head request of page group
+ * @page_offset - offset into page
+ *
+ * Search page group with head @head to find a request that contains the
+ * page offset @page_offset.
+ *
+ * Returns a pointer to the first matching nfs request, or NULL if no
+ * match is found.
+ *
+ * Must be called with the page group lock held
+ */
+static struct nfs_page *
+nfs_page_group_search_locked(struct nfs_page *head, unsigned int page_offset)
+{
+	struct nfs_page *req;
+
+	WARN_ON_ONCE(head != head->wb_head);
+	WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &head->wb_head->wb_flags));
+
+	req = head;
+	do {
+		if (page_offset >= req->wb_pgbase &&
+		    page_offset < (req->wb_pgbase + req->wb_bytes))
+			return req;
+
+		req = req->wb_this_page;
+	} while (req != head);
+
+	return NULL;
+}
+
+/*
+ * nfs_page_group_covers_page
+ * @head - head request of page group
+ *
+ * Return true if the page group with head @head covers the whole page,
+ * returns false otherwise
+ */
+static bool nfs_page_group_covers_page(struct nfs_page *req)
+{
+	struct nfs_page *tmp;
+	unsigned int pos = 0;
+	unsigned int len = nfs_page_length(req->wb_page);
+
+	nfs_page_group_lock(req);
+
+	do {
+		tmp = nfs_page_group_search_locked(req->wb_head, pos);
+		if (tmp) {
+			/* no way this should happen */
+			WARN_ON_ONCE(tmp->wb_pgbase != pos);
+			pos += tmp->wb_bytes - (pos - tmp->wb_pgbase);
+		}
+	} while (tmp && pos < len);
+
+	nfs_page_group_unlock(req);
+	WARN_ON_ONCE(pos > len);
+	return pos == len;
+}
+
 /* We can set the PG_uptodate flag if we see that a write request
  * covers the full page.
  */
-static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int count)
+static void nfs_mark_uptodate(struct nfs_page *req)
 {
-	if (PageUptodate(page))
-		return;
-	if (base != 0)
+	if (PageUptodate(req->wb_page))
 		return;
-	if (count != nfs_page_length(page))
+	if (!nfs_page_group_covers_page(req))
 		return;
-	SetPageUptodate(page);
+	SetPageUptodate(req->wb_page);
 }
 
 static int wb_priority(struct writeback_control *wbc)
@@ -796,7 +856,7 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page,
 		return PTR_ERR(req);
 	/* Update file length */
 	nfs_grow_file(page, offset, count);
-	nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes);
+	nfs_mark_uptodate(req);
 	nfs_mark_request_dirty(req);
 	nfs_unlock_and_release_request(req);
 	return 0;
-- 
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 ` [PATCH v3 08/18] nfs: page group syncing in write path Weston Andros Adamson
2014-05-15 15:56 ` Weston Andros Adamson [this message]
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-10-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).