Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfs: Add retry stat counters

Add stat counters to count the number of request and subrequest retries and
display them in /proc/fs/netfs/stats.

Signed-off-by: David Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/r/20250212222402.3618494-3-dhowells@redhat.com
cc: Jeff Layton <jlayton@kernel.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

David Howells and committed by
Christian Brauner
d01c495f 1d001396

+19
+4
fs/netfs/internal.h
··· 135 135 extern atomic_t netfs_n_rh_write_done; 136 136 extern atomic_t netfs_n_rh_write_failed; 137 137 extern atomic_t netfs_n_rh_write_zskip; 138 + extern atomic_t netfs_n_rh_retry_read_req; 139 + extern atomic_t netfs_n_rh_retry_read_subreq; 138 140 extern atomic_t netfs_n_wh_buffered_write; 139 141 extern atomic_t netfs_n_wh_writethrough; 140 142 extern atomic_t netfs_n_wh_dio_write; ··· 149 147 extern atomic_t netfs_n_wh_write; 150 148 extern atomic_t netfs_n_wh_write_done; 151 149 extern atomic_t netfs_n_wh_write_failed; 150 + extern atomic_t netfs_n_wh_retry_write_req; 151 + extern atomic_t netfs_n_wh_retry_write_subreq; 152 152 extern atomic_t netfs_n_wb_lock_skip; 153 153 extern atomic_t netfs_n_wb_lock_wait; 154 154 extern atomic_t netfs_n_folioq;
+3
fs/netfs/read_retry.c
··· 14 14 { 15 15 __clear_bit(NETFS_SREQ_MADE_PROGRESS, &subreq->flags); 16 16 __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); 17 + netfs_stat(&netfs_n_rh_retry_read_subreq); 17 18 subreq->rreq->netfs_ops->issue_read(subreq); 18 19 } 19 20 ··· 260 259 struct netfs_io_subrequest *subreq; 261 260 struct netfs_io_stream *stream = &rreq->io_streams[0]; 262 261 DEFINE_WAIT(myself); 262 + 263 + netfs_stat(&netfs_n_rh_retry_read_req); 263 264 264 265 set_bit(NETFS_RREQ_RETRYING, &rreq->flags); 265 266
+9
fs/netfs/stats.c
··· 29 29 atomic_t netfs_n_rh_write_done; 30 30 atomic_t netfs_n_rh_write_failed; 31 31 atomic_t netfs_n_rh_write_zskip; 32 + atomic_t netfs_n_rh_retry_read_req; 33 + atomic_t netfs_n_rh_retry_read_subreq; 32 34 atomic_t netfs_n_wh_buffered_write; 33 35 atomic_t netfs_n_wh_writethrough; 34 36 atomic_t netfs_n_wh_dio_write; ··· 43 41 atomic_t netfs_n_wh_write; 44 42 atomic_t netfs_n_wh_write_done; 45 43 atomic_t netfs_n_wh_write_failed; 44 + atomic_t netfs_n_wh_retry_write_req; 45 + atomic_t netfs_n_wh_retry_write_subreq; 46 46 atomic_t netfs_n_wb_lock_skip; 47 47 atomic_t netfs_n_wb_lock_wait; 48 48 atomic_t netfs_n_folioq; ··· 85 81 atomic_read(&netfs_n_wh_write), 86 82 atomic_read(&netfs_n_wh_write_done), 87 83 atomic_read(&netfs_n_wh_write_failed)); 84 + seq_printf(m, "Retries: rq=%u rs=%u wq=%u ws=%u\n", 85 + atomic_read(&netfs_n_rh_retry_read_req), 86 + atomic_read(&netfs_n_rh_retry_read_subreq), 87 + atomic_read(&netfs_n_wh_retry_write_req), 88 + atomic_read(&netfs_n_wh_retry_write_subreq)); 88 89 seq_printf(m, "Objs : rr=%u sr=%u foq=%u wsc=%u\n", 89 90 atomic_read(&netfs_n_rh_rreq), 90 91 atomic_read(&netfs_n_rh_sreq),
+1
fs/netfs/write_issue.c
··· 253 253 subreq->retry_count++; 254 254 __clear_bit(NETFS_SREQ_MADE_PROGRESS, &subreq->flags); 255 255 __set_bit(NETFS_SREQ_IN_PROGRESS, &subreq->flags); 256 + netfs_stat(&netfs_n_wh_retry_write_subreq); 256 257 netfs_do_issue_write(stream, subreq); 257 258 } 258 259
+2
fs/netfs/write_retry.c
··· 203 203 struct netfs_io_stream *stream; 204 204 int s; 205 205 206 + netfs_stat(&netfs_n_wh_retry_write_req); 207 + 206 208 /* Wait for all outstanding I/O to quiesce before performing retries as 207 209 * we may need to renegotiate the I/O sizes. 208 210 */