All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Haynes <thomas.haynes@primarydata.com>
To: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: Linux NFS Mailing list <linux-nfs@vger.kernel.org>
Subject: [PATCH v3 02/49] pnfs: Do not grab the commit_info lock twice when rescheduling writes
Date: Tue,  6 Jan 2015 16:28:07 -0800	[thread overview]
Message-ID: <1420590534-84063-3-git-send-email-loghyr@primarydata.com> (raw)
In-Reply-To: <1420590534-84063-1-git-send-email-loghyr@primarydata.com>

Acked-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: Tom Haynes <loghyr@primarydata.com>
---
 fs/nfs/direct.c     | 19 +++++++++++++++----
 fs/nfs/pnfs.h       | 15 ---------------
 fs/nfs/pnfs_nfsio.c | 15 ++++++++-------
 3 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 10bf072..e84f764 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -573,6 +573,20 @@ out:
 	return result;
 }
 
+static void
+nfs_direct_write_scan_commit_list(struct inode *inode,
+				  struct list_head *list,
+				  struct nfs_commit_info *cinfo)
+{
+	spin_lock(cinfo->lock);
+#ifdef CONFIG_NFS_V4_1
+	if (cinfo->ds != NULL && cinfo->ds->nwritten != 0)
+		NFS_SERVER(inode)->pnfs_curr_ld->recover_commit_reqs(list, cinfo);
+#endif
+	nfs_scan_commit_list(&cinfo->mds->list, list, cinfo, 0);
+	spin_unlock(cinfo->lock);
+}
+
 static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
 {
 	struct nfs_pageio_descriptor desc;
@@ -582,10 +596,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
 	LIST_HEAD(failed);
 
 	nfs_init_cinfo_from_dreq(&cinfo, dreq);
-	pnfs_recover_commit_reqs(dreq->inode, &reqs, &cinfo);
-	spin_lock(cinfo.lock);
-	nfs_scan_commit_list(&cinfo.mds->list, &reqs, &cinfo, 0);
-	spin_unlock(cinfo.lock);
+	nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
 
 	dreq->count = 0;
 	get_dreq(dreq);
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 88eede0..f666bc6 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -375,15 +375,6 @@ pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
 		return NFS_SERVER(inode)->pnfs_curr_ld->scan_commit_lists(cinfo, max);
 }
 
-static inline void
-pnfs_recover_commit_reqs(struct inode *inode, struct list_head *list,
-			 struct nfs_commit_info *cinfo)
-{
-	if (cinfo->ds == NULL || cinfo->ds->nwritten == 0)
-		return;
-	NFS_SERVER(inode)->pnfs_curr_ld->recover_commit_reqs(list, cinfo);
-}
-
 static inline struct nfs_page *
 pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
 			struct page *page)
@@ -554,12 +545,6 @@ pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
 	return 0;
 }
 
-static inline void
-pnfs_recover_commit_reqs(struct inode *inode, struct list_head *list,
-			 struct nfs_commit_info *cinfo)
-{
-}
-
 static inline struct nfs_page *
 pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
 			struct page *page)
