All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <jens.axboe@oracle.com>
To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: chris.mason@oracle.com, hch@infradead.org, tytso@mit.edu,
	akpm@linux-foundation.org, jack@suse.cz,
	trond.myklebust@fys.uio.no, Jens Axboe <jens.axboe@oracle.com>
Subject: [PATCH 1/7] writeback: merely wakeup flusher thread if work allocation fails for WB_SYNC_NONE
Date: Mon, 14 Sep 2009 11:36:28 +0200	[thread overview]
Message-ID: <1252920994-11141-2-git-send-email-jens.axboe@oracle.com> (raw)
In-Reply-To: <1252920994-11141-1-git-send-email-jens.axboe@oracle.com>

From: Christoph Hellwig <hch@infradead.org>

Since it's an opportunistic writeback and not a data integrity action,
don't punt to blocking writeback. Just wakeup the thread and it will
flush old data.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
---
 fs/fs-writeback.c |   46 ++++++++++++++--------------------------------
 1 files changed, 14 insertions(+), 32 deletions(-)

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index da86ef5..1873fd0 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -75,13 +75,6 @@ static inline void bdi_work_init(struct bdi_work *work,
 	work->state = WS_USED;
 }
 
-static inline void bdi_work_init_on_stack(struct bdi_work *work,
-					  struct writeback_control *wbc)
-{
-	bdi_work_init(work, wbc);
-	work->state |= WS_ONSTACK;
-}
-
 /**
  * writeback_in_progress - determine whether there is writeback in progress
  * @bdi: the device's backing_dev_info structure.
@@ -207,34 +200,23 @@ static struct bdi_work *bdi_alloc_work(struct writeback_control *wbc)
 
 void bdi_start_writeback(struct writeback_control *wbc)
 {
-	const bool must_wait = wbc->sync_mode == WB_SYNC_ALL;
-	struct bdi_work work_stack, *work = NULL;
-
-	if (!must_wait)
-		work = bdi_alloc_work(wbc);
+	/*
+	 * WB_SYNC_NONE is opportunistic writeback. If this allocation fails,
+	 * bdi_queue_work() will wake up the thread and flush old data. This
+	 * should ensure some amount of progress in freeing memory.
+	 */
+	if (wbc->sync_mode != WB_SYNC_ALL) {
+		struct bdi_work *w = bdi_alloc_work(wbc);
 
-	if (!work) {
-		work = &work_stack;
-		bdi_work_init_on_stack(work, wbc);
-	}
+		bdi_queue_work(wbc->bdi, w);
+	} else {
+		struct bdi_work work;
 
-	bdi_queue_work(wbc->bdi, work);
+		bdi_work_init(&work, wbc);
+		work.state |= WS_ONSTACK;
 
-	/*
-	 * If the sync mode is WB_SYNC_ALL, block waiting for the work to
-	 * complete. If not, we only need to wait for the work to be started,
-	 * if we allocated it on-stack. We use the same mechanism, if the
-	 * wait bit is set in the bdi_work struct, then threads will not
-	 * clear pending until after they are done.
-	 *
-	 * Note that work == &work_stack if must_wait is true, so we don't
-	 * need to do call_rcu() here ever, since the completion path will
-	 * have done that for us.
-	 */
-	if (must_wait || work == &work_stack) {
-		bdi_wait_on_work_clear(work);
-		if (work != &work_stack)
-			call_rcu(&work->rcu_head, bdi_work_free);
+		bdi_queue_work(wbc->bdi, &work);
+		bdi_wait_on_work_clear(&work);
 	}
 }
 
-- 
1.6.4.1.207.g68ea


  reply	other threads:[~2009-09-14  9:36 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-14  9:36 [PATCH 0/7] Post merge per-bdi writeback patches v2 Jens Axboe
2009-09-14  9:36 ` Jens Axboe [this message]
2009-09-14 12:34   ` [PATCH 1/7] writeback: merely wakeup flusher thread if work allocation fails for WB_SYNC_NONE Jan Kara
2009-09-14 12:39     ` Jens Axboe
2009-09-14 13:19       ` Christoph Hellwig
2009-09-14  9:36 ` [PATCH 2/7] Assign bdi in super_block Jens Axboe
2009-09-14 13:02   ` Jan Kara
2009-09-14 18:25     ` Trond Myklebust
2009-09-14 18:36       ` Jens Axboe
2009-09-15 10:14         ` Jan Kara
2009-09-15 10:22           ` Jens Axboe
2009-09-15 13:16           ` Trond Myklebust
2009-09-14  9:36 ` [PATCH 3/7] writeback: only use bdi_writeback_all() for WB_SYNC_NONE writeout Jens Axboe
2009-09-14 13:12   ` Jan Kara
2009-09-14  9:36 ` [PATCH 4/7] writeback: use RCU to protect bdi_list Jens Axboe
2009-09-14 11:10   ` Minchan Kim
2009-09-14 11:11     ` Jens Axboe
2009-09-14  9:36 ` [PATCH 5/7] writeback: inline allocation failure handling in bdi_alloc_queue_work() Jens Axboe
2009-09-14 13:13   ` Jan Kara
2009-09-14  9:36 ` [PATCH 6/7] writeback: separate starting of sync vs opportunistic writeback Jens Axboe
2009-09-14 13:33   ` Jan Kara
2009-09-14 13:42     ` Christoph Hellwig
2009-09-14 19:28       ` Jens Axboe
2009-09-14 19:42         ` Jens Axboe
2009-09-15  9:08           ` Jan Kara
2009-09-15  9:14             ` Jens Axboe
2009-09-15 11:44               ` Jens Axboe
2009-09-15 12:58                 ` Jan Kara
2009-09-15 13:04                   ` Jens Axboe
2009-09-15 13:08                     ` Christoph Hellwig
2009-09-15 13:17                       ` Jens Axboe
2009-09-15 14:01                       ` Jan Kara
2009-09-15 14:09                         ` Chris Mason
2009-09-14  9:36 ` [PATCH 7/7] writeback: splice dirty inode entries to default bdi on bdi_destroy() Jens Axboe
2009-09-14 10:56   ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1252920994-11141-2-git-send-email-jens.axboe@oracle.com \
    --to=jens.axboe@oracle.com \
    --cc=akpm@linux-foundation.org \
    --cc=chris.mason@oracle.com \
    --cc=hch@infradead.org \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=trond.myklebust@fys.uio.no \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.