Skip to content

Commit

Permalink
netfs: Record contention stats for writeback lock
Browse files Browse the repository at this point in the history
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/ # v2
Signed-off-by: Christian Brauner <brauner@kernel.org>
  • Loading branch information
David Howells authored and Christian Brauner committed Sep 5, 2024
1 parent 43ebbf9 commit ef966d7
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 3 deletions.
2 changes: 2 additions & 0 deletions fs/netfs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
5 changes: 5 additions & 0 deletions fs/netfs/stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
10 changes: 7 additions & 3 deletions fs/netfs/write_issue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit ef966d7

Please sign in to comment.