diff --git a/fs/nfs/pnfs_nfsio.c b/fs/nfs/pnfs_nfsio.c
index e5f841c..fd2a2f0 100644
--- a/fs/nfs/pnfs_nfsio.c
+++ b/fs/nfs/pnfs_nfsio.c
@@ -66,7 +66,7 @@ EXPORT_SYMBOL_GPL(pnfs_generic_commit_release);
 
 /* The generic layer is about to remove the req from the commit list.
  * If this will make the bucket empty, it will need to put the lseg reference.
- * Note this is must be called holding the inode (/cinfo) lock
+ * Note this must be called holding the inode (/cinfo) lock
  */
 void
 pnfs_generic_clear_request_commit(struct nfs_page *req,
@@ -115,7 +115,6 @@ pnfs_generic_transfer_commit_list(struct list_head *src, struct list_head *dst,
 	return ret;
 }
 
-/* Note called with cinfo->lock held. */
 static int
 pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
 				 struct nfs_commit_info *cinfo,
@@ -125,6 +124,7 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
 	struct list_head *dst = &bucket->committing;
 	int ret;
 
+	lockdep_assert_held(cinfo->lock);
 	ret = pnfs_generic_transfer_commit_list(src, dst, cinfo, max);
 	if (ret) {
 		cinfo->ds->nwritten -= ret;
@@ -138,14 +138,15 @@ pnfs_generic_scan_ds_commit_list(struct pnfs_commit_bucket *bucket,
 	return ret;
 }
 
-/* Move reqs from written to committing lists, returning count of number moved.
- * Note called with cinfo->lock held.
+/* Move reqs from written to committing lists, returning count
+ * of number moved.
  */
 int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo,
 				   int max)
 {
 	int i, rv = 0, cnt;
 
+	lockdep_assert_held(cinfo->lock);
 	for (i = 0; i < cinfo->ds->nbuckets && max != 0; i++) {
 		cnt = pnfs_generic_scan_ds_commit_list(&cinfo->ds->buckets[i],
 						       cinfo, max);
@@ -156,7 +157,7 @@ int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo,
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_scan_commit_lists);
 
-/* Pull everything off the committing lists and dump into @dst */
+/* Pull everything off the committing lists and dump into @dst.  */
 void pnfs_generic_recover_commit_reqs(struct list_head *dst,
 				      struct nfs_commit_info *cinfo)
 {
@@ -164,8 +165,8 @@ void pnfs_generic_recover_commit_reqs(struct list_head *dst,
 	struct pnfs_layout_segment *freeme;
 	int i;
 
+	lockdep_assert_held(cinfo->lock);
 restart:
-	spin_lock(cinfo->lock);
 	for (i = 0, b = cinfo->ds->buckets; i < cinfo->ds->nbuckets; i++, b++) {
 		if (pnfs_generic_transfer_commit_list(&b->written, dst,
 						      cinfo, 0)) {
@@ -173,11 +174,11 @@ restart:
 			b->wlseg = NULL;
 			spin_unlock(cinfo->lock);
 			pnfs_put_lseg(freeme);
+			spin_lock(cinfo->lock);
 			goto restart;
 		}
 	}
 	cinfo->ds->nwritten = 0;
-	spin_unlock(cinfo->lock);
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_recover_commit_reqs);
 
-- 
1.9.3


  parent reply	other threads:[~2015-01-07  0:29 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-07  0:28 [PATCH v3 00/49] *** Add Flexfile Layout Module *** Tom Haynes
2015-01-07  0:28 ` [PATCH v3 01/49] pnfs: Prepare for flexfiles by pulling out common code Tom Haynes
2015-01-12 18:59   ` Anna Schumaker
2015-01-12 19:10     ` Tom Haynes
2015-01-12 19:13       ` Christoph Hellwig
2015-01-07  0:28 ` Tom Haynes [this message]
2015-01-07  0:28 ` [PATCH v3 03/49] nfs41: pull data server cache from file layout to generic pnfs Tom Haynes
2015-01-07 14:56   ` Christoph Hellwig
2015-01-07 18:28     ` Tom Haynes
2015-01-13 19:48       ` Tom Haynes
2015-01-07  0:28 ` [PATCH v3 04/49] nfs41: pull decode_ds_addr " Tom Haynes
2015-01-12 16:19   ` Anna Schumaker
2015-01-13 19:43     ` Tom Haynes
2015-01-07  0:28 ` [PATCH v3 05/49] nfs41: pull nfs4_ds_connect " Tom Haynes
2015-01-07 14:56   ` Christoph Hellwig
2015-01-07  0:28 ` [PATCH v3 06/49] nfs41: allow LD to choose DS connection auth flavor Tom Haynes
2015-01-07  0:28 ` [PATCH v3 07/49] nfs41: move file layout macros to generic pnfs Tom Haynes
2015-01-07  0:28 ` [PATCH v3 08/49] nfsv3: introduce nfs3_set_ds_client Tom Haynes
2015-01-07  0:28 ` [PATCH v3 09/49] nfs41: allow LD to choose DS connection version/minor_version Tom Haynes
2015-01-07  0:28 ` [PATCH v3 10/49] nfs41: create NFSv3 DS connection if specified Tom Haynes
2015-01-07  0:28 ` [PATCH v3 11/49] pnfs: Add nfs_rpc_ops in calls to nfs_initiate_pgio Tom Haynes
2015-01-12 18:41   ` Anna Schumaker
2015-01-12 18:51     ` Tom Haynes
2015-01-07  0:28 ` [PATCH v3 12/49] nfs: allow different protocol in nfs_initiate_commit Tom Haynes
2015-01-07  0:28 ` [PATCH v3 13/49] nfs4: pass slot table to nfs40_setup_sequence Tom Haynes
2015-01-07  0:28 ` [PATCH v3 14/49] nfs4: export nfs4_sequence_done Tom Haynes
2015-01-07  0:28 ` [PATCH v3 15/49] nfs: allow to specify cred in nfs_initiate_pgio Tom Haynes
2015-01-07  0:28 ` [PATCH v3 16/49] NFSv4.1/NFSv3: Add pNFS callbacks for nfs3_(read|write|commit)_done() Tom Haynes
2015-01-07  0:28 ` [PATCH v3 17/49] sunrpc: add rpc_count_iostats_idx Tom Haynes
2015-01-07  0:28 ` [PATCH v3 18/49] nfs: set hostname when creating nfsv3 ds connection Tom Haynes
2015-01-07  0:28 ` [PATCH v3 19/49] nfs/flexclient: export pnfs_layoutcommit_inode Tom Haynes
2015-01-07  0:28 ` [PATCH v3 20/49] nfs41: close a small race window when adding new layout to global list Tom Haynes
2015-01-07  0:28 ` [PATCH v3 21/49] nfs41: serialize first layoutget of a file Tom Haynes
2015-01-07  0:28 ` [PATCH v3 22/49] nfs: save server READ/WRITE/COMMIT status Tom Haynes
2015-01-07  0:28 ` [PATCH v3 23/49] nfs41: pass iomode through layoutreturn args Tom Haynes
2015-01-07  0:28 ` [PATCH v3 24/49] nfs41: make a helper function to send layoutreturn Tom Haynes
2015-01-07  0:28 ` [PATCH v3 25/49] nfs41: add a helper to mark layout for return Tom Haynes
2015-01-07  0:28 ` [PATCH v3 26/49] nfs41: don't use a layout if it is marked for returning Tom Haynes
2015-01-07  0:28 ` [PATCH v3 27/49] nfs41: send layoutreturn in last put_lseg Tom Haynes
2015-01-07  0:28 ` [PATCH v3 28/49] nfs41: clear NFS_LAYOUT_RETURN if layoutreturn is sent or failed to send Tom Haynes
2015-01-07  0:28 ` [PATCH v3 29/49] nfs/filelayout: use pnfs_error_mark_layout_for_return Tom Haynes
2015-01-07  0:28 ` [PATCH v3 30/49] nfs: introduce pg_cleanup op for pgio descriptors Tom Haynes
2015-01-07  0:28 ` [PATCH v3 31/49] pnfs: release lseg in pnfs_generic_pg_cleanup Tom Haynes
2015-01-07  0:28 ` [PATCH v3 32/49] nfs: handle overlapping reqs in lock_and_join Tom Haynes
2015-01-07  0:28 ` [PATCH v3 33/49] nfs: rename pgio header ds_idx to ds_commit_idx Tom Haynes
2015-01-07  0:28 ` [PATCH v3 34/49] pnfs: pass ds_commit_idx through the commit path Tom Haynes
2015-01-13 15:37   ` Anna Schumaker
2015-01-13 16:10     ` Weston Andros Adamson
2015-01-07  0:28 ` [PATCH v3 35/49] nfs: add mirroring support to pgio layer Tom Haynes
2015-01-07  0:28 ` [PATCH v3 36/49] nfs: mirroring support for direct io Tom Haynes
2015-01-07  0:28 ` [PATCH v3 37/49] pnfs: fail comparison when bucket verifier not set Tom Haynes
2015-01-07  0:28 ` [PATCH v3 38/49] nfs41: add a debug warning if we destroy an unempty layout Tom Haynes
2015-01-07  0:28 ` [PATCH v3 39/49] nfs: only reset desc->pg_mirror_idx when mirroring is supported Tom Haynes
2015-01-07  0:28 ` [PATCH v3 40/49] nfs: add nfs_pgio_current_mirror helper Tom Haynes
2015-01-07  0:28 ` [PATCH v3 41/49] pnfs: allow LD to ask to resend read through pnfs Tom Haynes
2015-01-07  0:28 ` [PATCH v3 42/49] nfs41: add range to layoutreturn args Tom Haynes
2015-01-13 19:15   ` Anna Schumaker
2015-01-13 19:42     ` Tom Haynes
2015-01-13 19:51       ` Anna Schumaker
2015-01-13 22:50         ` Tom Haynes
2015-01-14 13:40           ` Anna Schumaker
2015-01-07  0:28 ` [PATCH v3 43/49] nfs41: allow async version layoutreturn Tom Haynes
2015-01-07  0:28 ` [PATCH v3 44/49] nfs41: introduce NFS_LAYOUT_RETURN_BEFORE_CLOSE Tom Haynes
2015-01-07  0:28 ` [PATCH v3 45/49] nfs/flexfiles: send layoutreturn before freeing lseg Tom Haynes
2015-01-07  0:28 ` [PATCH v3 46/49] nfs41: add NFS_LAYOUT_RETRY_LAYOUTGET to layout header flags Tom Haynes
2015-01-07  0:28 ` [PATCH v3 47/49] nfs: add a helper to set NFS_ODIRECT_RESCHED_WRITES to direct writes Tom Haynes
2015-01-07  0:28 ` [PATCH v3 48/49] nfs41: wait for LAYOUTRETURN before retrying LAYOUTGET Tom Haynes
2015-01-07  0:28 ` [PATCH v3 49/49] pnfs/flexfiles: Add the FlexFile Layout Driver Tom Haynes
2015-01-08 14:45 ` [PATCH v3 00/49] *** Add Flexfile Layout Module *** Christoph Hellwig
2015-01-08 15:20   ` Anna Schumaker
2015-01-08 18:13     ` Tom Haynes
2015-01-08 16:02   ` Weston Andros Adamson
2015-01-08 17:07   ` Tom Haynes
2015-01-08 19:36     ` Tom Haynes

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=1420590534-84063-3-git-send-email-loghyr@primarydata.com \
    --to=thomas.haynes@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.