Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp547851imm; Wed, 13 Jun 2018 04:52:47 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIvO3H95SCfi5IstJKuryRmYqVMGSz1lRc5A69onAgMMq6G9Q4yMyc51Qve26LAXqGsrWWg X-Received: by 2002:a17:902:be0b:: with SMTP id r11-v6mr5019329pls.182.1528890767710; Wed, 13 Jun 2018 04:52:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528890767; cv=none; d=google.com; s=arc-20160816; b=uG9qrOJfRj50DXMYvtHXHP5bLdqcos5ghiQ4L2re4UYa7rLWkLKzHecr71YstI0StM PqkrZ0B2xK/m0oIWSq5jrDKx9NgMrwcN/TFjsGpXPFTkLL8B9zND8F0KFQYOqGhGSLry 1a152/DHdYCY3Kt7PwQ7T1IV1APyDucV3ZD+DU7HuS6H799VgBCSlzSsnZDCrB/VoWXl J28gUKrlM/O/FmlAWZr6AaGyWz+EGwYkHPOO5De6wC45+XYjaO1X5BNq9/mxM2ufGutp 45tN0P6Orlz6yKhYFVd7gRPxC+XtMT9do5mupmY4DAF0s0+sbG5+p7vMJz5LO3MxKTqn KU/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject:arc-authentication-results; bh=//OIgcx9u6k3Wrmw6iPRDDA97iuFJHnH39/re8K9q6c=; b=MnesVNeqVB5w/DWA4Y1VrP1XPZkcGvkcX/oD8xvjUHLrkHsiwEkt24tanSmqPMvUAc 46EIpjloZqkoeJpVgh/EphvXI0+LA6nnO4DzJVeQanq7xqDDVMyfKv10RNX+IWX8bcOJ t/3evne03eDOdFH92bz8Nw17avNjta7qVFycDj1aINw38Q5ZsyMvSfN+oUGkJw8P2R4f myOTZs+idsgMBrYih0dEX5ENq5iYaTChe8AZf4uyu8bMP+qSAM+BvkI8bQTD4Qe2auQf ia/q75NC/nOiXqjozTYGZfhP6rvo3YSwyVtvZClHlqUpUq5ZXaL3u72pkOyJ+49E5BP6 qotA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i26-v6si2150990pgn.433.2018.06.13.04.52.33; Wed, 13 Jun 2018 04:52:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935468AbeFMLwB (ORCPT + 99 others); Wed, 13 Jun 2018 07:52:01 -0400 Received: from www262.sakura.ne.jp ([202.181.97.72]:48381 "EHLO www262.sakura.ne.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754096AbeFMLv7 (ORCPT ); Wed, 13 Jun 2018 07:51:59 -0400 Received: from fsav404.sakura.ne.jp (fsav404.sakura.ne.jp [133.242.250.103]) by www262.sakura.ne.jp (8.15.2/8.15.2) with ESMTP id w5DBpBus013000; Wed, 13 Jun 2018 20:51:11 +0900 (JST) (envelope-from penguin-kernel@i-love.sakura.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav404.sakura.ne.jp (F-Secure/fsigk_smtp/530/fsav404.sakura.ne.jp); Wed, 13 Jun 2018 20:51:11 +0900 (JST) X-Virus-Status: clean(F-Secure/fsigk_smtp/530/fsav404.sakura.ne.jp) Received: from [192.168.1.8] (softbank126074194044.bbtec.net [126.74.194.44]) (authenticated bits=0) by www262.sakura.ne.jp (8.15.2/8.15.2) with ESMTPSA id w5DBpA17012994 (version=TLSv1.2 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 13 Jun 2018 20:51:10 +0900 (JST) (envelope-from penguin-kernel@i-love.sakura.ne.jp) Subject: Re: [PATCH] bdi: Fix another oops in wb_workfn() From: Tetsuo Handa To: Jan Kara , Tejun Heo Cc: Dmitry Vyukov , Jens Axboe , syzbot , syzkaller-bugs , linux-fsdevel , LKML , Al Viro , Dave Chinner , linux-block@vger.kernel.org, Linus Torvalds References: <2b437c6f-3e10-3d83-bdf3-82075d3eaa1a@i-love.sakura.ne.jp> <3cf4b0e3-31b6-8cdc-7c1e-15ba575a7879@i-love.sakura.ne.jp> <20180611091248.2i6nt27h5mxrodm2@quack2.suse.cz> <20180611160131.GQ1351649@devbig577.frc2.facebook.com> <20180611162920.mwapvuqotvhkntt3@quack2.suse.cz> <20180611172053.GR1351649@devbig577.frc2.facebook.com> <20180612155754.x5k2yndh5t6wlmpy@quack2.suse.cz> Message-ID: <6d3dc916-94fd-3684-7861-6b120e5616ee@i-love.sakura.ne.jp> Date: Wed, 13 Jun 2018 20:51:13 +0900 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Tetsuo Handa wrote: > Or, toggling a dedicated flag using test_and_change_bit(): > > > include/linux/backing-dev-defs.h | 1 + > mm/backing-dev.c | 8 +++++++- > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h > index 0bd432a..93ff83c 100644 > --- a/include/linux/backing-dev-defs.h > +++ b/include/linux/backing-dev-defs.h > @@ -26,6 +26,7 @@ enum wb_state { > WB_writeback_running, /* Writeback is in progress */ > WB_has_dirty_io, /* Dirty inodes on ->b_{dirty|io|more_io} */ > WB_start_all, /* nr_pages == 0 (all) work pending */ > + WB_postpone_kfree, /* cgwb_bdi_unregister() will access later */ > }; > > enum wb_congested_state { > diff --git a/mm/backing-dev.c b/mm/backing-dev.c > index 347cc83..422d7a7 100644 > --- a/mm/backing-dev.c > +++ b/mm/backing-dev.c > @@ -516,7 +516,10 @@ static void cgwb_release_workfn(struct work_struct *work) > fprop_local_destroy_percpu(&wb->memcg_completions); > percpu_ref_exit(&wb->refcnt); > wb_exit(wb); > - kfree_rcu(wb, rcu); > + spin_lock_irq(&cgwb_lock); > + if (!test_and_change_bit(WB_postpone_kfree, &wb->state)) > + kfree_rcu(wb, rcu); > + spin_unlock_irq(&cgwb_lock); > } > > static void cgwb_release(struct percpu_ref *refcnt) > @@ -721,9 +724,12 @@ static void cgwb_bdi_unregister(struct backing_dev_info *bdi) > while (!list_empty(&bdi->wb_list)) { > wb = list_first_entry(&bdi->wb_list, struct bdi_writeback, > bdi_node); > + set_bit(WB_postpone_kfree, &wb->state); > spin_unlock_irq(&cgwb_lock); > wb_shutdown(wb); > spin_lock_irq(&cgwb_lock); > + if (!test_and_change_bit(WB_postpone_kfree, &wb->state)) > + kfree_rcu(wb, rcu); > } > spin_unlock_irq(&cgwb_lock); > } Forgot to include below change, but isn't this approach the simplest? @@ -370,7 +370,6 @@ static void wb_shutdown(struct bdi_writeback *wb) set_bit(WB_shutting_down, &wb->state); spin_unlock_bh(&wb->work_lock); - cgwb_remove_from_bdi_list(wb); /* * Drain work list and shutdown the delayed_work. !WB_registered * tells wb_workfn() that @wb is dying and its work_list needs to @@ -379,6 +378,7 @@ static void wb_shutdown(struct bdi_writeback *wb) mod_delayed_work(bdi_wq, &wb->dwork, 0); flush_delayed_work(&wb->dwork); WARN_ON(!list_empty(&wb->work_list)); + cgwb_remove_from_bdi_list(wb); /* * Make sure bit gets cleared after shutdown is finished. Matches with * the barrier provided by test_and_clear_bit() above. --