]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gfs2: less aggressive low-memory log flushing
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 6 Mar 2026 17:05:48 +0000 (18:05 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 23 Mar 2026 19:55:28 +0000 (20:55 +0100)
It turns out that for some workloads, the fix in commit b74cd55aa9a9d
("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: b74cd55aa9a9d ("gfs2: low-memory forced flush fixes")
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/aops.c

index e79ad087512a0599faeae598c406158fbedfa356..6a6ded7a61d208c8223732674d7a8dcd1af9c83b 100644 (file)
@@ -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;
 }