]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
netfs: Record contention stats for writeback lock
authorDavid Howells <dhowells@redhat.com>
Fri, 31 May 2024 14:48:29 +0000 (15:48 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 5 Sep 2024 09:00:41 +0000 (11:00 +0200)
Record statistics for contention upon the writeback serialisation lock that
prevents racing writeback calls from causing each other to interleave their
writebacks.  These can be viewed in /proc/fs/netfs/stats on the WbLock line,
with skip=N indicating the number of non-SYNC writebacks skipped and wait=N
indicating the number of SYNC writebacks that waited.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Jeff Layton <jlayton@kernel.org>
cc: Steve French <sfrench@samba.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Link: https://lore.kernel.org/r/20240814203850.2240469-5-dhowells@redhat.com/
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/netfs/internal.h
fs/netfs/stats.c
fs/netfs/write_issue.c

index 7773f3d855a9598f97ecc9b94842590aeded47b7..9e6e0e59d7e4caadde8ccaa1e012cbd7f0e26154 100644 (file)
@@ -117,6 +117,8 @@ extern atomic_t netfs_n_wh_upload_failed;
 extern atomic_t netfs_n_wh_write;
 extern atomic_t netfs_n_wh_write_done;
 extern atomic_t netfs_n_wh_write_failed;
+extern atomic_t netfs_n_wb_lock_skip;
+extern atomic_t netfs_n_wb_lock_wait;
 
 int netfs_stats_show(struct seq_file *m, void *v);
 
index 95ed2d2623a881eba3e12bb309681fe740df2938..5fe1c396e24f3293d71c301194b2afe2ee82b2a2 100644 (file)
@@ -39,6 +39,8 @@ atomic_t netfs_n_wh_upload_failed;
 atomic_t netfs_n_wh_write;
 atomic_t netfs_n_wh_write_done;
 atomic_t netfs_n_wh_write_failed;
+atomic_t netfs_n_wb_lock_skip;
+atomic_t netfs_n_wb_lock_wait;
 
 int netfs_stats_show(struct seq_file *m, void *v)
 {
@@ -78,6 +80,9 @@ int netfs_stats_show(struct seq_file *m, void *v)
                   atomic_read(&netfs_n_rh_rreq),
                   atomic_read(&netfs_n_rh_sreq),
                   atomic_read(&netfs_n_wh_wstream_conflict));
+       seq_printf(m, "WbLock : skip=%u wait=%u\n",
+                  atomic_read(&netfs_n_wb_lock_skip),
+                  atomic_read(&netfs_n_wb_lock_wait));
        return fscache_stats_show(m);
 }
 EXPORT_SYMBOL(netfs_stats_show);
index 3f7e37e50c7d02456af24ae7cbdc9429d6875580..44f35a0faaca14b765d4504bc7df118a8d90b777 100644 (file)
@@ -505,10 +505,14 @@ int netfs_writepages(struct address_space *mapping,
        struct folio *folio;
        int error = 0;
 
-       if (wbc->sync_mode == WB_SYNC_ALL)
+       if (!mutex_trylock(&ictx->wb_lock)) {
+               if (wbc->sync_mode == WB_SYNC_NONE) {
+                       netfs_stat(&netfs_n_wb_lock_skip);
+                       return 0;
+               }
+               netfs_stat(&netfs_n_wb_lock_wait);
                mutex_lock(&ictx->wb_lock);
-       else if (!mutex_trylock(&ictx->wb_lock))
-               return 0;
+       }
 
        /* Need the first folio to be able to set up the op. */
        folio = writeback_iter(mapping, wbc, NULL, &error);