Whamcloud - gitweb
LU-10149 llite: avoid live-lock when concurrent mmap()s 65/30465/2
authorBruno Faccini <bruno.faccini@intel.com>
Mon, 11 Dec 2017 09:55:32 +0000 (10:55 +0100)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 22 Dec 2017 06:49:31 +0000 (06:49 +0000)
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 <bruno.faccini@intel.com>
Change-Id: Id04664fce1a5dad4dbdd7ad4b183dffb8e38b844
Reviewed-on: https://review.whamcloud.com/30465
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/llite_mmap.c

index e76f3e4..6eaeb46 100644 (file)
@@ -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;
 }