From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andreas Gruenbacher Date: Tue, 1 Aug 2017 02:00:22 +0200 Subject: [Cluster-devel] [PATCH v3 4/4] gfs2: Defer deleting inodes under memory pressure In-Reply-To: <20170801000022.13295-1-agruenba@redhat.com> References: <20170801000022.13295-1-agruenba@redhat.com> Message-ID: <20170801000022.13295-5-agruenba@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit When under memory pressure and an inode's link count has dropped to zero, defer deleting the inode to the delete workqueue. This avoids calling into DLM under memory pressure, which can deadlock. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/super.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 027abb11337b..958a2c5eec2a 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1318,6 +1318,25 @@ static int gfs2_drop_inode(struct inode *inode) if (test_bit(GLF_DEMOTE, &gl->gl_flags)) clear_nlink(inode); } + + /* + * When under memory pressure when an inode's link count has dropped to + * zero, defer deleting the inode to the delete workqueue. This avoids + * calling into DLM under memory pressure, which can deadlock. + */ + if (!inode->i_nlink && + unlikely(current->flags & PF_MEMALLOC) && + gfs2_holder_initialized(&ip->i_iopen_gh)) { + struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl; + + spin_lock(&gl->gl_lockref.lock); + gl->gl_lockref.count++; + if (queue_work(gfs2_delete_workqueue, &gl->gl_delete) == 0) + gl->gl_lockref.count--; + spin_unlock(&gl->gl_lockref.lock); + return false; + } + return generic_drop_inode(inode); } @@ -1545,6 +1564,10 @@ static void gfs2_evict_inode(struct inode *inode) goto alloc_failed; } + /* Deletes should never happen under memory pressure anymore. */ + if (WARN_ON_ONCE(current->flags & PF_MEMALLOC)) + goto out; + /* Must not read inode block until block type has been verified */ error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh); if (unlikely(error)) { -- 2.13.3