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
Change-Id: I0ab143fc0cdb8e1b0c490c2c25e8af483c491a81
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Signed-off-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-on: https://review.whamcloud.com/31806
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
--- /dev/null
+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) {
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
rhel7/ext4-cleanup-goto-next-group.patch
rhel7/ext4-reduce-lock-contention-in-__ext4_new_inode.patch
rhel7.2/ext4-preread-gd.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.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
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
sles12sp2/ext4-dont-check-before-replay.patch
rhel7.2/ext4-dont-check-in-ro.patch
sles12sp2/ext4-fix-xattr-shifting-when-expanding-inodes.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
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
sles12sp2/ext4-mmp-brelse.patch
rhel7/ext4-jcb-optimization.patch
sles12sp2/ext4-attach-jinode-in-writepages.patch
+rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch