Whamcloud - gitweb
LU-10859 ldiskfs: fix deadlock with heavy memory preassure 58/32058/2
authorWang Shilong <wshilong@ddn.com>
Wed, 28 Mar 2018 01:03:22 +0000 (09:03 +0800)
committerJohn L. Hammond <john.hammond@intel.com>
Thu, 3 May 2018 20:00:33 +0000 (20:00 +0000)
On one Customer site, we hit following deadlock:

Thread 1:
ofd_object_punch
 osd_punch
  ldiskfs_truncate
   ldiskfs_inode_attach_jinode
     ...
     do_try_to_free_pages
      lu_cache_shrink
       mutex_lock -->try to hold @lu_sites_guard

kswapd thread2:
kthread
 shrink_slab
  lu_cache_shrink
    mutex_lock ---->hold already.
     ...
     dqget
      ldiskfs_acquire_dquot
       jbd2__journal_start-->blocked to wait for more credits.

Thread3:
kthread
 kjournald2
  jbd2_journal_commit_transaction-->blocked to wait Thread2 finished,
 since Thread1 add a handle into transaction.

So deadlock happens because of Thread1 wait Thread2, Thread2 wait Thread3..
but Thread3 wait Thread1....

This problem still exists even we have switched @lu_sites_guard
into a read/write lock, sine we hold write lock at lu_cahce_shrink().

Fixed the problem by making ldiskfs_inode_attach_jinode() use
GFP_NOFS.

Test-Parameters: testgroup=review-ldiskfs \
mdtfilesystemtype=ldiskfs ostfilesystemtype=ldiskfs

Lustre-change: https://review.whamcloud.com/31806
Lustre-commit: 0506e1bd6a6d5fafe7fc5e558aa1b75e456c2642

Change-Id: I0ab143fc0cdb8e1b0c490c2c25e8af483c491a81
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Signed-off-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Signed-off-by: Minh Diep <minh.diep@intel.com>
Reviewed-on: https://review.whamcloud.com/32058
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
ldiskfs/kernel_patches/patches/rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch [new file with mode: 0644]
ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series
ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series
ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series
ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series
ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series

diff --git a/ldiskfs/kernel_patches/patches/rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch b/ldiskfs/kernel_patches/patches/rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
new file mode 100644 (file)
index 0000000..5abe23e
--- /dev/null
@@ -0,0 +1,13 @@
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 153dda7..63339a2 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -3775,7 +3775,7 @@ int ext4_inode_attach_jinode(struct inode *inode)
+       if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal)
+               return 0;
+-      jinode = jbd2_alloc_inode(GFP_KERNEL);
++      jinode = jbd2_alloc_inode(GFP_NOFS);
+       spin_lock(&inode->i_lock);
+       if (!ei->jinode) {
+               if (!jinode) {
index 33e7a35..5bb3bc6 100644 (file)
@@ -30,3 +30,4 @@ rhel7/ext4-projid-feature-support.patch
 rhel7/ext4-projid-quotas.patch
 rhel7/ext4-projid-xfs-ioctls.patch
 rhel7/ext4-fix-xattr-shifting-when-expanding-inodes.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
index 0384351..3796657 100644 (file)
@@ -30,3 +30,4 @@ rhel7/ext4-projid-xfs-ioctls.patch
 rhel7/ext4-fix-xattr-shifting-when-expanding-inodes.patch
 rhel6.3/ext4-dont-check-in-ro.patch
 rhel7.2/ext4-dont-check-before-replay.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
index 6cb4f04..c3d0791 100644 (file)
@@ -30,3 +30,4 @@ rhel7.4/ext4-fix-xattr-shifting-when-expanding-inodes.patch
 rhel7.4/ext4-attach-jinode-in-writepages.patch
 rhel6.3/ext4-dont-check-in-ro.patch
 rhel7.4/ext4-dont-check-before-replay.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
index 5261894..2c5fc63 100644 (file)
@@ -24,3 +24,4 @@ sles12sp2/ext4-attach-jinode-in-writepages.patch
 sles12sp2/ext4-dont-check-before-replay.patch
 rhel7.2/ext4-dont-check-in-ro.patch
 sles12sp2/ext4-fix-xattr-shifting-when-expanding-inodes.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
index 31308c1..1bbca1a 100644 (file)
@@ -24,3 +24,4 @@ sles12sp2/ext4-attach-jinode-in-writepages.patch
 sles12sp2/ext4-dont-check-before-replay.patch
 rhel7.2/ext4-dont-check-in-ro.patch
 sles12sp2/ext4-fix-xattr-shifting-when-expanding-inodes.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch