Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751544AbdITB5Q (ORCPT ); Tue, 19 Sep 2017 21:57:16 -0400 Received: from mail-pf0-f177.google.com ([209.85.192.177]:49585 "EHLO mail-pf0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750872AbdITB5O (ORCPT ); Tue, 19 Sep 2017 21:57:14 -0400 X-Google-Smtp-Source: AOwi7QCVS0OabAAy054yTH0VbQZfYwlr7nJYJVVgFnh07t2U1oucIGEMe37J2s+tqXERvpKzZQkUMQ== Subject: Re: [PATCH 6/6] fs-writeback: only allow one inflight and pending !nr_pages flush To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Cc: hannes@cmpxchg.org, clm@fb.com, jack@suse.cz References: <1505850787-18311-1-git-send-email-axboe@kernel.dk> <1505850787-18311-7-git-send-email-axboe@kernel.dk> From: Jens Axboe Message-ID: Date: Tue, 19 Sep 2017 19:57:10 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <1505850787-18311-7-git-send-email-axboe@kernel.dk> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1504 Lines: 43 On 09/19/2017 01:53 PM, Jens Axboe wrote: > @@ -948,15 +949,25 @@ static void wb_start_writeback(struct bdi_writeback *wb, long nr_pages, > bool range_cyclic, enum wb_reason reason) > { > struct wb_writeback_work *work; > + bool zero_pages = false; > > if (!wb_has_dirty_io(wb)) > return; > > /* > - * If someone asked for zero pages, we write out the WORLD > + * If someone asked for zero pages, we write out the WORLD. > + * Places like vmscan and laptop mode want to queue a wakeup to > + * the flusher threads to clean out everything. To avoid potentially > + * having tons of these pending, ensure that we only allow one of > + * them pending and inflight at the time > */ > - if (!nr_pages) > + if (!nr_pages) { > + if (test_bit(WB_zero_pages, &wb->state)) > + return; > + set_bit(WB_zero_pages, &wb->state); > nr_pages = get_nr_dirty_pages(); > + zero_pages = true; > + } Later fix added here to ensure we clear WB_zero_pages, if work allocation fails: work = kzalloc(sizeof(*work), GFP_NOWAIT | __GFP_NOMEMALLOC | __GFP_NOWARN); if (!work) { if (zero_pages) clear_bit(WB_zero_pages, &wb->state); [...] Updated patch here: http://git.kernel.dk/cgit/linux-block/commit/?h=writeback-fixup&id=21ea70657894fda9fccf257543cbec112b2813ef -- Jens Axboe