From cd793b4067b62862185f481cfef7b779927b801f Mon Sep 17 00:00:00 2001 From: Bruno Faccini Date: Mon, 11 Dec 2017 10:55:32 +0100 Subject: [PATCH] LU-10149 llite: avoid live-lock when concurrent mmap()s 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. Signed-off-by: Bruno Faccini Change-Id: Id04664fce1a5dad4dbdd7ad4b183dffb8e38b844 Reviewed-on: https://review.whamcloud.com/30465 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Bobi Jam Reviewed-by: Jinshan Xiong Reviewed-by: Oleg Drokin --- lustre/llite/llite_mmap.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lustre/llite/llite_mmap.c b/lustre/llite/llite_mmap.c index e76f3e4..6eaeb46 100644 --- a/lustre/llite/llite_mmap.c +++ b/lustre/llite/llite_mmap.c @@ -159,7 +159,7 @@ static int ll_page_mkwrite0(struct vm_area_struct *vma, struct page *vmpage, int result; __u16 refcheck; sigset_t set; - struct inode *inode; + struct inode *inode = NULL; struct ll_inode_info *lli; ENTRY; @@ -231,6 +231,16 @@ out: 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 != NULL) { + CDEBUG(D_MMAP, "delaying new page-fault for inode %p to " + "prevent live-lock\n", inode); + msleep(10); + } + return result; } -- 1.8.3.1