From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F720C282D7 for ; Wed, 30 Jan 2019 10:07:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 205862184D for ; Wed, 30 Jan 2019 10:07:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727431AbfA3KHU (ORCPT ); Wed, 30 Jan 2019 05:07:20 -0500 Received: from mx2.suse.de ([195.135.220.15]:49854 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726406AbfA3KHU (ORCPT ); Wed, 30 Jan 2019 05:07:20 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 4A657ADC9; Wed, 30 Jan 2019 10:07:19 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 02EE81E3FFD; Wed, 30 Jan 2019 11:07:18 +0100 (CET) Date: Wed, 30 Jan 2019 11:07:18 +0100 From: Jan Kara To: Andrew Morton Cc: Jan Kara , Al Viro , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [PATCH] vfs: Avoid softlockups in drop_pagecache_sb() Message-ID: <20190130100718.GA30203@quack2.suse.cz> References: <20190114085343.15011-1-jack@suse.cz> <20190129165636.34a1dc779efdbb9eff4bcf8b@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190129165636.34a1dc779efdbb9eff4bcf8b@linux-foundation.org> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org On Tue 29-01-19 16:56:36, Andrew Morton wrote: > On Mon, 14 Jan 2019 09:53:43 +0100 Jan Kara wrote: > > > When superblock has lots of inodes without any pagecache (like is the > > case for /proc), drop_pagecache_sb() will iterate through all of them > > without dropping sb->s_inode_list_lock which can lead to softlockups > > (one of our customers hit this). > > > > Fix the problem by going to the slow path and doing cond_resched() in > > case the process needs rescheduling. > > > > ... > > > > --- a/fs/drop_caches.c > > +++ b/fs/drop_caches.c > > @@ -21,8 +21,13 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) > > spin_lock(&sb->s_inode_list_lock); > > list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { > > spin_lock(&inode->i_lock); > > + /* > > + * We must skip inodes in unusual state. We may also skip > > + * inodes without pages but we deliberately won't in case > > + * we need to reschedule to avoid softlockups. > > + */ > > if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || > > - (inode->i_mapping->nrpages == 0)) { > > + (inode->i_mapping->nrpages == 0 && !need_resched())) { > > spin_unlock(&inode->i_lock); > > continue; > > } > > @@ -30,6 +35,7 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) > > spin_unlock(&inode->i_lock); > > spin_unlock(&sb->s_inode_list_lock); > > > > + cond_resched(); > > invalidate_mapping_pages(inode->i_mapping, 0, -1); > > iput(toput_inode); > > toput_inode = inode; > > Are we sure there's no situation in which a large number of inodes can > be in the "unusual state", leading to the same issue? No, we cannot be really sure that there aren't many such inodes (although I'd be surprised if there were). But the problem with "unusual state" inodes is that you cannot just __iget() them (well, you could but it's breaking the rules and would lead to use-after-free issues ;) and so there's no easy way to drop the spinlock and then continue the iteration after cond_resched(). So overall it's too complex to deal with this until someone actually hits it. Honza -- Jan Kara SUSE Labs, CR