From: Bruno Faccini Date: Mon, 11 Dec 2017 09:55:32 +0000 (+0100) Subject: LU-10149 llite: avoid live-lock when concurrent mmap()s X-Git-Tag: 2.10.57~71 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F65%2F30465%2F2;p=fs%2Flustre-release.git 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 --- 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; }