Commit 7288185c authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: less aggressive low-memory log flushing



It turns out that for some workloads, the fix in commit b74cd55a
("gfs2: low-memory forced flush fixes") causes the number of forced log
flushes to increase to a degree that the overall filesystem performance
drops significantly.  Address that by forcing a log flush only when
gfs2_writepages cannot make any progress rather than when it cannot make
"enough" progress.

Fixes: b74cd55a ("gfs2: low-memory forced flush fixes")
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent bd67f177
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -158,6 +158,7 @@ static int gfs2_writepages(struct address_space *mapping,
			   struct writeback_control *wbc)
{
	struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping);
	long initial_nr_to_write = wbc->nr_to_write;
	struct iomap_writepage_ctx wpc = {
		.inode		= mapping->host,
		.wbc		= wbc,
@@ -166,13 +167,13 @@ static int gfs2_writepages(struct address_space *mapping,
	int ret;

	/*
	 * Even if we didn't write enough pages here, we might still be holding
	 * Even if we didn't write any pages here, we might still be holding
	 * dirty pages in the ail. We forcibly flush the ail because we don't
	 * want balance_dirty_pages() to loop indefinitely trying to write out
	 * pages held in the ail that it can't find.
	 */
	ret = iomap_writepages(&wpc);
	if (ret == 0 && wbc->nr_to_write > 0)
	if (ret == 0 && wbc->nr_to_write == initial_nr_to_write)
		set_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags);
	return ret;
}