smb3: display max smb3 requests in flight at any one time
authorSteve French <stfrench@microsoft.com>
Tue, 10 Sep 2019 03:57:11 +0000 (22:57 -0500)
committerSteve French <stfrench@microsoft.com>
Mon, 16 Sep 2019 16:43:38 +0000 (11:43 -0500)
Displayed in /proc/fs/cifs/Stats once for each
socket we are connected to.

This allows us to find out what the maximum number of
requests that had been in flight (at any one time). Note that
/proc/fs/cifs/Stats can be reset if you want to look for
maximum over a small period of time.

Sample output (immediately after mount):

Resources in use
CIFS Session: 1
Share (unique mount targets): 2
SMB Request/Response Buffer: 1 Pool size: 5
SMB Small Req/Resp Buffer: 1 Pool size: 30
Operations (MIDs): 0

0 session 0 share reconnects
Total vfs operations: 5 maximum at one time: 2

Max requests in flight: 2
1) \\localhost\scratch
SMBs: 18
Bytes read: 0  Bytes written: 0
...

Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
fs/cifs/cifs_debug.c
fs/cifs/cifsglob.h
fs/cifs/connect.c
fs/cifs/smb2ops.c
fs/cifs/transport.c

index a38d796f5ffeee838d912fd3201a0fa83d424d2c..0b4eee3bed6600e9ff22c855fc3e3d1b37a9f045 100644 (file)
@@ -452,6 +452,7 @@ static ssize_t cifs_stats_proc_write(struct file *file,
                list_for_each(tmp1, &cifs_tcp_ses_list) {
                        server = list_entry(tmp1, struct TCP_Server_Info,
                                            tcp_ses_list);
+                       server->max_in_flight = 0;
 #ifdef CONFIG_CIFS_STATS2
                        for (i = 0; i < NUMBER_OF_SMB2_COMMANDS; i++) {
                                atomic_set(&server->num_cmds[i], 0);
@@ -526,6 +527,7 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
        list_for_each(tmp1, &cifs_tcp_ses_list) {
                server = list_entry(tmp1, struct TCP_Server_Info,
                                    tcp_ses_list);
+               seq_printf(m, "\nMax requests in flight: %d", server->max_in_flight);
 #ifdef CONFIG_CIFS_STATS2
                seq_puts(m, "\nTotal time spent processing by command. Time ");
                seq_printf(m, "units are jiffies (%d per second)\n", HZ);
index 6987fbc5a24a40c9993a278bfe30b91a08db5ac1..ef219991321746b80f82aa284a847097a61cab46 100644 (file)
@@ -677,6 +677,7 @@ struct TCP_Server_Info {
        unsigned int credits;  /* send no more requests at once */
        unsigned int max_credits; /* can override large 32000 default at mnt */
        unsigned int in_flight;  /* number of requests on the wire to server */
+       unsigned int max_in_flight; /* max number of requests that were on wire */
        spinlock_t req_lock;  /* protect the two values above */
        struct mutex srv_mutex;
        struct task_struct *tsk;
index e70112d67b0e7459a9c16a409fe4020015628172..df1ccb581828c0d43e24315e60648102c32abcc3 100644 (file)
@@ -2728,6 +2728,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
        tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay;
        tcp_ses->rdma = volume_info->rdma;
        tcp_ses->in_flight = 0;
+       tcp_ses->max_in_flight = 0;
        tcp_ses->credits = 1;
        init_waitqueue_head(&tcp_ses->response_q);
        init_waitqueue_head(&tcp_ses->request_q);
index 72b3e39d7f4f773d17bfe228afc69e9ecbeddeda..9b74149b471fed0cef567b3d4af35d34f2f9349a 100644 (file)
@@ -203,6 +203,8 @@ smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
                        credits->instance = server->reconnect_instance;
                        server->credits -= credits->value;
                        server->in_flight++;
+                       if (server->in_flight > server->max_in_flight)
+                               server->max_in_flight = server->in_flight;
                        break;
                }
        }
index 4fccb90492e90ed3bd8ba7834171d9e3852d4d9a..308ad0f495e10d513f9219e92d8ade62558337f6 100644 (file)
@@ -532,6 +532,8 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
        if ((flags & CIFS_TIMEOUT_MASK) == CIFS_NON_BLOCKING) {
                /* oplock breaks must not be held up */
                server->in_flight++;
+               if (server->in_flight > server->max_in_flight)
+                       server->max_in_flight = server->in_flight;
                *credits -= 1;
                *instance = server->reconnect_instance;
                spin_unlock(&server->req_lock);
@@ -608,6 +610,8 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
                        if ((flags & CIFS_TIMEOUT_MASK) != CIFS_BLOCKING_OP) {
                                *credits -= num_credits;
                                server->in_flight += num_credits;
+                               if (server->in_flight > server->max_in_flight)
+                                       server->max_in_flight = server->in_flight;
                                *instance = server->reconnect_instance;
                        }
                        spin_unlock(&server->req_lock);