[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <dd57027c-55f3-6d9d-7fd6-a842bb16e11f@kernel.dk>
Date: Tue, 19 Sep 2017 19:57:10 -0600
From: Jens Axboe <axboe@...nel.dk>
To: linux-kernel@...r.kernel.org, linux-fsdevel@...r.kernel.org,
linux-mm@...ck.org
Cc: hannes@...xchg.org, clm@...com, jack@...e.cz
Subject: Re: [PATCH 6/6] fs-writeback: only allow one inflight and pending
!nr_pages flush
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
Powered by blists - more mailing lists