[lustre-devel] [PATCH 091/151] lustre: llite: avoid live-lock when concurrent mmap()s

James Simmons jsimmons at infradead.org
Mon Sep 30 11:55:50 PDT 2019


From: Bruno Faccini <bruno.faccini at intel.com>

Patch is an attempt to delay page-fault retry from Client side for
inode with extents being mmap()'ed, to prevent live-lock situation
to occur with other page's competitors.

WC-bug-id: https://jira.whamcloud.com/browse/LU-10149
Lustre-commit: cd793b4067b6 ("LU-10149 llite: avoid live-lock when concurrent mmap()s")
Signed-off-by: Bruno Faccini <bruno.faccini at intel.com>
Reviewed-on: https://review.whamcloud.com/30465
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Bobi Jam <bobijam at hotmail.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong at gmail.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 fs/lustre/llite/llite_mmap.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/fs/lustre/llite/llite_mmap.c b/fs/lustre/llite/llite_mmap.c
index 59fb400..14080b6 100644
--- a/fs/lustre/llite/llite_mmap.c
+++ b/fs/lustre/llite/llite_mmap.c
@@ -38,6 +38,7 @@
 #include <linux/errno.h>
 #include <linux/unistd.h>
 #include <linux/uaccess.h>
+#include <linux/delay.h>
 
 #include <linux/fs.h>
 #include <linux/pagemap.h>
@@ -153,7 +154,7 @@ static int __ll_page_mkwrite(struct vm_area_struct *vma, struct page *vmpage,
 	int result;
 	u16 refcheck;
 	sigset_t old, new;
-	struct inode *inode;
+	struct inode *inode = NULL;
 	struct ll_inode_info *lli;
 
 	env = cl_env_get(&refcheck);
@@ -229,6 +230,17 @@ static int __ll_page_mkwrite(struct vm_area_struct *vma, struct page *vmpage,
 	CDEBUG(D_MMAP, "%s mkwrite with %d\n", current->comm, result);
 	LASSERT(ergo(result == 0, PageLocked(vmpage)));
 
+	/* if page has been unmapped, presumably due to lock reclaim for
+	 * concurrent usage, add some delay before retrying to prevent
+	 * entering live-lock situation with competitors
+	 */
+	if (result == -ENODATA && inode) {
+		CDEBUG(D_MMAP,
+		       "delaying new page-fault for inode %p to prevent live-lock\n",
+		       inode);
+		msleep(20);
+	}
+
 	return result;
 }
 
-- 
1.8.3.1



More information about the lustre-devel mailing list