linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: Eryu Guan <eguan@redhat.com>
Cc: Dave Chinner <david@fromorbit.com>,
	xfs@oss.sgi.com, axboe@fb.com, jack@suse.cz,
	linux-fsdevel@vger.kernel.org
Subject: Re: generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression]
Date: Thu, 13 Aug 2015 19:24:00 -0400	[thread overview]
Message-ID: <20150813232400.GH4496@mtj.duckdns.org> (raw)
In-Reply-To: <20150813004435.GN3902@dastard>

Hello, Eryu.

Can you please do the followings?

1. See if the "writeback: fix syncing of I_DIRTY_TIME inodes" patch
   changes anything.

2. If not, apply this patch.  This patch *should* make the failures go
   away and might print out some error messages along with stack
   trace.  Can you please verify that the failures go away with this
   patch and report the kernel messages if any trigger?

Thanks a lot.

Index: work/fs/fs-writeback.c
===================================================================
--- work.orig/fs/fs-writeback.c
+++ work/fs/fs-writeback.c
@@ -103,7 +103,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(wbc_writepa
 
 static bool wb_io_lists_populated(struct bdi_writeback *wb)
 {
-	if (wb_has_dirty_io(wb)) {
+	if (test_bit(WB_has_dirty_io, &wb->state)) {
 		return false;
 	} else {
 		set_bit(WB_has_dirty_io, &wb->state);
@@ -844,14 +844,13 @@ static void bdi_split_work_to_wbs(struct
 	struct wb_iter iter;
 
 	might_sleep();
-
-	if (!bdi_has_dirty_io(bdi))
-		return;
 restart:
 	rcu_read_lock();
 	bdi_for_each_wb(wb, bdi, &iter, next_blkcg_id) {
-		if (!wb_has_dirty_io(wb) ||
-		    (skip_if_busy && writeback_in_progress(wb)))
+		/* SYNC_ALL writes out I_DIRTY_TIME too */
+		if (!wb_has_dirty_io(wb) && base_work->sync_mode == WB_SYNC_NONE)
+			continue;
+		if (skip_if_busy && writeback_in_progress(wb))
 			continue;
 
 		base_work->nr_pages = wb_split_bdi_pages(wb, nr_pages);
@@ -899,8 +898,7 @@ static void bdi_split_work_to_wbs(struct
 {
 	might_sleep();
 
-	if (bdi_has_dirty_io(bdi) &&
-	    (!skip_if_busy || !writeback_in_progress(&bdi->wb))) {
+	if (!skip_if_busy || !writeback_in_progress(&bdi->wb)) {
 		base_work->auto_free = 0;
 		base_work->single_wait = 0;
 		base_work->single_done = 0;
@@ -2275,8 +2273,8 @@ void sync_inodes_sb(struct super_block *
 	};
 	struct backing_dev_info *bdi = sb->s_bdi;
 
-	/* Nothing to do? */
-	if (!bdi_has_dirty_io(bdi) || bdi == &noop_backing_dev_info)
+	/* bdi_has_dirty() ignores I_DIRTY_TIME but we can't, always kick wbs */
+	if (bdi == &noop_backing_dev_info)
 		return;
 	WARN_ON(!rwsem_is_locked(&sb->s_umount));
 
Index: work/include/linux/backing-dev.h
===================================================================
--- work.orig/include/linux/backing-dev.h
+++ work/include/linux/backing-dev.h
@@ -38,7 +38,17 @@ extern struct workqueue_struct *bdi_wq;
 
 static inline bool wb_has_dirty_io(struct bdi_writeback *wb)
 {
-	return test_bit(WB_has_dirty_io, &wb->state);
+	bool ret = test_bit(WB_has_dirty_io, &wb->state);
+
+	if (!ret && (!list_empty(&wb->b_dirty) || !list_empty(&wb->b_io) ||
+		     !list_empty(&wb->b_more_io))) {
+		const char *name = wb->bdi->dev ? dev_name(wb->bdi->dev) : "UNK";
+
+		pr_err("wb_has_dirty_io: ERR %s has_dirty=%d b_dirty=%d b_io=%d b_more_io=%d\n",
+		       name, ret, !list_empty(&wb->b_dirty), !list_empty(&wb->b_io), !list_empty(&wb->b_more_io));
+		WARN_ON(1);
+	}
+	return ret;
 }
 
 static inline bool bdi_has_dirty_io(struct backing_dev_info *bdi)
@@ -47,7 +57,18 @@ static inline bool bdi_has_dirty_io(stru
 	 * @bdi->tot_write_bandwidth is guaranteed to be > 0 if there are
 	 * any dirty wbs.  See wb_update_write_bandwidth().
 	 */
-	return atomic_long_read(&bdi->tot_write_bandwidth);
+	bool ret = atomic_long_read(&bdi->tot_write_bandwidth);
+
+	if (ret != wb_has_dirty_io(&bdi->wb)) {
+		const char *name = bdi->dev ? dev_name(bdi->dev) : "UNK";
+
+		pr_err("bdi_has_dirty_io: ERR %s tot_write_bw=%ld b_dirty=%d b_io=%d b_more_io=%d\n",
+		       name, atomic_long_read(&bdi->tot_write_bandwidth),
+		       !list_empty(&bdi->wb.b_dirty), !list_empty(&bdi->wb.b_io), !list_empty(&bdi->wb.b_more_io));
+		WARN_ON(1);
+	}
+
+	return ret;
 }
 
 static inline void __add_wb_stat(struct bdi_writeback *wb,

  parent reply	other threads:[~2015-08-13 23:24 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20150812101204.GE17933@dhcp-13-216.nay.redhat.com>
2015-08-13  0:44 ` generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Dave Chinner
2015-08-13 15:34   ` Tejun Heo
2015-08-13 19:16     ` Tejun Heo
2015-08-13 22:44   ` [PATCH block/for-linus] writeback: fix syncing of I_DIRTY_TIME inodes Tejun Heo
2015-08-14 11:14     ` Jan Kara
2015-08-14 15:14       ` Damien Wyart
2015-08-17 20:00         ` Tejun Heo
2015-08-18  5:33           ` Damien Wyart
2015-08-17 20:02       ` Tejun Heo
2015-08-18  9:16         ` Jan Kara
2015-08-18 17:47           ` Tejun Heo
2015-08-18 19:54             ` Tejun Heo
2015-08-18 21:56               ` Dave Chinner
2015-08-20  6:12                 ` Eryu Guan
2015-08-20 14:01                   ` Eryu Guan
2015-08-20 14:36                   ` Eryu Guan
2015-08-20 14:37                     ` Eryu Guan
2015-08-20 16:55                       ` Tejun Heo
2015-08-20 23:04                         ` Dave Chinner
2015-08-24 18:10                           ` Tejun Heo
2015-08-24 22:27                             ` Dave Chinner
2015-08-24 22:53                               ` Tejun Heo
2015-08-21 10:20                 ` Eryu Guan
2015-08-22  0:30                   ` Dave Chinner
2015-08-22  4:46                     ` Eryu Guan
2015-08-24  1:11                       ` Dave Chinner
2015-08-24  3:18                         ` Eryu Guan
2015-08-24  6:24                           ` Dave Chinner
2015-08-24  8:34                             ` Eryu Guan
2015-08-24  8:55                               ` Dave Chinner
2015-08-24  9:19                             ` Jan Kara
2015-08-24 14:51                               ` Tejun Heo
2015-08-24 17:11                                 ` Tejun Heo
2015-08-24 19:08                                   ` Jan Kara
2015-08-24 19:32                                     ` Tejun Heo
2015-08-24 21:09                                       ` Jan Kara
2015-08-24 21:45                                         ` Tejun Heo
2015-08-24 22:54                                           ` Tejun Heo
2015-08-24 22:57                                           ` Dave Chinner
2015-08-25 18:11     ` [PATCH v2 block/for-linus] writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes and always call wait_sb_inodes() Tejun Heo
2015-08-25 20:37       ` Jens Axboe
2015-08-26  9:00       ` Jan Kara
2015-08-13 23:24   ` Tejun Heo [this message]
2015-08-14  6:19     ` generic/04[89] fail on XFS due to change in writeback code [4.2-rc1 regression] Eryu Guan
2015-08-17 20:27       ` Tejun Heo
2015-08-18  3:57         ` Eryu Guan
2015-08-18  5:31           ` Eryu Guan

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=20150813232400.GH4496@mtj.duckdns.org \
    --to=tj@kernel.org \
    --cc=axboe@fb.com \
    --cc=david@fromorbit.com \
    --cc=eguan@redhat.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=xfs@oss.sgi.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).