From 0595d92ad03ab9d975d599aad204d746aff991b3 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Wed, 28 Mar 2018 09:03:22 +0800 Subject: [PATCH] LU-10859 ldiskfs: fix deadlock with heavy memory preassure 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 Signed-off-by: Bob Glossman Reviewed-by: Andreas Dilger Reviewed-by: Dmitry Eremin Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/32058 Tested-by: Jenkins Tested-by: Maloo --- .../ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch | 13 +++++++++++++ ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series | 1 + ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series | 1 + ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series | 1 + ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series | 1 + ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series | 1 + 6 files changed, 18 insertions(+) create mode 100644 ldiskfs/kernel_patches/patches/rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch 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 index 0000000..5abe23e --- /dev/null +++ b/ldiskfs/kernel_patches/patches/rhel7/ext4-use-GFP_NOFS-in-ext4_inode_attach_jinode.patch @@ -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) { diff --git a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series index 33e7a35..5bb3bc6 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.2.series @@ -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 diff --git a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series index 0384351..3796657 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.3.series @@ -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 diff --git a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series index 6cb4f04..c3d0791 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.4.series @@ -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 diff --git a/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series b/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series index 5261894..2c5fc63 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp2.series @@ -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 diff --git a/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series b/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series index 31308c1..1bbca1a 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-4.4-sles12sp3.series @@ -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 -- 1.8.3.1