smb3: show beginning time for per share stats
authorSteve French <stfrench@microsoft.com>
Sun, 28 Jan 2024 22:50:42 +0000 (16:50 -0600)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Jan 2024 22:50:42 +0000 (16:50 -0600)
In analyzing problems, one missing piece of debug data is when the
mount occurred.  A related problem is when collecting stats we don't
know the  period of time the stats covered, ie when this set of stats
for the tcon started to be collected.  To make debugging easier track
the stats begin time. Set it when the mount occurred at mount time,
and reset it to current time whenever stats are reset. For example,

...
1) \\localhost\test
SMBs: 14 since 2024-01-17 22:17:30 UTC
Bytes read: 0  Bytes written: 0
Open files: 0 total (local), 0 open on server
TreeConnects: 1 total 0 failed
TreeDisconnects: 0 total 0 failed
...
2) \\localhost\scratch
SMBs: 24 since 2024-01-17 22:16:04 UTC
Bytes read: 0  Bytes written: 0
Open files: 0 total (local), 0 open on server
TreeConnects: 1 total 0 failed
TreeDisconnects: 0 total 0 failed
...

Note the time "since ... UTC" is now displayed in /proc/fs/cifs/Stats
for each share that is mounted.

Suggested-by: Shyam Prasad N <sprasad@microsoft.com>
Reviewed-by: Bharath SM <bharathsm@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifs_debug.c
fs/cifs/cifsglob.h
fs/cifs/misc.c

index 0bd37f16e359b425a3d252aa7ad2fe36ad6a6ed9..ac37515e21744c7681e5cde696b8f912cbab91d5 100644 (file)
@@ -659,6 +659,7 @@ static ssize_t cifs_stats_proc_write(struct file *file,
                                        spin_lock(&tcon->stat_lock);
                                        tcon->bytes_read = 0;
                                        tcon->bytes_written = 0;
+                                       tcon->stats_from_time = ktime_get_real_seconds();
                                        spin_unlock(&tcon->stat_lock);
                                        if (server->ops->clear_stats)
                                                server->ops->clear_stats(tcon);
@@ -737,8 +738,9 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
                                seq_printf(m, "\n%d) %s", i, tcon->tree_name);
                                if (tcon->need_reconnect)
                                        seq_puts(m, "\tDISCONNECTED ");
-                               seq_printf(m, "\nSMBs: %d",
-                                          atomic_read(&tcon->num_smbs_sent));
+                               seq_printf(m, "\nSMBs: %d since %ptTs UTC",
+                                          atomic_read(&tcon->num_smbs_sent),
+                                          &tcon->stats_from_time);
                                if (server->ops->print_stats)
                                        server->ops->print_stats(m, tcon);
                        }
index 0d2349a36490cad41e5f5d7f26079059b3af0f7b..3fd6ef5f80b1f1629fa6a4c7b317c1ebb80796f6 100644 (file)
@@ -1210,6 +1210,7 @@ struct cifs_tcon {
        __u64    bytes_read;
        __u64    bytes_written;
        spinlock_t stat_lock;  /* protects the two fields above */
+       time64_t stats_from_time;
        FILE_SYSTEM_DEVICE_INFO fsDevInfo;
        FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
        FILE_SYSTEM_UNIX_INFO fsUnixInfo;
index cc91643bf4389820679eba91698638369e40c896..0096c30e6942a10a014615934980bd8842bc0d2a 100644 (file)
@@ -140,6 +140,7 @@ tcon_info_alloc(bool dir_leases_enabled)
        spin_lock_init(&ret_buf->stat_lock);
        atomic_set(&ret_buf->num_local_opens, 0);
        atomic_set(&ret_buf->num_remote_opens, 0);
+       ret_buf->stats_from_time = ktime_get_real_seconds();
 #ifdef CONFIG_CIFS_DFS_UPCALL
        INIT_LIST_HEAD(&ret_buf->dfs_ses_list);
 #endif